diff --git a/API.md b/API.md index 60236b70..344414b7 100644 --- a/API.md +++ b/API.md @@ -1,36 +1,90 @@ # API ## Groups -MineClone 2 makes very extensive use of groups. Making sure your items and objects are members of the correct group is a good and easy way to ensure compability without using any function calls. +MineClone 2 makes very extensive use of groups. Making sure your items and objects have the correct group memberships is very important. Groups are explained in `GROUPS.md`. -## APIs for adding simple things -You can add simple things by calling functions in the various MineClone 2 mods. +## Mod naming convention +Mods mods in MineClone 2 follow a simple naming convention: Mods with the prefix “`mcl_`” are specific to MineClone 2, although they may be based on an existing standalone. Mods which lack this prefix are *usually* verbatim copies of a standalone mod. Some modifications may still have been applied, but the APIs are held compatible. -* Fences and fence gates: See `mods/ITEMS/mcl_fences/API.md`. -* Walls: See `mods/ITEMS/mcl_walls/API.md` +## Adding items +### Special fields -### Undocumented APIs -You can also add stuff for the following thins, but the APIs are currently undocumented. These mods are very similar to Minetest Game. +Items can have these fields: +* `_mcl_generate_description(itemstack)`: Required for any items which manipulate their + description in any way. This function takes an itemstack of its own type and must set + the proper advanced description for this itemstack. If you don't do this, anvils will + fail at properly restoring the description when their custom name gets cleared at an + anvil. + See `mcl_banners` for an example. -* Doors: See `mods/ITEMS/doors` -* Stairs and slabs: See `mods/ITEMS/stairs` and `mods/ITEMS/mcstair` -* Beds: See `mods/ITEMS/beds` -* Buckets (for new liquids): See `mods/ITEMS/bucket` -* Panes (like glass panes and iron bars): See `mods/ITEMS/xpanes` +All nodes can have these fields: -WARNING! These 5 mods may be renamed or changed in future releases, and compability could be broken. +* `_mcl_hardness`: Hardness of the block, ranges from 0 to infinity (represented by -1). Determines digging times. Default: 0 +* `_mcl_blast_resistance`: How well this block blocks and resists explosions. Default: 0 +* `_mcl_falling_node_alternative`: If set to an itemstring, the node will turn into this node before it starts to fall. +* `_mcl_after_falling(pos)`: Called after a falling node finished falling and turned into a node. + +Use the `mcl_sounds` mod for the sounds. + +## APIs +A lot of things are possible by using one of the APIs in the mods. Note that not all APIs are documented yet, but it is planned. The following APIs should be more or less stable but keep in mind that MineClone 2 is still unfinished. All directory names are relative to `mods/` + +### Items +* Doors: `ITEMS/mcl_doors` +* Fences and fence gates: `ITEMS/mcl_fences` +* Stairs and slabs: `ITEM/mcl_stairs` +* Walls: `ITEMS/mcl_walls` +* Beds: `ITEMS/mcl_beds` +* Buckets: `ITEMS/mcl_buckets` +* Dispenser support: `ITEMS/REDSTONE/mcl_dispensers` ## Mobs -This mod uses Mobs Redo [`mobs`] by TenPlus1, a very powerful mod for adding mods of various kinds. -There are minor modificiations for MineClone 2 compability and some items have been removed or moved to other mods, but the API is identical to the original. +* Mobs: `ENTITIES/mcl_mods` + +MineClone 2 uses its own mobs framework, called “Mobs Redo: MineClone 2 Edition” or “MRM” for short. +This is a fork of Mobs Redo [`mobs`] by TenPlus1. + You can add your own mobs, spawn eggs and spawning rules with this mod. -API documnetation is included in `mods/ENTITIES/mobs/api.txt`. +API documnetation is included in `ENTITIES/mcl_mobs/api.txt`. -Note that mobs in MineClone 2 are still very experimental, everything about mobs may change radically at any time! +This mod includes modificiations from the original Mobs Redo. Some items have been removed or moved to other mods. +The API is mostly identical, but a few features have been added. Compability is not really a goal, +but function and attribute names of Mobs Redo 1.41 are kept. +If you have code for a mod which works fine under Mobs Redo, it should be easy to make it work in MineClone 2, +chances are good that it works out of the box. -## Other APIs -* Statbars / HUD bars: See `mods/HUD/hudbars` -* Hunger: See `mods/PLAYER/mcl_hunger/API.md` +### Help +* Item help texts: `HELP/doc/doc_items` +* Low-level help entry and category framework: `HELP/doc/doc` +* Support for lookup tool (required for all entities): `HELP/doc/doc_identifier` -## Other things of interest -Mods found in `mods/CORE` contain important core APIs and utility functions, used throughout the subgame. +### HUD +* Statbars: `HUD/hudbars` + +### Utility APIs +* Change player physics: `PLAYER/playerphysics` +* Select random treasures: `CORE/mcl_loot` +* Get flowing direction of liquids: `CORE/flowlib` +* `on_walk_over` callback for nodes: `CORE/walkover` +* Get node names close to player (to reduce constant querying): `PLAYER/mcl_playerinfo` + +### Unstable APIs +The following APIs may be subject to change in future. You could already use these APIs but there will probably be breaking changes in the future, or the API is not as fleshed out as it should be. Use at your own risk! + +* Panes (like glass panes and iron bars): `ITEMS/xpanes` +* `_on_ignite` callback: `ITEMS/mcl_fire` +* Farming: `ITEMS/mcl_farming` +* Anything related to redstone: Don't touch (yet) +* Any other mod not explicitly mentioned above + +### Planned APIs + +* Flowers +* Saplings and trees +* Custom banner patterns +* Custom dimensions +* Custom portals +* Music discs +* Dispenser and dropper support +* Proper sky and weather APIs +* Explosion API diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a2d37927..0fdda27f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ Wow, thank you! :-) But first, some things to note: MineClone 2's development target is to make a free software clone of Minecraft, -***version 1.11*** (later: 1.12), ***PC edition***. +***version 1.11***, ***PC edition***. MineClone 2 is maintained by one person. Namely, Wuzzy. You can find me, Wuzzy, in the Minetest forums (forums.minetest.net), in IRC in the #minetest @@ -14,7 +14,7 @@ channel on irc.freenode.net. And finally, you can send e-mails to There is **no** guarantee I will accept anything from anybody. -By sending me patches or asking me to include your changes in this subgame, +By sending me patches or asking me to include your changes in this game, you agree that they fall under the terms of the LGPLv2.1, which basically means they will become part of a free software. @@ -26,8 +26,8 @@ For small and medium changes: * Fork the repository * Do your change in a new branch -* Upload the repository somewhere where it can be accessed from the Internet -* Ask me to pull in your changes (and briefly say what you're changed) +* Upload the repository somewhere where it can be accessed from the Internet and + notify me For small changes, sending me a patch is also good. @@ -35,7 +35,7 @@ For big changes: Same as above, but consider notifying me first to avoid duplicate work and possible tears of rejection. ;-) ## Quality remarks -Again: There is ***no*** guarantee I will accept anything from anything. +Again: There is ***no*** guarantee I will accept anything from anybody. But I will gladly take in code from others when I feel it saves me work in the long run. @@ -64,10 +64,10 @@ Depending on what you add, the chances for inclusion vary: ## Coding style guide * Indentations should reflect the code flow -* Use tabs, not spaces for indentation +* Use tabs, not spaces for indentation (tab size = 8) * Never use `minetest.env` ## Reporting bugs Report all bugs and missing Minecraft features here: - + diff --git a/GROUPS.md b/GROUPS.md index e2137d43..1ac531b8 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -1,5 +1,5 @@ ## Groups -This document explains all the groups used in this subgame. +This document explains all the groups used in this game. ### Special groups @@ -29,14 +29,21 @@ Please read to learn how digging times ### Groups for interactions +* `crush_after_fall=1`: For falling nodes. These will crush whatever they hit after falling, not dropping as an item +* `falling_node_damage=1`: For falling nodes. Hurts any objects it hits while falling. Damage is based on anvils * `dig_by_water=1`: Blocks with this group will drop when they are near flowing water * `destroy_by_lava_flow=1`: Blocks with this group will be destroyed by flowing lava * `dig_by_piston=1`: Blocks which will drop as an item when pushed by a piston. They also cannot be pulled by sticky pistons * `cultivatable=2`: Block will be turned into Farmland by using a hoe on it * `cultivatable=1`: Block will be turned into Dirt by using a hoe on it -* `flammable`: Block helps spreading fire and gets destroyed by nearby fire (rating doesn't matter) +* `flammable`: Block spreads fire + * `flammable>0`: Gets destroyed by fire + * `flammable=-1` Does not get destroyed by fire +* `fire_encouragement`: How quickly this block catches fire +* `fire_flammability`: How fast the block will burn away * `spreading_dirt_type=1`: A dirt-type block with a cover (e.g. grass) which may spread to neighbor dirt blocks -* `dirtifies_below_solid=1`: This node turns into dirt immediately when a solid node is placed on top +* `dirtifies_below_solid=1`: This node turns into dirt immediately when a solid or dirtifier node is placed on top +* `dirtifier=1`: This node turns nodes the above group into dirt when placed above * `non_mycelium_plant=1`: A plant which can't grow on mycelium. Placing it on mycelium fails and if mycelium spreads below it, it uproots * `soil=1`: Saplings and other small plants can grow on it * `soil_sapling=2`: Soil for saplings. Intended to be natural soil. All saplings will grow on this @@ -48,6 +55,21 @@ Please read to learn how digging times * `destroys_items=1`: If an item happens to be *inside* this node, the item will be destroyed * `no_eat_delay=1`: Only for foodstuffs. When eating this, all eating delays are ignored. * `can_eat_when_full=1`: Only for foodstuffs. This item can be eaten when the user has a full hunger bar +* `attached_node_facedir=1`: Like `attached_node`, but for facedir nodes +* `cauldron`: Cauldron. 1: Empty. 2-4: Water height +* `anvil`: Anvil. 1: No damage. 2-3: Higher damage levels +* `no_rename=1`: Item cannot be renamed by anvil +* `comparator_signal=X`: If set, this node outputs a constant (!) comparator signal output of strength X. +* `piston=X`: Piston (main body) (1 = normal, 2 = sticky) +* `piston_pusher=X`: Piston pusher (1 = normal, 2 = sticky) +* `hopper=X`: Hopper (1 = downwards, 2 = sideways) +* `portal=1`: Portal (node that teleports players and things by standing inside) +* `end_portal_frame=X`: End portal frame (1 = no eye, 2 = with eye) +* `coral=X`: Coral (any type) (1 = alive, 2 = dead) +* `coral_plant=X`: Coral in the "plant" shape (1 = alive, 2 = dead) +* `coral_fan=X`: Coral fan (1 = alive, 2 = dead) +* `coral_block=X`: Coral block (1 = alive, 2 = dead) +* `coral_species=X`: Specifies the species of a coral; equal X means equal species #### Footnotes @@ -58,8 +80,10 @@ Please read to learn how digging times ### Groups (mostly) used for crafting recipes * `sand=1`: Sand (any color) -* `sandstone=1`: (Yellow) sandstone and related nodes (chiseled and the like) (only full blocks) -* `redsandstone=1`: Red sandstone and related nodes (chiseled and the like) (only full blocks) +* `sandstone=1`: Sandstone (any color) and related nodes (chiseled and the like) (only full blocks) +* `normal_sandstone=1`: “Normal” (yellow) sandstone and related nodes (chiseled and the like) (only full blocks) +* `red_sandstone=1`: Red sandstone and related nodes (chiseled and the like) (only full blocks) +* `hardened_clay=1`: Terracotta (any color) * `quartz_block=1`: Quartz Block and variants (chiseled, pillar, etc.) (only full blocks) * `stonebrick=1`: Stone Bricks and related nodes (only full blocks) * `shulker_box=1`: Block is a shulker box @@ -71,6 +95,7 @@ Please read to learn how digging times * `wool=1`: Wool (only full blocks) * `carpet=1:` (Wool) carpet * `stick=1`: Stick +* `water_bucket=1`: Bucket containing a liquid of group “water” ### Material groups @@ -89,10 +114,12 @@ These groups are used mostly for informational purposes * `solid=1`: Solid full-cube block (automatically assigned) * `opaque=1`: Opaque block (automatically assigned) -* `not_solid=1`: Block is sold (only assign this group for nodes which are automatically detected as “solid” in error +* `not_solid=1`: Block is not solid (only assign this group for nodes which are automatically detected as “solid” in error +* `not_opaque=1`: Block is not opaque (only assign this group for nodes which are automatically detected as “opaque” in error * `fire=1`: Fire * `water=1`: Water * `lava=1`: Lava +* `top_snow=X`: Top snow with X layers (1-8) * `torch`: Torch or torch-like node * `torch=1`: Torch on floor * `torch=2`: Torch at wall @@ -109,6 +136,7 @@ These groups are used mostly for informational purposes * `flower_pot=2`: Flower pot with a plant or flower * `flower=1`: Flower * `place_flowerlike=1`: Node has placement rules like that of a flower +* `place_flowerlike=2`: Node has placement rules like tall grass * `cake`: Cake (rating = slices left) * `book=1`: Book * `pane=1`: Node is a “pane”-like node glass pane or iron bars @@ -140,12 +168,27 @@ These groups are used mostly for informational purposes * `container=5`: Left part of a 2-part horizontal connected container. Both parts have a `"main"` inventory list. Both inventories are considered to belong together. This is used for large chests. * `container=6`: Same as above, but for the right part. + * `container=7`: Has inventory list "`main`", no movement allowed * `container=1`: Other/unspecified container type * `spawn_egg=1`: Spawn egg +* `pressure_plate=1`: Pressure plate (off) +* `pressure_plate=2`: Wooden pressure (on) +* `button=1`: Button (off) +* `button=2`: Button (on) +* `redstone_torch=1`: Redstone Torch (lit) +* `redstone_torch=2`: Redstone Torch (unlit) + * `plant=1`: Plant or part of a plant * `double_plant`: Part of a double-sized plant. 1 = lower part, 2 = upper part +* `pickaxe=1`: Pickaxe +* `shovel=1`: Shovel +* `axe=1`: Axe +* `sword=1`: Sword +* `hoe=1`: Hoe (farming tool) +* `shears=1`: Shears + * `weapon=1`: Item is primarily (!) a weapon * `tool=1`: Item is primarily (!) a tool * `craftitem=1`: Item is primarily (!) used for crafting diff --git a/MISSING_ENGINE_FEATURES.md b/MISSING_ENGINE_FEATURES.md index c3bb8a28..313c535f 100644 --- a/MISSING_ENGINE_FEATURES.md +++ b/MISSING_ENGINE_FEATURES.md @@ -8,8 +8,6 @@ For these features, no easy Lua workaround could be found. ### Lua API #### Tools/wielded item -- Allow **much** faster liquid flowing ([#2810](https://github.com/minetest/minetest/issues/2810)) - - “Lock” hotbar for a brief time after using an item, making it impossible to switch item or to attach/mine/build until the delay is over (For eating with delay) - Tool charging: Holding down the mouse and releasing it, applying a “power level” (For bow and arrows, more charge = higher arrow range) ([issue 5212](https://github.com/minetest/minetest/issues/5212)) - [Dual Wielding](http://minecraft.gamepedia.com/Dual_wield) @@ -21,7 +19,6 @@ For these features, no easy Lua workaround could be found. ## Interface - Inventory: Hold down right mouse button while holding an item stack to drop items into the slots as you move the mouse. Makes crafting MUCH faster -- **Much** more informative item tooltips - Sneak+Leftclick on crafting output crafts as many items as possible and immediately puts it into the player inventory ([issue 5211](https://github.com/minetest/minetest/issues/5211)) - Sneak+click on inventory slot should be able to put items into additional “fallback inventories” if the first inventory is full. Required for large chests - Sneak+click puts items in different inventories depending on the item type (maybe group-based)? Required for sneak-clicking to armor slots @@ -39,8 +36,5 @@ For these features, a workaround (or hack ;-)) by using Lua is theoretically pos - Set damage frequency of `damage_per_second`. In Minecraft many things damage players every half-second rather than every second - Possible to damage players directly when they are with the head inside. This allows to add Minecraft-like suffocation -#### Crafting -- Require tools to be intact in crafting - #### Nice-to-haye - Utility function to rotate pillar-like nodes, requiring only 3 possible orientations (X, Y, Z). Basically this is `minetest.rotate_node` but with less orientations; the purpur pillar would mess up if a mirrored rotation would be possible. This is already implemented in MCL2, See `mcl_util` for more infos diff --git a/README.md b/README.md index c3d70118..c1879598 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,21 @@ -# MineClone 2 -An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. -Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. +# MineClone 2 (Forkhausen Edition) +An unofficial Minecraft-like game for Minetest. Forked from MineClone2 developed by Wuzzy +and contributors which is a fork of MineClone by davedevils. Not developed or endorsed by Mojang AB. -Version: 0.26.0 +Version: 0.65.2 + +## Differences to MineClone 2 +So far some minor fixes that I also sent upstream to Wuzzy for inclusion and some yet unmerged features from others: + +* ~~Fix a crash when refueling powered minecarts [issue #683](https://git.minetest.land/Wuzzy/MineClone2/issues/683)~~ +* Pumpkins grow without a face and can be carved [issue #682](https://git.minetest.land/Wuzzy/MineClone2/issues/682) +* Fix acceleration of powered minecarts and powered rails not summing up (by 2mac) + [issue #658](https://git.minetest.land/Wuzzy/MineClone2/issues/658). +* Mobs take damage from magma block if susceptible to fire damage (inspiraton from [minetest_npc](https://forum.minetest.net/viewtopic.php?p=371969#p371969)) +* ~~When mobs are trying to escape dangerous situations (e.g. standing on lava), make more efforts to check if destination is safe.~~ +* Carpets can be added to tamed Llamas. TODO: Replace textures because community-provided PixelPerfection textures of carpets are a bit **too** close to the original MC textures. +* ~~Fix crash in new explosion API [issue #689](https://git.minetest.land/Wuzzy/MineClone2/issues/689)~~ +* Fix crash when igniting a creeper with flint and steel ([fix by nelkat](https://forum.minetest.net/viewtopic.php?p=372836#p372836)) ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore @@ -27,7 +40,6 @@ Or you can play in “creative mode” in which you can build almost anything in ## How to play (quick start) ### Getting started -* **Use the world generator “v6”!** * **Punch a tree** trunk until it breaks and collect wood * Place the **wood into the 2×2 grid** (your “crafting grid” in your inventory menu and craft 4 wood planks * Place the 4 wood planks in a 2×2 shape in the crafting grid to **make a crafting table** @@ -56,25 +68,32 @@ Or you can play in “creative mode” in which you can build almost anything in More help about the gameplay, blocks items and much more can be found from inside the game. You can access the help from your inventory menu. -### Special blocks -The following blocks are interesting for Creative Mode and for adventure +### Special items +The following items are interesting for Creative Mode and for adventure map builders. They can not be obtained in-game or in the creative inventory. * Barrier: `mcl_core:barrier` -* Command Block: `mesecons_commandblock:commandblock_off` -* Monster Spawner (WIP): `mcl_mobspawners:spawner` -* Huge mushroom blocks: See `mods/ITEMS/mcl_mushrooms/README.md` Use the `/giveme` chat command to obtain them. See the in-game help for an explanation. +#### Incomplete items +These items do not work yet, but you can get them with `/giveme` for testing: + +* Minecart with Chest: `mcl_minecarts:chest_minecart` +* Minecart with Furnace: `mcl_minecarts:furnace_minecart` +* Minecart with Hopper: `mcl_minecarts:hopper_minecart` +* Minecart with Command Block: `mcl_minecarts:command_block_minecart` + ## Installation -This game requires [Minetest](http://minetest.net) 0.4.16 (or later) to run, -so you need to install Minetest first. Only stable versions of Minetest are -officially supported. There is no support whatsoever for running MineClone 2 -in development versions of Minetest. -To install MineClone 2, move this directory into the “games” directory of -your Minetest data directory. Consult the help of Minetest to learn more. +This game requires [Minetest](http://minetest.net) to run (version 5.0.0 or +later). So you need to install Minetest first. Only stable versions of Minetest +are officially supported. +There is no support for running MineClone 2 in development versions of Minetest. + +To install MineClone 2 (if you haven't already), move this directory into the +“games” directory of your Minetest data directory. Consult the help of +Minetest to learn more. ## Project description The main goal of **MineClone 2** is to be a clone of Minecraft and to be released as free software. @@ -89,22 +108,26 @@ The main goal of **MineClone 2** is to be a clone of Minecraft and to be release ## Completion status This game is currently in **alpha** stage. -It is playable, but very unfinished, many bugs are to be expected. +It is playable, but unfinished, many bugs are to be expected. Backwards-compability is *not* guaranteed, updating your world might cause small and big bugs (such as “missing node” errors or even crashes). The following main features are available: -* Tools, weapons and armor +* Tools, weapons +* Armor (unbalanced) * Crafting system: 2×2 grid, crafting table (3×3 grid), furnace, including a crafting guide * Chests, large chests, ender chests, shulker boxes +* Furnaces, hoppers * Hunger * Most monsters and animals * All ores from Minecraft * Most blocks in the overworld * Water and lava * Weather -* Redstone circuits (partially): Redstone ore, redstone, redstone repeater, levers, buttons, redstone blocks, redstone lamps +* 28 biomes +* The Nether, a fiery underworld in another dimension +* Redstone circuits (partially) * Minecarts (partial) * Boats * Fire @@ -123,24 +146,22 @@ The following main features are available: * Inventory menu * Creative inventory * Farming -* Bookshelves (deco only) * Writable books * A few server commands * And more! The following features are incomplete: -* Trees, biomes, generated structures +* Generated structures (especially villages) * NPCs * Some monsters and animals -* Some redstone-related things -* The Nether +* Redstone-related things * The End * Enchanting * Experience * Status effects * Brewing, potions, tipped arrows -* Anvil +* Special minecarts * A couple of non-trivial blocks and items Bonus features (not found in Minecraft 1.11): @@ -148,24 +169,33 @@ Bonus features (not found in Minecraft 1.11): * Built-in crafting guide which shows you crafting and smelting recipes * In-game help system containing extensive help about gameplay basics, blocks, items and more * Temporary crafting recipes. They only exist to make some otherwise unaccessible items available when you're not in creative mode. These recipes will be removed as development goes on an more features become available +* Saplings in chests in mapgen v6 +* Fully moddable (thanks to Minetest's powerful Lua API) +* New blocks and items: + * Lookup tool, shows you the help for whatever it touches + * More slabs and stairs + * Nether Brick Fence Gate + * Red Nether Brick Fence + * Red Nether Brick Fence Gate Technical differences from Minecraft: * Height limit of ca. 31000 blocks (much higher than in Minecraft) * Horizontal world size is ca. 62000×62000 blocks (much smaller than in Minecraft, but it is still very large) -* Still very, very incomplete and buggy +* Still very incomplete and buggy * Blocks, items, enemies and other features are missing * A few items have slightly different names to make them easier to distinguish * Different music for jukebox * Different textures (Pixel Perfection) * Different sounds (various sources) * Different engine (Minetest) -* Free software (“free” as in freedom *and* free beer) + +… and finally, MineClone 2 is free software (“free” as in “freedom”)! ## Reporting bugs Please report all bugs and missing Minecraft features here: - + ## Other readme files @@ -179,16 +209,26 @@ There are so many people to list (sorry). Check out the respective mod directori ### Coding * [Wuzzy](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=3082): Main programmer of most mods -* daredevils: Creator of MineClone on which MineClone 2 is based on +* davedevils: Creator of MineClone on which MineClone 2 is based on +* [ex-bart](https://github.com/ex-bart): Redstone comparators +* [Rootyjr](https://github.com/Rootyjr): Fishing rod and bugfixes +* [aligator](https://github.com/aligator): Improvement of doors +* [ryvnf](https://github.com/ryvnf): Explosion mechanics * Lots of other people: TO BE WRITTEN (see mod directories for details) -### Textures +### Graphics * [XSSheep](http://www.minecraftforum.net/members/XSSheep): Main author; creator of the Pixel Perfection resource pack of Minecraft 1.11 * [Wuzzy](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=3082): Main menu imagery and various edits and additions of texture pack * [kingoscargames](https://github.com/kingoscargames): Various edits and additions of existing textures * [leorockway](https://github.com/leorockway): Some edits of mob textures * [xMrVizzy](https://minecraft.curseforge.com/members/xMrVizzy): Glazed terracotta (textures are subject to be replaced later) -* Other authors: GUI images, +* yutyo : MineClone 2 logo +* Other authors: GUI images + +### Translations +* Wuzzy: German +* Rocher Laurent : French +* wuniversales: Spanish ### Models * [22i](https://github.com/22i): Creator of all models @@ -199,7 +239,7 @@ Various sources. See the respective mod directories for details. ### Special thanks -* daredevils for starting MineClone, the original version of this game +* davedevils for starting MineClone, the original version of this game * celeron55 for creating Minetest * Minetest's modding community for providing a huge selection of mods, some of which ended up in MineClone 2 * Jordach for the jukebox music compilation from Big Freaking Dig @@ -207,6 +247,7 @@ Various sources. See the respective mod directories for details. * Notch and Jeb for being the major forces behind Minecraft * XSSheep for creating the Pixel Perfection resource pack * [22i](https://github.com/22i) for providing great models and support +* [maikerumine](http://github.com/maikerumine) for kicking off mobs and biomes ## Info for programmers You find interesting and useful infos in `API.md`. @@ -216,18 +257,20 @@ This project is currently mostly a one-person project. This is a fan game, not developed or endorsed by Mojang AB. Copying is an act of love. Please copy and share! <3 -But, oh well, if you insist, here is the legalese for you: +Here's the detailed legalese for those who need it: ### License of source code MineClone 2 is a clean-room implementation of Minecraft and licensed under the -GNU LGPL v2.1 (Wuzzy, daredevils and countless others) (see `LICENSE.txt`). +GNU LGPL v2.1 (Wuzzy, davedevils and countless others) (see `LICENSE.txt`). MineClone 2 is a direct continuation of the discontinued MineClone -project by daredevils which fell under the same license. +project by davedevils which fell under the same license. Mods credit: See `README.txt` or `README.md` in each mod directory for information about other authors. +For mods that do not have such a file, the license is the source code license +of MineClone 2 and the author is Wuzzy. ### License of media (textures and sounds) No non-free licenses are used anywhere. @@ -235,18 +278,14 @@ No non-free licenses are used anywhere. The textures, unless otherwise noted, are based on the Pixel Perfection resource pack for Minecraft 1.11, authored by XSSheep. Most textures are verbatim copies, while some textures have been changed or redone from scratch. +The glazed terracotta textures have been created by (MysticTempest)[https://github.com/MysticTempest]. Source: License: [CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/) -MineClone 2 is currently in the processs of changing all the textures. -The textures for the glazed terracotta come from Faithful Vanilla. -(authored by Vattic, xMrVizzy and many others). -Source: - -License of all main menu images: WTFPL +The main menu images are release under: [CC0](https://creativecommons.org/publicdomain/zero/1.0/) All other files, unless mentioned otherwise, fall under: -Attribution-ShareAlike 3.0 Unported (CC BY-SA 4.0) +Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ See README.txt in each mod directory for detailed information about other authors. diff --git a/description.txt b/description.txt new file mode 100644 index 00000000..805bdb21 --- /dev/null +++ b/description.txt @@ -0,0 +1 @@ +A survival sandbox game. Survive, gather, hunt, mine, build, explore, and do much more. Faithful clone of Minecraft 1.11. This is a work in progress! Expect bugs! diff --git a/game.conf b/game.conf index 799ed84b..db735770 100644 --- a/game.conf +++ b/game.conf @@ -1 +1,2 @@ name = MineClone 2 +description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more. diff --git a/menu/footer.png b/menu/footer.png index af5e960d..9207b26d 100644 Binary files a/menu/footer.png and b/menu/footer.png differ diff --git a/menu/header.png b/menu/header.png index 36ece0e4..5d34dd6a 100644 Binary files a/menu/header.png and b/menu/header.png differ diff --git a/menu/icon.png b/menu/icon.png index 4db6979f..e479dfff 100644 Binary files a/menu/icon.png and b/menu/icon.png differ diff --git a/menu/overlay.2.png b/menu/overlay.2.png index b8f532bc..ad1de325 100644 Binary files a/menu/overlay.2.png and b/menu/overlay.2.png differ diff --git a/menu/overlay.3.png b/menu/overlay.3.png index 3a573a1a..39084847 100644 Binary files a/menu/overlay.3.png and b/menu/overlay.3.png differ diff --git a/menu/overlay.4.png b/menu/overlay.4.png index 6450b90b..2480f2c5 100644 Binary files a/menu/overlay.4.png and b/menu/overlay.4.png differ diff --git a/minetest.conf b/minetest.conf index 36cd4e6d..6b6a4d67 100644 --- a/minetest.conf +++ b/minetest.conf @@ -1,14 +1,16 @@ -# This is a game specify minetest.conf file, do not edit +# This is a game specific minetest.conf file, do not edit +# Basic game rules time_speed = 72 +# Player physics movement_acceleration_default = 2.4 movement_acceleration_air = 1.2 #movement_acceleration_fast = 10 movement_speed_walk = 4.317 movement_speed_crouch = 1.295 -movement_speed_fast = 10.89 +movement_speed_fast = 25.0 movement_speed_jump = 6.6 movement_speed_climb = 2.35 @@ -16,8 +18,16 @@ movement_speed_climb = 2.35 movement_liquid_fluidity = 1.13 movement_liquid_fluidity_smooth = 0.5 -movement_liquid_sink = 31 +movement_liquid_sink = 23 movement_gravity = 10.4 +# Mapgen stuff + +# altitude_chill and altitude_dry doesn't go well together with MCL2 biomes +# which already include "snowed" variants as you go higher. +# humid_rivers would cause the MushroomIsland biome to appear frequently around rivers. +mgvalleys_spflags = noaltitude_chill,noaltitude_dry,nohumid_rivers,vary_river_depth + +# MCL2-specific stuff keepInventory = false diff --git a/mods/CORE/_mcl_autogroup/README.txt b/mods/CORE/_mcl_autogroup/README.txt new file mode 100644 index 00000000..b7068a0b --- /dev/null +++ b/mods/CORE/_mcl_autogroup/README.txt @@ -0,0 +1,10 @@ +This mod automatically adds groups to items based on item metadata. + +Specifically, this mod has 2 purposes: +1) Automatically adding the group “solid” for blocks considered “solid” in Minecraft. +2) Generating digging time group for all nodes based on node metadata (it's complicated) + +See init.lua for more infos. + +The leading underscore in the name “_mcl_autogroup” was added to force Minetest to load this mod as late as possible. +As of 0.4.16, Minetest loads mods in reverse alphabetical order. diff --git a/mods/CORE/mcl_autogroup/depends.txt b/mods/CORE/_mcl_autogroup/depends.txt similarity index 100% rename from mods/CORE/mcl_autogroup/depends.txt rename to mods/CORE/_mcl_autogroup/depends.txt diff --git a/mods/CORE/_mcl_autogroup/description.txt b/mods/CORE/_mcl_autogroup/description.txt new file mode 100644 index 00000000..dbc4f318 --- /dev/null +++ b/mods/CORE/_mcl_autogroup/description.txt @@ -0,0 +1 @@ +MineClone 2 core mod which automatically adds groups to all items. Very important for digging times. diff --git a/mods/CORE/mcl_autogroup/init.lua b/mods/CORE/_mcl_autogroup/init.lua similarity index 93% rename from mods/CORE/mcl_autogroup/init.lua rename to mods/CORE/_mcl_autogroup/init.lua index f6d0e259..16fa14c5 100644 --- a/mods/CORE/mcl_autogroup/init.lua +++ b/mods/CORE/_mcl_autogroup/init.lua @@ -1,11 +1,3 @@ ---[[ This mod automatically adds groups to items based on item metadata. - -Specifically, this mod has 2 purposes: -1) Automatically adding the group “solid” for blocks considered “solid” in Minecraft. -2) Generating digging time group for all nodes based on node metadata (it's complicated) - -]] - --[[ Mining times. Yeah, mining times … Alright, this is going to be FUN! This mod does include a HACK to make 100% sure the digging times of all tools match Minecraft's perfectly. @@ -82,7 +74,8 @@ local overwrite = function() groups_changed = true end -- Automatically assign the “opaque” group for opaque nodes - if not (ndef.paramtype == "light" or ndef.sunlight_propagates) then + if (not (ndef.paramtype == "light" or ndef.sunlight_propagates)) and + (ndef.groups.not_opaque == 0 or ndef.groups.not_opaque == nil) then newgroups.opaque = 1 groups_changed = true end diff --git a/mods/CORE/_mcl_autogroup/mod.conf b/mods/CORE/_mcl_autogroup/mod.conf new file mode 100644 index 00000000..fb171b76 --- /dev/null +++ b/mods/CORE/_mcl_autogroup/mod.conf @@ -0,0 +1 @@ +name = _mcl_autogroup diff --git a/mods/CORE/biomeinfo/API.md b/mods/CORE/biomeinfo/API.md new file mode 100644 index 00000000..7713bf2a --- /dev/null +++ b/mods/CORE/biomeinfo/API.md @@ -0,0 +1,42 @@ +# Biome Info API +This document explains the API of this mod. + +## v6 mapgen functions +These are functions for the v6 mapgen only. + +Use these functions only in worlds in which the v6 mapgen is used. +If you use these in any other mapgen, bad things might happen. + +### `biomeinfo.get_v6_humidity(pos)` +Get the biome humidity at pos (for v6 mapgen). + +### `biomeinfo.get_v6_heat(pos)` +Get the biome heat/temperature at pos (for v6 mapgen). + +### `biomeinfo.get_v6_biome(pos)` +Get the v6 biome at pos. +Returns a string, which is the unique biome name. + +Note: This function currently ignores the `biomeblend` v6 mapgen flag, +it just pretends this setting is disabled. +This is normally not a problem, but at areas where biomes blend, +the result is not perfectly accurate and just an estimate. + +### `biomeinfo.get_active_v6_biomes()` +Returns a table containing the names of all v6 biomes that are actively +used in the current world, e.g. those that have been activated +by the use of the mapgen v6 flags (`mgv6_spflags`). + +### `biomeinfo.all_v6_biomes` +This is a table containing all v6 biomes (as strings), even those that +might not be used in the current world. + +### v6 biome names + +These are the biome names used in this mod: + +* Normal +* Desert +* Jungle +* Tundra +* Taiga diff --git a/mods/CORE/biomeinfo/README.md b/mods/CORE/biomeinfo/README.md new file mode 100644 index 00000000..a99d1dbc --- /dev/null +++ b/mods/CORE/biomeinfo/README.md @@ -0,0 +1,11 @@ +# Biome Info API [`biomeinfo`] +This is an API mod for mod developers to add a couple of missing +biome-related functions. +Currently, this mod only adds v6-related functions. +Most importantly, you can get the heat, humidity and biome in the v6 mapgen. + +See `API.md` for the API documentation. + +Current version: 1.0.3 (this is a [SemVer](https://semver.org/)) + +License: MIT License diff --git a/mods/CORE/biomeinfo/init.lua b/mods/CORE/biomeinfo/init.lua new file mode 100644 index 00000000..5013647e --- /dev/null +++ b/mods/CORE/biomeinfo/init.lua @@ -0,0 +1,211 @@ +biomeinfo = {} + +-- Copied from mapgen_v6.h +local MGV6_FREQ_HOT = 0.4 +local MGV6_FREQ_SNOW = -0.4 +local MGV6_FREQ_TAIGA = 0.5 +local MGV6_FREQ_JUNGLE = 0.5 + +-- Biome types +local BT_NORMAL = "Normal" +local BT_TUNDRA = "Tundra" +local BT_TAIGA = "Taiga" +local BT_DESERT = "Desert" +local BT_JUNGLE = "Jungle" + +-- Get mapgen settings + +local seed = tonumber(minetest.get_mapgen_setting("seed")) or 0 + +local mgv6_perlin_biome, mgv6_perlin_humidity, mgv6_np_biome + +-- v6 default noiseparams are hardcoded here because Minetest doesn't give us those +local mgv6_np_biome_default = { + offset = 0, + scale = 1, + spread = { x = 500, y = 500, z = 500}, + seed = 9130, + octaves = 3, + persistence = 0.50, + lacunarity = 2.0, + flags = "eased", +} +local mgv6_np_humidity_default = { + offset = 0.5, + scale = 0.5, + spread = { x = 500, y = 500, z = 500}, + seed = 72384, + octaves = 3, + persistence = 0.50, + lacunarity = 2.0, + flags = "eased", +} + +local v6_flags_str = minetest.get_mapgen_setting("mgv6_spflags") +if v6_flags_str == nil then + v6_flags_str = "" +end +local v6_flags = string.split(v6_flags_str) +local v6_use_snow_biomes = true +local v6_use_jungles = true +-- TODO: Implement biome blend. +-- Currently we pretend biome blend is disabled. +-- This just makes the calculations inaccurate near biome boundaries, +-- but should be fine otherwise. +local v6_use_biome_blend = false +for f=1, #v6_flags do + local flag = v6_flags[f]:trim() + if flag == "nosnowbiomes" then + v6_use_snow_biomes = false + end + if flag == "snowbiomes" then + v6_use_snow_biomes = true + end + if flag == "nojungles" then + v6_use_jungles = false + end + if flag == "jungles" then + v6_use_jungles = true + end + if flag == "nobiomeblend" then + v6_use_biome_blend = false + end +-- TODO +-- if flag == "biomeblend" then +-- v6_use_biome_blend = true +-- end +end +-- Force-enable jungles when snowbiomes flag is set +if v6_use_snow_biomes then + v6_use_jungles = true +end +local v6_freq_desert = tonumber(minetest.get_mapgen_setting("mgv6_freq_desert") or 0.45) + +local NOISE_MAGIC_X = 1619 +local NOISE_MAGIC_Y = 31337 +local NOISE_MAGIC_Z = 52591 +local NOISE_MAGIC_SEED = 1013 +local noise2d = function(x, y, seed) + -- TODO: implement noise2d function for biome blend + return 0 +--[[ + local n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y + + NOISE_MAGIC_SEED * seed) & 0x7fffffff; + n = (n >> 13) ^ n; + n = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; + return 1.0 - n / 0x40000000; +]] +end + +biomeinfo.all_v6_biomes = { + BT_NORMAL, + BT_DESERT, + BT_JUNGLE, + BT_TUNDRA, + BT_TAIGA +} + +local function init_perlins() + if not mgv6_perlin_biome then + mgv6_np_biome = minetest.get_mapgen_setting_noiseparams("mgv6_np_biome") + if not mgv6_np_biome then + mgv6_np_biome = mgv6_np_biome_default + minetest.log("action", "[biomeinfo] Using hardcoded mgv6_np_biome default") + end + mgv6_perlin_biome = minetest.get_perlin(mgv6_np_biome) + end + if not mgv6_perlin_humidity then + local np_humidity = minetest.get_mapgen_setting_noiseparams("mgv6_np_humidity") + if not np_humidity then + np_humidity = mgv6_np_humidity_default + minetest.log("action", "[biomeinfo] Using hardcoded mgv6_np_humidity default") + end + mgv6_perlin_humidity = minetest.get_perlin(np_humidity) + end +end + +function biomeinfo.get_active_v6_biomes() + local biomes = { BT_NORMAL, BT_DESERT } + if v6_use_jungles then + table.insert(biomes, BT_JUNGLE) + end + if v6_use_snow_biomes then + table.insert(biomes, BT_TUNDRA) + table.insert(biomes, BT_TAIGA) + end + return biomes +end + +function biomeinfo.get_v6_heat(pos) + init_perlins() + if not mgv6_perlin_biome then + return nil + end + local bpos = vector.floor(pos) + -- The temperature noise needs a special offset (see calculateNoise in mapgen_v6.cpp) + return mgv6_perlin_biome:get_2d({x=bpos.x + mgv6_np_biome.spread.x*0.6, y=bpos.z + mgv6_np_biome.spread.z*0.2}) +end + +function biomeinfo.get_v6_humidity(pos) + init_perlins() + if not mgv6_perlin_humidity then + return nil + end + local bpos = vector.floor(pos) + return mgv6_perlin_humidity:get_2d({x=bpos.x, y=bpos.z}) +end + +-- Returns the v6 biome at pos. +-- Returns a string representing the biome name. +function biomeinfo.get_v6_biome(pos) + init_perlins() + local bpos = vector.floor(pos) + -- Based on the algorithm MapgenV6::getBiome in mapgen_v6.cpp + + local pos2d = {x=bpos.x, y=bpos.z} + if not mgv6_perlin_biome or not mgv6_perlin_humidity then + return "???" + end + local d = biomeinfo.get_v6_heat(bpos) + local h = biomeinfo.get_v6_humidity(bpos) + + if (v6_use_snow_biomes) then + local blend + if v6_use_biome_blend then + blend = noise2d(pos2d.x, pos2d.y, seed) / 40 + else + blend = 0 + end + + if (d > MGV6_FREQ_HOT + blend) then + if (h > MGV6_FREQ_JUNGLE + blend) then + return BT_JUNGLE + end + return BT_DESERT + end + if (d < MGV6_FREQ_SNOW + blend) then + if (h > MGV6_FREQ_TAIGA + blend) then + return BT_TAIGA + end + return BT_TUNDRA + end + return BT_NORMAL + end + + if (d > v6_freq_desert) then + return BT_DESERT + end + + if ((v6_use_biome_blend) and (d > v6_freq_desert - 0.10) and + ((noise2d(pos2d.x, pos2d.y, seed) + 1.0) > (v6_freq_desert - d) * 20.0)) then + return BT_DESERT + end + + if ((v6_use_jungles) and (h > 0.75)) then + return BT_JUNGLE + end + + return BT_NORMAL +end + + diff --git a/mods/CORE/biomeinfo/mod.conf b/mods/CORE/biomeinfo/mod.conf new file mode 100644 index 00000000..95be561a --- /dev/null +++ b/mods/CORE/biomeinfo/mod.conf @@ -0,0 +1,2 @@ +name = biomeinfo +description = Simple API to get data about biomes. diff --git a/mods/CORE/controls/LICENSE b/mods/CORE/controls/LICENSE new file mode 100644 index 00000000..8000a6fa --- /dev/null +++ b/mods/CORE/controls/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/CORE/controls/README.md b/mods/CORE/controls/README.md new file mode 100644 index 00000000..9243d552 --- /dev/null +++ b/mods/CORE/controls/README.md @@ -0,0 +1,2 @@ +Controls framework by Arcelmi. +https://github.com/Arcelmi/minetest-controls diff --git a/mods/CORE/controls/init.lua b/mods/CORE/controls/init.lua new file mode 100644 index 00000000..d2820eef --- /dev/null +++ b/mods/CORE/controls/init.lua @@ -0,0 +1,63 @@ +controls = {} +controls.players = {} + +controls.registered_on_press = {} +function controls.register_on_press(func) + controls.registered_on_press[#controls.registered_on_press+1] = func +end + +controls.registered_on_release = {} +function controls.register_on_release(func) + controls.registered_on_release[#controls.registered_on_release+1] = func +end + +controls.registered_on_hold = {} +function controls.register_on_hold(func) + controls.registered_on_hold[#controls.registered_on_hold+1]=func +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + controls.players[name] = { + jump={false}, + right={false}, + left={false}, + LMB={false}, + RMB={false}, + sneak={false}, + aux1={false}, + down={false}, + up={false} + } +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + controls.players[name] = nil +end) + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local player_name = player:get_player_name() + local player_controls = player:get_player_control() + for cname, cbool in pairs(player_controls) do + --Press a key + if cbool==true and controls.players[player_name][cname][1]==false then + for _, func in pairs(controls.registered_on_press) do + func(player, cname) + end + controls.players[player_name][cname] = {true, os.clock()} + elseif cbool==true and controls.players[player_name][cname][1]==true then + for _, func in pairs(controls.registered_on_hold) do + func(player, cname, os.clock()-controls.players[player_name][cname][2]) + end + --Release a key + elseif cbool==false and controls.players[player_name][cname][1]==true then + for _, func in pairs(controls.registered_on_release) do + func(player, cname, os.clock()-controls.players[player_name][cname][2]) + end + controls.players[player_name][cname] = {false} + end + end + end +end) diff --git a/mods/CORE/controls/mod.conf b/mods/CORE/controls/mod.conf new file mode 100644 index 00000000..8fab3aa2 --- /dev/null +++ b/mods/CORE/controls/mod.conf @@ -0,0 +1 @@ +name=controls diff --git a/mods/CORE/mcl_attached/description.txt b/mods/CORE/mcl_attached/description.txt new file mode 100644 index 00000000..3532db31 --- /dev/null +++ b/mods/CORE/mcl_attached/description.txt @@ -0,0 +1 @@ +Adds additional ways for nodes to be attached. diff --git a/mods/CORE/mcl_attached/init.lua b/mods/CORE/mcl_attached/init.lua new file mode 100644 index 00000000..146cb225 --- /dev/null +++ b/mods/CORE/mcl_attached/init.lua @@ -0,0 +1,26 @@ +local original_function = minetest.check_single_for_falling + +minetest.check_single_for_falling = function(pos) + local ret_o = original_function(pos) + + local ret = false + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "attached_node_facedir") ~= 0 then + local dir = minetest.facedir_to_dir(node.param2) + if dir then + local cpos = vector.add(pos, dir) + local cnode = minetest.get_node(cpos) + if minetest.get_item_group(cnode.name, "solid") == 0 then + minetest.remove_node(pos) + local drops = minetest.get_node_drops(node.name, "") + for dr=1, #drops do + minetest.add_item(pos, drops[dr]) + end + ret = true + end + end + end + + return ret_o or ret +end + diff --git a/mods/CORE/mcl_autogroup/mod.conf b/mods/CORE/mcl_autogroup/mod.conf deleted file mode 100644 index ec779665..00000000 --- a/mods/CORE/mcl_autogroup/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = mcl_autogroup diff --git a/mods/CORE/mcl_explosions/init.lua b/mods/CORE/mcl_explosions/init.lua new file mode 100644 index 00000000..bd697208 --- /dev/null +++ b/mods/CORE/mcl_explosions/init.lua @@ -0,0 +1,383 @@ +--[[ +Explosion API mod for Minetest (adapted to MineClone 2) + +This mod is based on the Minetest explosion API mod, but has been changed +to have the same explosion mechanics as Minecraft and work with MineClone. +The computation-intensive parts of the mod has been optimized to allow for +larger explosions and faster world updating. + +This mod was created by Elias Astrom and is released +under the LGPLv2.1 license. +--]] + +mcl_explosions = {} + +local creative_mode = minetest.settings:get_bool("creative_mode") +local mod_death_messages = minetest.get_modpath("mcl_death_messages") ~= nil +local mod_fire = minetest.get_modpath("mcl_fire") ~= nil +local CONTENT_FIRE = minetest.get_content_id("mcl_fire:fire") + +local S = minetest.get_translator("mcl_explosions") + +-- Saved sphere explosion shapes for various radiuses +local sphere_shapes = {} + +-- Saved node definitions in table using cid-keys for faster look-up. +local node_blastres = {} +local node_on_blast = {} +local node_walkable = {} + +-- The step length for the rays (Minecraft uses 0.3) +local STEP_LENGTH = 0.3 + +-- How many rays to compute entity exposure to explosion +local N_EXPOSURE_RAYS = 16 + +minetest.register_on_mods_loaded(function() + -- Store blast resistance values by content ids to improve performance. + for name, def in pairs(minetest.registered_nodes) do + node_blastres[minetest.get_content_id(name)] = def._mcl_blast_resistance or 0 + node_on_blast[minetest.get_content_id(name)] = def.on_blast + node_walkable[minetest.get_content_id(name)] = def.walkable + end +end) + +-- Compute the rays which make up a sphere with radius. Returns a list of rays +-- which can be used to trace explosions. This function is not efficient +-- (especially for larger radiuses), so the generated rays for various radiuses +-- should be cached and reused. +-- +-- Should be possible to improve by using a midpoint circle algorithm multiple +-- times to create the sphere, currently uses more of a brute-force approach. +local function compute_sphere_rays(radius) + local rays = {} + local sphere = {} + + for i=1, 2 do + for y = -radius, radius do + for z = -radius, radius do + for x = -radius, 0, 1 do + local d = x * x + y * y + z * z + if d <= radius * radius then + local pos = { x = x, y = y, z = z } + sphere[minetest.hash_node_position(pos)] = pos + break + end + end + end + end + end + + for i=1,2 do + for x = -radius, radius do + for z = -radius, radius do + for y = -radius, 0, 1 do + local d = x * x + y * y + z * z + if d <= radius * radius then + local pos = { x = x, y = y, z = z } + sphere[minetest.hash_node_position(pos)] = pos + break + end + end + end + end + end + + for i=1,2 do + for x = -radius, radius do + for y = -radius, radius do + for z = -radius, 0, 1 do + local d = x * x + y * y + z * z + if d <= radius * radius then + local pos = { x = x, y = y, z = z } + sphere[minetest.hash_node_position(pos)] = pos + break + end + end + end + end + end + + for _, pos in pairs(sphere) do + rays[#rays + 1] = vector.normalize(pos) + end + + return rays +end + +-- Add particles from explosion +-- +-- Parameters: +-- pos - The position of the explosion +-- radius - The radius of the explosion +local function add_particles(pos, radius) + minetest.add_particlespawner({ + amount = 64, + time = 0.125, + minpos = pos, + maxpos = pos, + minvel = {x = -radius, y = -radius, z = -radius}, + maxvel = {x = radius, y = radius, z = radius}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 0.5, + maxexptime = 1.0, + minsize = radius * 0.5, + maxsize = radius * 1.0, + texture = "tnt_smoke.png", + }) +end + +-- Traces the rays of an explosion, and updates the environment. +-- +-- Parameters: +-- pos - Where the rays in the explosion should start from +-- strength - The strength of each ray +-- raydirs - The directions for each ray +-- radius - The maximum distance each ray will go +-- drop_chance - The chance that destroyed nodes will drop their items +-- fire - If true, 1/3 of destroyed nodes become fire +-- puncher - object that punches other objects (optional) +-- +-- Note that this function has been optimized, it contains code which has been +-- inlined to avoid function calls and unnecessary table creation. This was +-- measured to give a significant performance increase. +local function trace_explode(pos, strength, raydirs, radius, drop_chance, fire, puncher) + local vm = minetest.get_voxel_manip() + + local emin, emax = vm:read_from_map(vector.subtract(pos, radius), + vector.add(pos, radius)) + local emin_x = emin.x + local emin_y = emin.y + local emin_z = emin.z + + local ystride = (emax.x - emin_x + 1) + local zstride = ystride * (emax.y - emin_y + 1) + local pos_x = pos.x + local pos_y = pos.y + local pos_z = pos.z + + local area = VoxelArea:new { + MinEdge = emin, + MaxEdge = emax + } + local data = vm:get_data() + local destroy = {} + + -- Trace rays for environment destruction + for i = 1, #raydirs do + local rpos_x = pos.x + local rpos_y = pos.y + local rpos_z = pos.z + local rdir_x = raydirs[i].x + local rdir_y = raydirs[i].y + local rdir_z = raydirs[i].z + local rstr = (0.7 + math.random() * 0.6) * strength + + for r = 0, math.ceil(radius * (1.0 / STEP_LENGTH)) do + local npos_x = math.floor(rpos_x + 0.5) + local npos_y = math.floor(rpos_y + 0.5) + local npos_z = math.floor(rpos_z + 0.5) + local idx = (npos_z - emin_z) * zstride + (npos_y - emin_y) * ystride + + npos_x - emin_x + 1 + + local cid = data[idx] + local br = node_blastres[cid] + local hash = (npos_z + 32768) * 65536 * 65536 + + (npos_y + 32768) * 65536 + + npos_x + 32768 + + rpos_x = rpos_x + STEP_LENGTH * rdir_x + rpos_y = rpos_y + STEP_LENGTH * rdir_y + rpos_z = rpos_z + STEP_LENGTH * rdir_z + + rstr = rstr - 0.75 * STEP_LENGTH - (br + 0.3) * STEP_LENGTH + + if rstr <= 0 then + break + end + + if cid ~= minetest.CONTENT_AIR then + destroy[hash] = idx + end + end + end + + -- Entities in radius of explosion + local punch_radius = 2 * strength + local objs = minetest.get_objects_inside_radius(pos, punch_radius) + + -- Trace rays for entity damage + for _, obj in pairs(objs) do + local ent = obj:get_luaentity() + + -- Ignore items to lower lag + if obj:is_player() or (ent and ent.name ~= '__builtin.item') then + local opos = obj:get_pos() + local collisionbox = nil + + if obj:is_player() then + collisionbox = { -0.3, 0.0, -0.3, 0.3, 1.77, 0.3 } + elseif ent.name then + local def = minetest.registered_entities[ent.name] + collisionbox = def.collisionbox + end + + if collisionbox then + -- Create rays from random points in the collision box + local x1 = collisionbox[1] * 2 + local y1 = collisionbox[2] * 2 + local z1 = collisionbox[3] * 2 + local x2 = collisionbox[4] * 2 + local y2 = collisionbox[5] * 2 + local z2 = collisionbox[6] * 2 + local x_len = math.abs(x2 - x1) + local y_len = math.abs(y2 - y1) + local z_len = math.abs(z2 - z1) + + -- Move object position to the center of its bounding box + opos.x = opos.x + x1 + x2 + opos.y = opos.y + y1 + y2 + opos.z = opos.z + z1 + z2 + + -- Count number of rays from collision box which are unobstructed + local count = N_EXPOSURE_RAYS + + for i = 1, N_EXPOSURE_RAYS do + local rpos_x = opos.x + math.random() * x_len - x_len / 2 + local rpos_y = opos.y + math.random() * y_len - y_len / 2 + local rpos_z = opos.z + math.random() * z_len - z_len / 2 + local rdir_x = pos.x - rpos_x + local rdir_y = pos.y - rpos_y + local rdir_z = pos.z - rpos_z + local rdir_len = math.hypot(rdir_x, math.hypot(rdir_y, rdir_z)) + rdir_x = rdir_x / rdir_len + rdir_y = rdir_y / rdir_len + rdir_z = rdir_z / rdir_len + + for i=0, rdir_len / STEP_LENGTH do + rpos_x = rpos_x + rdir_x * STEP_LENGTH + rpos_y = rpos_y + rdir_y * STEP_LENGTH + rpos_z = rpos_z + rdir_z * STEP_LENGTH + local npos_x = math.floor(rpos_x + 0.5) + local npos_y = math.floor(rpos_y + 0.5) + local npos_z = math.floor(rpos_z + 0.5) + local idx = (npos_z - emin_z) * zstride + (npos_y - emin_y) * ystride + + npos_x - emin_x + 1 + + + local cid = data[idx] + local walkable = node_walkable[cid] + + if walkable then + count = count - 1 + break + end + end + end + + -- Punch entity with damage depending on explosion exposure and + -- distance to explosion + local exposure = count / N_EXPOSURE_RAYS + local punch_vec = vector.subtract(opos, pos) + local punch_dir = vector.normalize(punch_vec) + local impact = (1 - vector.length(punch_vec) / punch_radius) * exposure + if impact < 0 then + impact = 0 + end + local damage = math.floor((impact * impact + impact) * 7 * strength + 1) + if mod_death_messages and obj:is_player() then + mcl_death_messages.player_damage(obj, S("@1 was caught in an explosion.", obj:get_player_name())) + end + local source = puncher + if not source then + source = obj + end + obj:punch(source, 10, { damage_groups = { full_punch_interval = 1, + fleshy = damage, knockback = impact * 20.0 } }, punch_dir) + + if obj:is_player() then + obj:add_player_velocity(vector.multiply(punch_dir, impact * 20)) + elseif ent.tnt_knockback then + obj:add_velocity(vector.multiply(punch_dir, impact * 20)) + end + end + end + end + + -- Remove destroyed blocks and drop items + for hash, idx in pairs(destroy) do + local do_drop = not creative_mode and math.random() <= drop_chance + local on_blast = node_on_blast[data[idx]] + local remove = true + + if do_drop or on_blast ~= nil then + local npos = minetest.get_position_from_hash(hash) + if on_blast ~= nil then + remove = on_blast(npos, 1.0) + else + local name = minetest.get_name_from_content_id(data[idx]) + local drop = minetest.get_node_drops(name, "") + + for _, item in ipairs(drop) do + if type(item) ~= "string" then + item = item:get_name() .. item:get_count() + end + minetest.add_item(npos, item) + end + end + end + if remove then + if mod_fire and fire and math.random(1, 3) == 1 then + data[idx] = CONTENT_FIRE + else + data[idx] = minetest.CONTENT_AIR + end + end + end + + -- Log explosion + minetest.log('action', 'Explosion at ' .. minetest.pos_to_string(pos) .. + ' with strength ' .. strength .. ' and radius ' .. radius) + + -- Update environment + vm:set_data(data) + vm:write_to_map(data) + vm:update_liquids() +end + +-- Create an explosion with strength at pos. +-- +-- Parameters: +-- pos - The position where the explosion originates from +-- strength - The blast strength of the explosion (a TNT explosion uses 4) +-- info - Table containing information about explosion. +-- puncher - object that is reported as source of punches/damage (optional) +-- +-- Values in info: +-- drop_chance - If specified becomes the drop chance of all nodes in the +-- explosion (defaults to 1.0 / strength) +-- no_sound - If true then the explosion will not play a sound +-- no_particle - If true then the explosion will not create particles +-- fire - If true, 1/3 nodes become fire (default: false) +function mcl_explosions.explode(pos, strength, info, puncher) + -- The maximum blast radius (in the air) + local radius = math.ceil(1.3 * strength / (0.3 * 0.75) * 0.3) + + if not sphere_shapes[radius] then + sphere_shapes[radius] = compute_sphere_rays(radius) + end + local shape = sphere_shapes[radius] + + trace_explode(pos, strength, shape, radius, (info and info.drop_chance) or 1 / strength, info.fire == true, puncher) + + if not (info and info.no_sound) then + add_particles(pos, radius) + end + if not (info and info.no_particle) then + minetest.sound_play("tnt_explode", { + pos = pos, gain = 1.0, + max_hear_distance = strength * 16 + }, true) + end +end diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr new file mode 100644 index 00000000..4abbc64b --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.=@1 wurde Opfer einer Explosion. diff --git a/mods/CORE/mcl_explosions/locale/template.txt b/mods/CORE/mcl_explosions/locale/template.txt new file mode 100644 index 00000000..6a9348dd --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.= diff --git a/mods/CORE/mcl_explosions/mod.conf b/mods/CORE/mcl_explosions/mod.conf new file mode 100644 index 00000000..7ce4b678 --- /dev/null +++ b/mods/CORE/mcl_explosions/mod.conf @@ -0,0 +1,3 @@ +name = mcl_explosions +description = A common API to create explosions. +optional_depends = mcl_fire diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index ebf106e1..ddcf1cd6 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -1,17 +1,31 @@ -- Some global variables (don't overwrite them!) mcl_vars = {} ---- GUI / inventory menu colors +--- GUI / inventory menu settings mcl_vars.gui_slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]" -mcl_vars.gui_bg = "bgcolor[#080808BB;true]" -mcl_vars.gui_bg_img = "" +-- nonbg is added as formspec prepend in mcl_formspec_prepend +mcl_vars.gui_nonbg = mcl_vars.gui_slots .. + "style_type[image_button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]".. + "style_type[button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]".. + "style_type[field;textcolor=#323232]".. + "style_type[label;textcolor=#323232]".. + "style_type[textarea;textcolor=#323232]".. + "style_type[checkbox;textcolor=#323232]" -mcl_vars.inventory_header = mcl_vars.gui_slots .. mcl_vars.gui_bg +-- Background stuff must be manually added by mods (no formspec prepend) +mcl_vars.gui_bg_color = "bgcolor[#00000000]" +mcl_vars.gui_bg_img = "background9[1,1;1,1;mcl_base_textures_background9.png;true;7]" + +-- Legacy +mcl_vars.inventory_header = "" -- Mapgen variables local mg_name = minetest.get_mapgen_setting("mg_name") local minecraft_height_limit = 256 -if mg_name ~= "flat" then +local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" + +if not superflat then + -- Normal mode --[[ Realm stacking (h is for height) - Overworld (h>=256) - Void (h>=1000) @@ -32,39 +46,57 @@ if mg_name ~= "flat" then mcl_vars.mg_bedrock_is_rough = true else + -- Classic superflat local ground = minetest.get_mapgen_setting("mgflat_ground_level") ground = tonumber(ground) if not ground then ground = 8 end - -- 1 perfectly flat bedrock layer - if minetest.get_mapgen_setting("mcl_superflat_classic") == "false" then - mcl_vars.mg_overworld_min = -30912 - else - mcl_vars.mg_overworld_min = ground - 3 - end + mcl_vars.mg_overworld_min = ground - 3 mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min mcl_vars.mg_lava = false + mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min mcl_vars.mg_bedrock_is_rough = false end mcl_vars.mg_overworld_max = 31000 --- The Nether -mcl_vars.mg_nether_min = -29000 +-- The Nether (around Y = -29000) +mcl_vars.mg_nether_min = -29067 -- Carefully chosen to be at a mapchunk border mcl_vars.mg_nether_max = mcl_vars.mg_nether_min + 128 mcl_vars.mg_bedrock_nether_bottom_min = mcl_vars.mg_nether_min -mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + 4 mcl_vars.mg_bedrock_nether_top_max = mcl_vars.mg_nether_max -mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - 4 -mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 31 +if not superflat then + mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + 4 + mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - 4 + mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 31 +else + -- Thin bedrock in classic superflat mapgen + mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max + mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 2 +end +if mg_name == "flat" then + if superflat then + mcl_vars.mg_flat_nether_floor = mcl_vars.mg_bedrock_nether_bottom_max + 4 + mcl_vars.mg_flat_nether_ceiling = mcl_vars.mg_bedrock_nether_bottom_max + 52 + else + mcl_vars.mg_flat_nether_floor = mcl_vars.mg_lava_nether_max + 4 + mcl_vars.mg_flat_nether_ceiling = mcl_vars.mg_lava_nether_max + 52 + end +end --- The End -mcl_vars.mg_end_min = mcl_vars.mg_nether_max + 2000 +-- The End (surface at ca. Y = -27000) +mcl_vars.mg_end_min = -27073 -- Carefully chosen to be at a mapchunk border mcl_vars.mg_end_max_official = mcl_vars.mg_end_min + minecraft_height_limit mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000 +mcl_vars.mg_end_platform_pos = { x = 100, y = mcl_vars.mg_end_min + 74, z = 0 } + +-- Realm barrier used to safely separate the End from the void below the Overworld +mcl_vars.mg_realm_barrier_overworld_end_max = mcl_vars.mg_end_max +mcl_vars.mg_realm_barrier_overworld_end_min = mcl_vars.mg_end_max - 11 -- Set default stack sizes minetest.nodedef_default.stack_max = 64 diff --git a/mods/CORE/mcl_loot/init.lua b/mods/CORE/mcl_loot/init.lua index f7eff3f6..35c72539 100644 --- a/mods/CORE/mcl_loot/init.lua +++ b/mods/CORE/mcl_loot/init.lua @@ -98,3 +98,54 @@ function mcl_loot.get_multi_loot(multi_loot_definitions, pr) end return items end + +--[[ +Returns a table of length `max_slot` and all natural numbers between 1 and `max_slot` +in a random order. +]] +local function get_random_slots(max_slot) + local slots = {} + for s=1, max_slot do + slots[s] = s + end + local slots_out = {} + while #slots > 0 do + local r = math.random(1, #slots) + table.insert(slots_out, slots[r]) + table.remove(slots, r) + end + return slots_out +end + +--[[ +Puts items in an inventory list into random slots. +* inv: InvRef +* listname: Inventory list name +* items: table of items to add + +Items will be added from start of the table to end. +If the inventory already has occupied slots, or is +too small, placement of some items might fail. +]] +function mcl_loot.fill_inventory(inv, listname, items) + local size = inv:get_size(listname) + local slots = get_random_slots(size) + local leftovers = {} + -- 1st pass: Add items into random slots + for i=1, math.min(#items, size) do + local item = items[i] + local slot = slots[i] + local old_item = inv:get_stack(listname, slot) + local leftover = old_item:add_item(item) + inv:set_stack(listname, slot, old_item) + if not leftover:is_empty() then + table.insert(leftovers, item) + end + end + -- 2nd pass: If some items couldn't be added in first pass, + -- try again in a non-random fashion + for l=1, math.min(#leftovers, size) do + inv:add_item(listname, leftovers[l]) + end + -- If there are still items left, tough luck! +end diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_bubble.png b/mods/CORE/mcl_particles/textures/mcl_particles_bubble.png index c64ceea3..3370a698 100644 Binary files a/mods/CORE/mcl_particles/textures/mcl_particles_bubble.png and b/mods/CORE/mcl_particles/textures/mcl_particles_bubble.png differ diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_teleport.png b/mods/CORE/mcl_particles/textures/mcl_particles_teleport.png new file mode 100644 index 00000000..4e1687d7 Binary files /dev/null and b/mods/CORE/mcl_particles/textures/mcl_particles_teleport.png differ diff --git a/mods/CORE/mcl_sounds/README.txt b/mods/CORE/mcl_sounds/README.txt index 7dcab32d..9fc2ba28 100644 --- a/mods/CORE/mcl_sounds/README.txt +++ b/mods/CORE/mcl_sounds/README.txt @@ -4,6 +4,9 @@ Licenses of sounds Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) http://creativecommons.org/licenses/by-sa/3.0/ +Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +http://creativecommons.org/licenses/by-sa/4.0/ + Creative Commons Attribution 3.0 Unported (CC BY-SA 3.0) http://creativecommons.org/licenses/by/3.0/ @@ -67,17 +70,28 @@ blukotek (CC0 1.0) https://www.freesound.org/people/blukotek/sounds/251660/ default_dig_snappy.ogg +sonictechtonic (CC BY 3.0) +https://www.freesound.org/people/sonictechtonic/sounds/241872/ + player_damage.ogg + Voxelands project (CC BY-SA 3.0) mcl_sounds_place_node_water.ogg mcl_sounds_dug_water.ogg - player_damage.ogg (Note: Artists from the Voxelands project include: sdzen, darkrose, sapier, Tom Peter, Telaron, juskiddink) +Michel Baradari (CC BY 3.0) + + default_place_node_lava.ogg + Adam_N (CC0 1.0): player_falling_damage.ogg Source: +Alecia Shepherd (CC BY-SA 4.0): + mcl_sounds_cloth.ogg + Source: SnowSong sound and music pack + Unknown authors (WTFPL): pedology_snow_soft_footstep.*.ogg diff --git a/mods/CORE/mcl_sounds/init.lua b/mods/CORE/mcl_sounds/init.lua index 62dc34a9..b4d43f0c 100644 --- a/mods/CORE/mcl_sounds/init.lua +++ b/mods/CORE/mcl_sounds/init.lua @@ -97,6 +97,20 @@ function mcl_sounds.node_sound_wood_defaults(table) return table end +function mcl_sounds.node_sound_wool_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name="mcl_sounds_cloth", gain=0.5} + table.dug = table.dug or + {name="mcl_sounds_cloth", gain=1.0} + table.dig = table.dig or + {name="mcl_sounds_cloth", gain=0.9} + table.place = table.dig or + {name="mcl_sounds_cloth", gain=1.0} + mcl_sounds.node_sound_defaults(table) + return table +end + function mcl_sounds.node_sound_leaves_defaults(table) table = table or {} table.footstep = table.footstep or @@ -134,3 +148,21 @@ function mcl_sounds.node_sound_water_defaults(table) mcl_sounds.node_sound_defaults(table) return table end + +function mcl_sounds.node_sound_lava_defaults(table) + table = table or {} + -- TODO: Footstep + table.place = table.place or + {name = "default_place_node_lava", gain = 1.0} + table.dug = table.dug or + {name = "default_place_node_lava", gain = 1.0} + -- TODO: Different dug sound + mcl_sounds.node_sound_defaults(table) + return table +end + +-- Player death sound +minetest.register_on_dieplayer(function(player) + -- TODO: Add separate death sound + minetest.sound_play({name="player_damage", gain = 1.0}, {pos=player:get_pos(), max_hear_distance=16}, true) +end) diff --git a/mods/CORE/mcl_sounds/sounds/default_place_node_hard.1.ogg b/mods/CORE/mcl_sounds/sounds/default_place_node_hard.1.ogg index 76eecf97..9f97faca 100644 Binary files a/mods/CORE/mcl_sounds/sounds/default_place_node_hard.1.ogg and b/mods/CORE/mcl_sounds/sounds/default_place_node_hard.1.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/default_place_node_lava.ogg b/mods/CORE/mcl_sounds/sounds/default_place_node_lava.ogg new file mode 100644 index 00000000..2ef7ff6a Binary files /dev/null and b/mods/CORE/mcl_sounds/sounds/default_place_node_lava.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/default_tool_breaks.ogg b/mods/CORE/mcl_sounds/sounds/default_tool_breaks.ogg index c68522cd..a68f7c90 100644 Binary files a/mods/CORE/mcl_sounds/sounds/default_tool_breaks.ogg and b/mods/CORE/mcl_sounds/sounds/default_tool_breaks.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.1.ogg b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.1.ogg new file mode 100644 index 00000000..cc304a41 Binary files /dev/null and b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.1.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.2.ogg b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.2.ogg new file mode 100644 index 00000000..8a3c0963 Binary files /dev/null and b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.2.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.3.ogg b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.3.ogg new file mode 100644 index 00000000..2f682c72 Binary files /dev/null and b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.3.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.4.ogg b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.4.ogg new file mode 100644 index 00000000..cc60b8f6 Binary files /dev/null and b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.4.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.1.ogg b/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.1.ogg index 2c0e04f0..3ab633a5 100644 Binary files a/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.1.ogg and b/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.1.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.2.ogg b/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.2.ogg index 6d01262a..647ea6ec 100644 Binary files a/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.2.ogg and b/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.2.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.3.ogg b/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.3.ogg index f8b41517..f4faadcd 100644 Binary files a/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.3.ogg and b/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.3.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.4.ogg b/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.4.ogg index b31beadc..54168009 100644 Binary files a/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.4.ogg and b/mods/CORE/mcl_sounds/sounds/pedology_snow_soft_footstep.4.ogg differ diff --git a/mods/CORE/mcl_sounds/sounds/player_damage.ogg b/mods/CORE/mcl_sounds/sounds/player_damage.ogg index 063e6c08..78880871 100644 Binary files a/mods/CORE/mcl_sounds/sounds/player_damage.ogg and b/mods/CORE/mcl_sounds/sounds/player_damage.ogg differ diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 95b9f7f6..6a74bb69 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -149,7 +149,7 @@ function mcl_util.get_eligible_transfer_item_slot(src_inventory, src_list, dst_i return nil end --- Returns true if given itemstack is a shulker box +-- Returns true if itemstack is a shulker box local is_not_shulker_box = function(itemstack) local g = minetest.get_item_group(itemstack:get_name(), "shulker_box") return g == 0 or g == nil @@ -174,14 +174,15 @@ function mcl_util.move_item(source_inventory, source_list, source_stack_id, dest if not source_inventory:is_empty(source_list) then local stack = source_inventory:get_stack(source_list, source_stack_id) - local item = stack:get_name() if not stack:is_empty() then - if not destination_inventory:room_for_item(destination_list, item) then + local new_stack = ItemStack(stack) + new_stack:set_count(1) + if not destination_inventory:room_for_item(destination_list, new_stack) then return false end stack:take_item() source_inventory:set_stack(source_list, source_stack_id, stack) - destination_inventory:add_item(destination_list, item) + destination_inventory:add_item(destination_list, new_stack) return true end end @@ -205,6 +206,11 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, local dctype = minetest.get_item_group(dnode.name, "container") local sctype = minetest.get_item_group(snode.name, "container") + -- Container type 7 does not allow any movement + if sctype == 7 then + return false + end + -- Normalize double container by forcing to always use the left segment first local normalize_double_container = function(pos, node, ctype) if ctype == 6 then @@ -235,7 +241,7 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, -- Default source lists if not source_list then -- Main inventory for most container types - if sctype == 2 or sctype == 3 or sctype == 5 or sctype == 6 then + if sctype == 2 or sctype == 3 or sctype == 5 or sctype == 6 or sctype == 7 then source_list = "main" -- Furnace: output elseif sctype == 4 then @@ -281,13 +287,17 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, return false end end + -- Container type 7 does not allow any placement + if dctype == 7 then + return false + end -- If it's a container, put it into the container if dctype ~= 0 then -- Automatically select a destination list if omitted if not destination_list then -- Main inventory for most container types - if dctype == 2 or dctype == 3 or dctype == 5 or dctype == 6 then + if dctype == 2 or dctype == 3 or dctype == 5 or dctype == 6 or dctype == 7 then destination_list = "main" -- Furnace source slot elseif dctype == 4 then @@ -331,68 +341,13 @@ function mcl_util.is_fuel(item) return minetest.get_craft_result({method="fuel", width=1, items={item}}).time ~= 0 end --- For a given position, returns a 2-tuple: --- 1st return value: true if pos is in void --- 2nd return value: true if it is in the deadly part of the void -function mcl_util.is_in_void(pos) - local void = - not ((pos.y < mcl_vars.mg_overworld_max and pos.y > mcl_vars.mg_overworld_min) or - (pos.y < mcl_vars.mg_nether_max and pos.y > mcl_vars.mg_nether_min) or - (pos.y < mcl_vars.mg_end_max and pos.y > mcl_vars.mg_end_min)) - - local void_deadly = false - local deadly_tolerance = 64 -- the player must be this many nodes “deep” into the void to be damaged - if void then - -- Overworld → Void → End → Void → Nether → Void - if pos.y < mcl_vars.mg_overworld_min and pos.y > mcl_vars.mg_end_max then - void_deadly = pos.y < mcl_vars.mg_overworld_min - deadly_tolerance - elseif pos.y < mcl_vars.mg_end_min and pos.y > mcl_vars.mg_nether_max then - void_deadly = pos.y < mcl_vars.mg_end_min - deadly_tolerance - elseif pos.y < mcl_vars.mg_nether_min then - void_deadly = pos.y < mcl_vars.mg_nether_min - deadly_tolerance - end - end - return void, void_deadly -end - --- Here come 2 simple converter functions which are important for map generators and mob spawning - --- Takes an Y coordinate as input and returns: --- 1) The corresponding Minecraft layer (can be nil if void) --- 2) The corresponding Minecraft dimension ("overworld", "nether" or "end") or "void" if it is in the void --- If the Y coordinate is not located in any dimension, it will return: --- nil, "void" -function mcl_util.y_to_layer(y) - if y >= mcl_vars.mg_overworld_min then - return y - mcl_vars.mg_overworld_min, "overworld" - elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max then - return y - mcl_vars.mg_nether_min, "nether" - elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then - return y - mcl_vars.mg_end_min, "end" - else - return nil, "void" - end -end - --- Takes a Minecraft layer and a “dimension” name --- and returns the corresponding Y coordinate for --- MineClone 2. --- mc_dimension is one of "overworld", "nether", "end" (default: "overworld"). -function mcl_util.layer_to_y(layer, mc_dimension) - if mc_dimension == "overworld" or mc_dimension == nil then - return layer + mcl_vars.mg_overworld_min - elseif mc_dimension == "nether" then - return layer + mcl_vars.mg_nether_min - elseif mc_dimension == "end" then - return layer + mcl_vars.mg_end_min - end -end - -- Returns a on_place function for plants --- * condition: function(pos, node) +-- * condition: function(pos, node, itemstack) -- * A function which is called by the on_place function to check if the node can be placed --- * Must return true, if placement is allowed, false otherwise +-- * Must return true, if placement is allowed, false otherwise. +-- * If it returns a string, placement is allowed, but will place this itemstring as a node instead -- * pos, node: Position and node table of plant node +-- * itemstack: Itemstack to place function mcl_util.generate_on_place_plant_function(condition) return function(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then @@ -423,13 +378,14 @@ function mcl_util.generate_on_place_plant_function(condition) end -- Check placement rules - if (condition(place_pos, node) == true) then + local result, param2 = condition(place_pos, node, itemstack) + if result == true then local idef = itemstack:get_definition() - local new_itemstack, success = minetest.item_place_node(itemstack, placer, pointed_thing) + local new_itemstack, success = minetest.item_place_node(itemstack, placer, pointed_thing, param2) if success then if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=pointed_thing.above, gain=1}) + minetest.sound_play(idef.sounds.place, {pos=pointed_thing.above, gain=1}, true) end end itemstack = new_itemstack diff --git a/mods/CORE/mcl_worlds/depends.txt b/mods/CORE/mcl_worlds/depends.txt new file mode 100644 index 00000000..3b355984 --- /dev/null +++ b/mods/CORE/mcl_worlds/depends.txt @@ -0,0 +1 @@ +mcl_init diff --git a/mods/CORE/mcl_worlds/description.txt b/mods/CORE/mcl_worlds/description.txt new file mode 100644 index 00000000..470cf7a8 --- /dev/null +++ b/mods/CORE/mcl_worlds/description.txt @@ -0,0 +1 @@ +Utility functions for worlds and the “dimensions”. diff --git a/mods/CORE/mcl_worlds/init.lua b/mods/CORE/mcl_worlds/init.lua new file mode 100644 index 00000000..d032426d --- /dev/null +++ b/mods/CORE/mcl_worlds/init.lua @@ -0,0 +1,140 @@ +mcl_worlds = {} + +-- For a given position, returns a 2-tuple: +-- 1st return value: true if pos is in void +-- 2nd return value: true if it is in the deadly part of the void +function mcl_worlds.is_in_void(pos) + local void = + not ((pos.y < mcl_vars.mg_overworld_max and pos.y > mcl_vars.mg_overworld_min) or + (pos.y < mcl_vars.mg_nether_max and pos.y > mcl_vars.mg_nether_min) or + (pos.y < mcl_vars.mg_end_max and pos.y > mcl_vars.mg_end_min)) + + local void_deadly = false + local deadly_tolerance = 64 -- the player must be this many nodes “deep” into the void to be damaged + if void then + -- Overworld → Void → End → Void → Nether → Void + if pos.y < mcl_vars.mg_overworld_min and pos.y > mcl_vars.mg_end_max then + void_deadly = pos.y < mcl_vars.mg_overworld_min - deadly_tolerance + elseif pos.y < mcl_vars.mg_end_min and pos.y > mcl_vars.mg_nether_max then + -- The void between End and Nether. Like usual, but here, the void + -- *above* the Nether also has a small tolerance area, so player + -- can fly above the Nether without getting hurt instantly. + void_deadly = (pos.y < mcl_vars.mg_end_min - deadly_tolerance) and (pos.y > mcl_vars.mg_nether_max + deadly_tolerance) + elseif pos.y < mcl_vars.mg_nether_min then + void_deadly = pos.y < mcl_vars.mg_nether_min - deadly_tolerance + end + end + return void, void_deadly +end + +-- Takes an Y coordinate as input and returns: +-- 1) The corresponding Minecraft layer (can be nil if void) +-- 2) The corresponding Minecraft dimension ("overworld", "nether" or "end") or "void" if it is in the void +-- If the Y coordinate is not located in any dimension, it will return: +-- nil, "void" +function mcl_worlds.y_to_layer(y) + if y >= mcl_vars.mg_overworld_min then + return y - mcl_vars.mg_overworld_min, "overworld" + elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max then + return y - mcl_vars.mg_nether_min, "nether" + elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then + return y - mcl_vars.mg_end_min, "end" + else + return nil, "void" + end +end + +-- Takes a pos and returns the dimension it belongs to (same as above) +function mcl_worlds.pos_to_dimension(pos) + local _, dim = mcl_worlds.y_to_layer(pos.y) + return dim +end + +-- Takes a Minecraft layer and a “dimension” name +-- and returns the corresponding Y coordinate for +-- MineClone 2. +-- mc_dimension is one of "overworld", "nether", "end" (default: "overworld"). +function mcl_worlds.layer_to_y(layer, mc_dimension) + if mc_dimension == "overworld" or mc_dimension == nil then + return layer + mcl_vars.mg_overworld_min + elseif mc_dimension == "nether" then + return layer + mcl_vars.mg_nether_min + elseif mc_dimension == "end" then + return layer + mcl_vars.mg_end_min + end +end + +-- Takes a position and returns true if this position can have weather +function mcl_worlds.has_weather(pos) + -- Weather in the Overworld and the high part of the void below + return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 +end + +-- Takes a position (pos) and returns true if compasses are working here +function mcl_worlds.compass_works(pos) + -- It doesn't work in Nether and the End, but it works in the Overworld and in the high part of the void below + local _, dim = mcl_worlds.y_to_layer(pos.y) + if dim == "nether" or dim == "end" then + return false + elseif dim == "void" then + return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 + else + return true + end +end + +-- Takes a position (pos) and returns true if clocks are working here +mcl_worlds.clock_works = mcl_worlds.compass_works + +--------------- CALLBACKS ------------------ +mcl_worlds.registered_on_dimension_change = {} + +-- Register a callback function func(player, dimension). +-- It will be called whenever a player changes between dimensions. +-- The void counts as dimension. +-- * player: The player who changed the dimension +-- * dimension: The new dimension of the player ("overworld", "nether", "end", "void"). +function mcl_worlds.register_on_dimension_change(func) + table.insert(mcl_worlds.registered_on_dimension_change, func) +end + +-- Playername-indexed table containig the name of the last known dimension the +-- player was in. +local last_dimension = {} + +-- Notifies this mod about a dimension change of a player. +-- * player: Player who changed the dimension +-- * dimension: New dimension ("overworld", "nether", "end", "void") +function mcl_worlds.dimension_change(player, dimension) + for i=1, #mcl_worlds.registered_on_dimension_change do + mcl_worlds.registered_on_dimension_change[i](player, dimension) + last_dimension[player:get_player_name()] = dimension + end +end + +----------------------- INTERNAL STUFF ---------------------- + +-- Update the dimension callbacks every DIM_UPDATE seconds +local DIM_UPDATE = 1 +local dimtimer = 0 + +minetest.register_on_joinplayer(function(player) + last_dimension[player:get_player_name()] = mcl_worlds.pos_to_dimension(player:get_pos()) +end) + +minetest.register_globalstep(function(dtime) + -- regular updates based on iterval + dimtimer = dimtimer + dtime; + if dimtimer >= DIM_UPDATE then + local players = minetest.get_connected_players() + for p=1, #players do + local dim = mcl_worlds.pos_to_dimension(players[p]:get_pos()) + local name = players[p]:get_player_name() + if dim ~= last_dimension[name] then + mcl_worlds.dimension_change(players[p], dim) + end + end + dimtimer = 0 + end +end) + diff --git a/mods/CORE/modpack.conf b/mods/CORE/modpack.conf new file mode 100644 index 00000000..7cbf0f67 --- /dev/null +++ b/mods/CORE/modpack.conf @@ -0,0 +1,2 @@ +name = CORE +description = Meta-modpack containing the core mods for MineClone 2 for core APIs, variables and definitions diff --git a/mods/CORE/modpack.txt b/mods/CORE/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/CORE/walkover/README.md b/mods/CORE/walkover/README.md index 2b78b0b0..d3922ee7 100644 --- a/mods/CORE/walkover/README.md +++ b/mods/CORE/walkover/README.md @@ -1,11 +1,11 @@ -WalkOver +Walkover -------- -Some mode developers have shown an interest in having an on_walk_over event. This is useful for pressure-plates and the like. +Some mode developers have shown an interest in having an `on_walk_over` event. This is useful for pressure-plates and the like. See this issue - https://github.com/minetest/minetest/issues/247 -I have implemented a server_side version in lua using globalstep which people might find useful. Of course this would better implemented via a client-based "on walk over", but it is sufficient for my needs now. +I have implemented a server-side version in Lua using globalstep which people might find useful. Of course this would better implemented via a client-based "on walk over", but it is sufficient for my needs now. Example Usage ------------- @@ -19,3 +19,6 @@ Example Usage }) +Credits +------- +Mod created by lordfingle, licensed under Apache License 2.0. diff --git a/mods/CORE/walkover/init.lua b/mods/CORE/walkover/init.lua index 35982d37..1e2749ff 100644 --- a/mods/CORE/walkover/init.lua +++ b/mods/CORE/walkover/init.lua @@ -4,7 +4,9 @@ minetest.register_globalstep(function(dtime) timer = timer + dtime; if timer >= 0.3 then for _,player in pairs(minetest.get_connected_players()) do - local loc = vector.add(player:getpos(),{x=0,y=-1,z=0}) + local pp = player:get_pos() + pp.y = math.ceil(pp.y) + local loc = vector.add(pp, {x=0,y=-1,z=0}) if loc ~= nil then local nodeiamon = minetest.get_node(loc) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index 8e3ef4c1..730cb7b7 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -12,32 +12,34 @@ minetest.register_entity("drippingwater:drop_water", { hp_max = 1, physical = true, collide_with_objects = false, - collisionbox = {0,0,0,0,0,0}, + collisionbox = {-0.025,-0.05,-0.025,0.025,-0.01,0.025}, + pointable = false, visual = "cube", visual_size = {x=0.05, y=0.1}, textures = {water_tex, water_tex, water_tex, water_tex, water_tex, water_tex}, spritediv = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, + static_save = false, on_activate = function(self, staticdata) - self.object:setsprite({x=0,y=0}, 1, 1, true) + self.object:set_sprite({x=0,y=0}, 1, 1, true) end, on_step = function(self, dtime) local k = math.random(1,222) - local ownpos = self.object:getpos() + local ownpos = self.object:get_pos() if k==1 then - self.object:setacceleration({x=0, y=-5, z=0}) + self.object:set_acceleration({x=0, y=-5, z=0}) end if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:setacceleration({x=0, y=-5, z=0}) + self.object:set_acceleration({x=0, y=-5, z=0}) end if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then self.object:remove() - minetest.sound_play({name="drippingwater_drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}) + minetest.sound_play({name="drippingwater_drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) end end, }) @@ -50,33 +52,36 @@ minetest.register_entity("drippingwater:drop_lava", { hp_max = 1, physical = true, collide_with_objects = false, - collisionbox = {0,0,0,0,0,0}, + collisionbox = {-0.025,-0.05,-0.025,0.025,-0.01,0.025}, + glow = math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), + pointable = false, visual = "cube", visual_size = {x=0.05, y=0.1}, textures = {lava_tex, lava_tex, lava_tex, lava_tex, lava_tex, lava_tex}, spritediv = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, + static_save = false, on_activate = function(self, staticdata) - self.object:setsprite({x=0,y=0}, 1, 0, true) + self.object:set_sprite({x=0,y=0}, 1, 0, true) end, on_step = function(self, dtime) local k = math.random(1,222) - local ownpos = self.object:getpos() + local ownpos = self.object:get_pos() if k==1 then - self.object:setacceleration({x=0, y=-5, z=0}) + self.object:set_acceleration({x=0, y=-5, z=0}) end if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:setacceleration({x=0, y=-5, z=0}) + self.object:set_acceleration({x=0, y=-5, z=0}) end if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then self.object:remove() - minetest.sound_play({name="drippingwater_lavadrip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}) + minetest.sound_play({name="drippingwater_lavadrip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) end end, }) @@ -88,7 +93,7 @@ minetest.register_entity("drippingwater:drop_lava", { minetest.register_abm( { label = "Create water drops", - nodenames = {"group:solid"}, + nodenames = {"group:opaque", "group:leaves"}, neighbors = {"group:water"}, interval = 2, chance = 22, @@ -106,7 +111,7 @@ minetest.register_abm( minetest.register_abm( { label = "Create lava drops", - nodenames = {"group:solid"}, + nodenames = {"group:opaque"}, neighbors = {"group:lava"}, interval = 2, chance = 22, diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.1.ogg b/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.1.ogg index 84c3e013..fcf63c74 100644 Binary files a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.1.ogg and b/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.1.ogg differ diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.2.ogg b/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.2.ogg index 18790fc1..e1954bbf 100644 Binary files a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.2.ogg and b/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.2.ogg differ diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.3.ogg b/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.3.ogg index f3674069..74ddd45b 100644 Binary files a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.3.ogg and b/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.3.ogg differ diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.1.ogg b/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.1.ogg index 681784c5..46447f93 100644 Binary files a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.1.ogg and b/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.1.ogg differ diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.2.ogg b/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.2.ogg index 3a66367c..b8e9deaf 100644 Binary files a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.2.ogg and b/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.2.ogg differ diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.3.ogg b/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.3.ogg index 40be35aa..9cb15024 100644 Binary files a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.3.ogg and b/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.3.ogg differ diff --git a/mods/ENTITIES/mcl_boats/README.txt b/mods/ENTITIES/mcl_boats/README.txt index 6d218f27..195a2241 100644 --- a/mods/ENTITIES/mcl_boats/README.txt +++ b/mods/ENTITIES/mcl_boats/README.txt @@ -10,8 +10,7 @@ License of boat model: GNU GPLv3 ## Textures -All textures are from the Faithful texture pack for Minecraft. -See the main MineClone 2 license to learn more. +See the main MineClone 2 README.md file to learn more. ## Code Code based on Minetest Game, licensed under the MIT License (MIT). diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index e03beac8..6c0ad9a1 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator("mcl_boats") -- -- Helper functions -- @@ -33,6 +34,8 @@ local boat_visual_size = {x = 3, y = 3} local driver_visual_size = { x = 1/boat_visual_size.x, y = 1/boat_visual_size.y } local paddling_speed = 22 local boat_y_offset = 0.35 +local boat_y_offset_ground = boat_y_offset + 0.6 +local boat_side_offset = 1.001 -- -- Boat entity @@ -67,9 +70,9 @@ function boat.on_rightclick(self, clicker) clicker:set_properties({visual_size = {x=1, y=1}}) mcl_player.player_attached[name] = false mcl_player.player_set_animation(clicker, "stand" , 30) - local pos = clicker:getpos() + local pos = clicker:get_pos() pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} - clicker:setpos(pos) + clicker:set_pos(pos) elseif not self._driver then local attach = clicker:get_attach() if attach and attach:get_luaentity() then @@ -82,15 +85,16 @@ function boat.on_rightclick(self, clicker) end self._driver = clicker clicker:set_attach(self.object, "", - {x = 0, y = 3.75, z = -1}, {x = 0, y = 0, z = 0}) + {x = 0, y = 0.42, z = -1}, {x = 0, y = 0, z = 0}) clicker:set_properties({ visual_size = driver_visual_size }) mcl_player.player_attached[name] = true - minetest.after(0.2, function(clicker) - if clicker:is_player() then - mcl_player.player_set_animation(clicker, "sit" , 30) + minetest.after(0.2, function(name) + local player = minetest.get_player_by_name(name) + if player then + mcl_player.player_set_animation(player, "sit" , 30) end - end, clicker) - clicker:set_look_horizontal(self.object:getyaw()) + end, name) + clicker:set_look_horizontal(self.object:get_yaw()) end end @@ -130,20 +134,41 @@ function boat.on_punch(self, puncher) self._removed = true -- Drop boat as item on the ground after punching if not minetest.settings:get_bool("creative_mode") then - minetest.add_item(self.object:getpos(), self._itemstring) + minetest.add_item(self.object:get_pos(), self._itemstring) + else + local inv = puncher:get_inventory() + if not inv:contains_item("main", self._itemstring) then + inv:add_item("main", self._itemstring) + end end self.object:remove() end end function boat.on_step(self, dtime) - self._v = get_v(self.object:getvelocity()) * get_sign(self._v) + self._v = get_v(self.object:get_velocity()) * get_sign(self._v) + local on_water = true + local in_water = false + local v_factor = 1 + local v_slowdown = 0.02 + local p = self.object:get_pos() + if (not is_water({x=p.x, y=p.y-boat_y_offset, z=p.z})) then + on_water = false + v_factor = 0.5 + v_slowdown = 0.04 + elseif (is_water({x=p.x, y=p.y-boat_y_offset+1, z=p.z})) then + on_water = false + in_water = true + v_factor = 0.75 + v_slowdown = 0.05 + end + if self._driver then local ctrl = self._driver:get_player_control() - local yaw = self.object:getyaw() + local yaw = self.object:get_yaw() if ctrl.up then -- Forwards - self._v = self._v + 0.1 + self._v = self._v + 0.1 * v_factor -- Paddling animation if self._animation ~= 1 then @@ -152,7 +177,7 @@ function boat.on_step(self, dtime) end elseif ctrl.down then -- Backwards - self._v = self._v - 0.1 + self._v = self._v - 0.1 * v_factor -- Paddling animation, reversed if self._animation ~= -1 then @@ -168,15 +193,15 @@ function boat.on_step(self, dtime) end if ctrl.left then if self._v < 0 then - self.object:setyaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(yaw - (1 + dtime) * 0.03 * v_factor) else - self.object:setyaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(yaw + (1 + dtime) * 0.03 * v_factor) end elseif ctrl.right then if self._v < 0 then - self.object:setyaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(yaw + (1 + dtime) * 0.03 * v_factor) else - self.object:setyaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(yaw - (1 + dtime) * 0.03 * v_factor) end end else @@ -186,73 +211,65 @@ function boat.on_step(self, dtime) self._animation = 0 end end - local velo = self.object:getvelocity() - if self._v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then - self.object:setpos(self.object:getpos()) - return - end local s = get_sign(self._v) - self._v = self._v - 0.02 * s - if s ~= get_sign(self._v) then - self.object:setvelocity({x = 0, y = 0, z = 0}) - self._v = 0 - return + if not on_water and not in_water and math.abs(self._v) > 1.0 then + v_slowdown = math.min(math.abs(self._v) - 1.0, v_slowdown * 5) + elseif in_water and math.abs(self._v) > 1.5 then + v_slowdown = math.min(math.abs(self._v) - 1.5, v_slowdown * 5) end - if math.abs(self._v) > 5 then - self._v = 5 * get_sign(self._v) + self._v = self._v - v_slowdown * s + if s ~= get_sign(self._v) then + self._v = 0 end - local p = self.object:getpos() p.y = p.y - boat_y_offset local new_velo local new_acce = {x = 0, y = 0, z = 0} if not is_water(p) then + -- Not on water or inside water: Free fall 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:getyaw(), - self.object:getvelocity().y) - self.object:setpos(self.object:getpos()) + new_acce = {x = 0, y = -9.8, z = 0} + new_velo = get_velocity(self._v, self.object:get_yaw(), + self.object:get_velocity().y) else p.y = p.y + 1 if is_water(p) then - local y = self.object:getvelocity().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} + -- Inside water: Slowly sink + local y = self.object:get_velocity().y + y = y - 0.01 + if y < -0.2 then + y = -0.2 end - new_velo = get_velocity(self._v, self.object:getyaw(), y) - self.object:setpos(self.object:getpos()) - else new_acce = {x = 0, y = 0, z = 0} - if math.abs(self.object:getvelocity().y) < 1 then - local pos = self.object:getpos() - pos.y = math.floor(pos.y) + boat_y_offset - self.object:setpos(pos) - new_velo = get_velocity(self._v, self.object:getyaw(), 0) + new_velo = get_velocity(self._v, self.object:get_yaw(), y) + else + -- On top of water + new_acce = {x = 0, y = 0, z = 0} + if math.abs(self.object:get_velocity().y) < 0 then + new_velo = get_velocity(self._v, self.object:get_yaw(), 0) else - new_velo = get_velocity(self._v, self.object:getyaw(), - self.object:getvelocity().y) - self.object:setpos(self.object:getpos()) + new_velo = get_velocity(self._v, self.object:get_yaw(), + self.object:get_velocity().y) end end end - self.object:setvelocity(new_velo) - self.object:setacceleration(new_acce) + + -- Terminal velocity: 8 m/s per axis of travel + for _,axis in pairs({"z","y","x"}) do + if math.abs(new_velo[axis]) > 8 then + new_velo[axis] = 8 * get_sign(new_velo[axis]) + end + end + + self.object:set_velocity(new_velo) + self.object:set_acceleration(new_acce) end -- Register one entity for all boat types minetest.register_entity("mcl_boats:boat", boat) local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak" } -local names = { "Oak Boat", "Spruce Boat", "Birch Boat", "Jungle Boat", "Acacia Boat", "Dark Oak Boat" } +local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat") } local craftstuffs = {} if minetest.get_modpath("mcl_core") then craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood" } @@ -262,18 +279,20 @@ local images = { "oak", "spruce", "birch", "jungle", "acacia", "dark_oak" } for b=1, #boat_ids do local itemstring = "mcl_boats:"..boat_ids[b] - local longdesc, usagehelp, help, helpname + local longdesc, usagehelp, tt_help, help, helpname help = false -- Only create one help entry for all boats if b == 1 then help = true - longdesc = "Boats are used to travel on the surface of water." - usagehelp = "Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item." - helpname = "Boat" + longdesc = S("Boats are used to travel on the surface of water.") + usagehelp = S("Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.") + helpname = S("Boat") end + tt_help = S("Water vehicle") minetest.register_craftitem(itemstring, { description = names[b], + _tt_help = tt_help, _doc_items_create_entry = help, _doc_items_entry_name = helpname, _doc_items_longdesc = longdesc, @@ -284,7 +303,7 @@ for b=1, #boat_ids do stack_max = 1, on_place = function(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then - return + return itemstack end -- Call on_rightclick if the pointed node defines it @@ -295,18 +314,35 @@ for b=1, #boat_ids do end end - if not is_water(pointed_thing.under) then - return + local pos = table.copy(pointed_thing.under) + local dir = vector.subtract(pointed_thing.above, pointed_thing.under) + + if math.abs(dir.x) > 0.9 or math.abs(dir.z) > 0.9 then + pos = vector.add(pos, vector.multiply(dir, boat_side_offset)) + elseif is_water(pos) then + pos = vector.add(pos, vector.multiply(dir, boat_y_offset)) + else + pos = vector.add(pos, vector.multiply(dir, boat_y_offset_ground)) end - pointed_thing.under.y = pointed_thing.under.y + boat_y_offset - local boat = minetest.add_entity(pointed_thing.under, "mcl_boats:boat") + local boat = minetest.add_entity(pos, "mcl_boats:boat") boat:get_luaentity()._itemstring = itemstring boat:set_properties({textures = { "mcl_boats_texture_"..images[b].."_boat.png" }}) + boat:set_yaw(placer:get_look_horizontal()) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end return itemstack end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + local below = {x=droppos.x, y=droppos.y-1, z=droppos.z} + local belownode = minetest.get_node(below) + -- Place boat as entity on or in water + if minetest.get_item_group(dropnode.name, "water") ~= 0 or (dropnode.name == "air" and minetest.get_item_group(belownode.name, "water") ~= 0) then + minetest.add_entity(droppos, "mcl_boats:boat") + else + minetest.add_item(droppos, stack) + end + end, }) local c = craftstuffs[b] diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr new file mode 100644 index 00000000..95066b53 --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_boats +Acacia Boat=Akazienboot +Birch Boat=Birkenboot +Boat=Boot +Boats are used to travel on the surface of water.=Boote werden benutzt, um sich auf der Wasseroberfläche zu bewegen. +Dark Oak Boat=Schwarzeichenboot +Jungle Boat=Dschungelboot +Oak Boat=Eichenboot +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Rechtsklicken Sie auf eine Wasserquelle, um das Boot zu platzieren. Rechtsklicken Sie auf das Boot, um es zu betreten. Mit [Links] und [Rechts] lenken, mit [Vorwärts] und [Rückwärts] Geschwindigkeit regeln oder rückwärts fahren. Rechtsklicken Sie erneut auf das Boot, um es zu verlassen, schlagen Sie das Boot, um es als Gegenstand fallen zu lassen. +Spruce Boat=Fichtenboot +Water vehicle=Wasserfahrzeug diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.es.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.es.tr new file mode 100644 index 00000000..644efdb6 --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.es.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_boats +Acacia Boat=Barca de acacia +Birch Boat=Barca de abedul +Boat=Barca +Boats are used to travel on the surface of water.=Las barcas se utilizan para viajar en la superficie del agua. +Dark Oak Boat=Barca de roble oscuro +Jungle Boat=Barca de la selva +Oak Boat=Barca de roble +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Haga clic derecho en una fuente de agua para colocar el barco. Haga clic derecho en el barco para entrar. Utilice [Izquierda] y [Derecha] para dirigir, [Adelante] para acelerar y [Atrás] para reducir la velocidad o retroceder. Haga clic derecho en el barco nuevamente para dejarlo, golpee el barco para que se caiga como un artículo. +Spruce Boat=Barca de abeto diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr new file mode 100644 index 00000000..04d6d9da --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_boats +Acacia Boat=Bateau en Acacia +Birch Boat=Bateau en Bouleau +Boat=Bateau +Boats are used to travel on the surface of water.=Les bateaux sont utilisés pour voyager à la surface de l'eau. +Dark Oak Boat=Bateau en Chêne Noir +Jungle Boat=Bateau en Acajou +Oak Boat=Bateau en Chêne +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Faites un clic droit sur une source d'eau pour placer le bateau. Faites un clic droit sur le bateau pour y entrer. Utilisez [Gauche] et [Droite] pour diriger, [Avant] pour accélérer et [Arrière] pour ralentir ou reculer. Cliquez de nouveau avec le bouton droit sur le bateau pour le quitter, frappez le bateau pour le faire tomber en tant qu'objet. +Spruce Boat=Bateau en Sapin +Water vehicle=Véhicule aquatique \ No newline at end of file diff --git a/mods/ENTITIES/mcl_boats/locale/template.txt b/mods/ENTITIES/mcl_boats/locale/template.txt new file mode 100644 index 00000000..54f1fd64 --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: mcl_boats +Acacia Boat= +Birch Boat= +Boat= +Boats are used to travel on the surface of water.= +Dark Oak Boat= +Jungle Boat= +Oak Boat= +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.= +Spruce Boat= +Water vehicle= diff --git a/mods/ENTITIES/mcl_boats/textures/mcl_boats_acacia_boat.png b/mods/ENTITIES/mcl_boats/textures/mcl_boats_acacia_boat.png index 3ba00911..40f767c3 100644 Binary files a/mods/ENTITIES/mcl_boats/textures/mcl_boats_acacia_boat.png and b/mods/ENTITIES/mcl_boats/textures/mcl_boats_acacia_boat.png differ diff --git a/mods/ENTITIES/mcl_boats/textures/mcl_boats_birch_boat.png b/mods/ENTITIES/mcl_boats/textures/mcl_boats_birch_boat.png index ac0f3dc1..fed5be7c 100644 Binary files a/mods/ENTITIES/mcl_boats/textures/mcl_boats_birch_boat.png and b/mods/ENTITIES/mcl_boats/textures/mcl_boats_birch_boat.png differ diff --git a/mods/ENTITIES/mcl_boats/textures/mcl_boats_oak_boat.png b/mods/ENTITIES/mcl_boats/textures/mcl_boats_oak_boat.png index 371596f6..75f27b21 100644 Binary files a/mods/ENTITIES/mcl_boats/textures/mcl_boats_oak_boat.png and b/mods/ENTITIES/mcl_boats/textures/mcl_boats_oak_boat.png differ diff --git a/mods/ENTITIES/mcl_falling_nodes/description.txt b/mods/ENTITIES/mcl_falling_nodes/description.txt new file mode 100644 index 00000000..8b436bf2 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/description.txt @@ -0,0 +1 @@ +Falling node entities, Minecraft-style diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua new file mode 100644 index 00000000..1ffc87b3 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -0,0 +1,276 @@ +local S = minetest.get_translator("mcl_falling_nodes") +local dmes = minetest.get_modpath("mcl_death_messages") ~= nil + +local get_falling_depth = function(self) + if not self._startpos then + -- Fallback + self._startpos = self.object:get_pos() + end + return self._startpos.y - vector.round(self.object:get_pos()).y +end + +local deal_falling_damage = function(self, dtime) + if minetest.get_item_group(self.node.name, "falling_node_damage") == 0 then + return + end + -- Cause damage to any player it hits. + -- Algorithm based on MC anvils. + -- TODO: Support smashing other objects, too. + local pos = self.object:get_pos() + if not self._startpos then + -- Fallback + self._startpos = pos + end + local objs = minetest.get_objects_inside_radius(pos, 1) + for _,v in ipairs(objs) do + local hp = v:get_hp() + if v:is_player() and hp ~= 0 then + if not self._hit_players then + self._hit_players = {} + end + local name = v:get_player_name() + local hit = false + for _,v in ipairs(self._hit_players) do + if name == v then + hit = true + end + end + if not hit then + table.insert(self._hit_players, name) + local way = self._startpos.y - pos.y + local damage = (way - 1) * 2 + damage = math.min(40, math.max(0, damage)) + if damage >= 1 then + hp = hp - damage + if hp < 0 then + hp = 0 + end + if v:is_player() then + -- TODO: Reduce damage if wearing a helmet + local msg + if minetest.get_item_group(self.node.name, "anvil") ~= 0 then + msg = S("@1 was smashed by a falling anvil.", v:get_player_name()) + else + msg = S("@1 was smashed by a falling block.", v:get_player_name()) + end + if dmes then + mcl_death_messages.player_damage(v, msg) + end + end + v:set_hp(hp, { type = "punch", from = "mod" }) + end + end + end + end +end + +minetest.register_entity(":__builtin:falling_node", { + initial_properties = { + visual = "wielditem", + visual_size = {x = 0.667, y = 0.667}, + textures = {}, + physical = true, + is_visible = false, + collide_with_objects = false, + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + + node = {}, + meta = {}, + + set_node = function(self, node, meta) + local def = minetest.registered_nodes[node.name] + -- Change falling node if definition tells us to + if def and def._mcl_falling_node_alternative then + node.name = def._mcl_falling_node_alternative + end + local glow + self.node = node + self.meta = meta or {} + -- Set correct entity yaw + if def and node.param2 ~= 0 then + if (def.paramtype2 == "facedir" or def.paramtype2 == "colorfacedir") then + self.object:set_yaw(minetest.dir_to_yaw(minetest.facedir_to_dir(node.param2))) + elseif (def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted") then + self.object:set_yaw(minetest.dir_to_yaw(minetest.wallmounted_to_dir(node.param2))) + end + if def.light_source then + glow = def.light_source + end + end + self.object:set_properties({ + is_visible = true, + textures = {node.name}, + glow = glow, + }) + end, + + get_staticdata = function(self) + local meta = self.meta + -- Workaround: Save inventory seperately from metadata. + -- Because Minetest crashes when a node with inventory gets deactivated + -- (GitHub issue #7020). + -- FIXME: Remove the _inv workaround when it is no longer needed + local inv + if meta then + inv = meta.inv + meta.inventory = nil + end + local ds = { + node = self.node, + meta = self.meta, + _inv = inv, + _startpos = self._startpos, + _hit_players = self._hit_players, + } + return minetest.serialize(ds) + end, + + on_activate = function(self, staticdata) + self.object:set_armor_groups({immortal = 1}) + + local ds = minetest.deserialize(staticdata) + if ds then + self._startpos = ds._startpos + self._hit_players = ds._hit_players + if ds.node then + local meta = ds.meta + meta.inventory = ds._inv + self:set_node(ds.node, meta) + else + self:set_node(ds) + end + elseif staticdata ~= "" then + self:set_node({name = staticdata}) + end + if not self._startpos then + self._startpos = self.object:get_pos() + end + self._startpos = vector.round(self._startpos) + end, + + on_step = function(self, dtime) + -- Set gravity + local acceleration = self.object:get_acceleration() + if not vector.equals(acceleration, {x = 0, y = -10, z = 0}) then + self.object:set_acceleration({x = 0, y = -10, z = 0}) + end + -- Turn to actual node when colliding with ground, or continue to move + local pos = self.object:get_pos() + + -- Portal check + local np = {x = pos.x, y = pos.y + 0.3, z = pos.z} + local n2 = minetest.get_node(np) + if n2.name == "mcl_portals:portal_end" then + -- TODO: Teleport falling node. + self.object:remove() + return + end + + -- Position of bottom center point + local bcp = {x = pos.x, y = pos.y - 0.7, z = pos.z} + -- Avoid bugs caused by an unloaded node below + local bcn = minetest.get_node_or_nil(bcp) + local bcd = bcn and minetest.registered_nodes[bcn.name] + + -- TODO: At this point, we did 2 get_nodes in 1 tick. + -- Figure out how to improve that (if it is a problem). + + if bcn and (not bcd or bcd.walkable or + (minetest.get_item_group(self.node.name, "float") ~= 0 and + bcd.liquidtype ~= "none")) then + if bcd and bcd.leveled and + bcn.name == self.node.name then + local addlevel = self.node.level + if not addlevel or addlevel <= 0 then + addlevel = bcd.leveled + end + if minetest.add_node_level(bcp, addlevel) == 0 then + if minetest.registered_nodes[self.node.name]._mcl_after_falling then + minetest.registered_nodes[self.node.name]._mcl_after_falling(bcp, get_falling_depth(self)) + end + deal_falling_damage(self, dtime) + self.object:remove() + return + end + elseif bcd and bcd.buildable_to and + (minetest.get_item_group(self.node.name, "float") == 0 or + bcd.liquidtype == "none") then + minetest.remove_node(bcp) + return + end + local nd = minetest.registered_nodes[n2.name] + if n2.name == "mcl_portals:portal_end" then + -- TODO: Teleport falling node. + + elseif (nd and nd.buildable_to == true) or minetest.get_item_group(self.node.name, "crush_after_fall") ~= 0 then + -- Replace destination node if it's buildable to + minetest.remove_node(np) + -- Run script hook + for _, callback in pairs(minetest.registered_on_dignodes) do + callback(np, n2) + end + local def = minetest.registered_nodes[self.node.name] + if def then + minetest.add_node(np, self.node) + if def._mcl_after_falling then + def._mcl_after_falling(np, get_falling_depth(self)) + end + if self.meta then + local meta = minetest.get_meta(np) + meta:from_table(self.meta) + end + if def.sounds and def.sounds.place and def.sounds.place.name then + minetest.sound_play(def.sounds.place, {pos = np}, true) + end + end + else + -- Drop the *falling node* as an item if the destination node is NOT buildable to + local drops = minetest.get_node_drops(self.node.name, "") + for _, dropped_item in pairs(drops) do + minetest.add_item(np, dropped_item) + end + end + deal_falling_damage(self, dtime) + self.object:remove() + minetest.check_for_falling(np) + return + end + local vel = self.object:get_velocity() + -- Fix position if entity does not move + if vector.equals(vel, {x = 0, y = 0, z = 0}) then + local npos = vector.round(self.object:get_pos()) + local npos2 = table.copy(npos) + npos2.y = npos2.y - 2 + local lownode = minetest.get_node(npos2) + -- Special check required for fences and walls, because of their overhigh collision box. + if minetest.get_item_group(lownode.name, "fence") == 1 or minetest.get_item_group(lownode.name, "wall") == 1 then + -- Instantly stop the node if it is above a fence/wall. This is needed + -- because the falling node collides early with a fence/wall node. + -- Hacky, because the falling node will teleport a short distance, instead + -- of smoothly fall on the fence post. + local npos3 = table.copy(npos) + npos3.y = npos3.y - 1 + minetest.add_node(npos3, self.node) + local def = minetest.registered_nodes[self.node.name] + if def then + if def._mcl_after_falling then + def._mcl_after_falling(npos3, get_falling_depth(self)) + end + if def.sounds and def.sounds.place and def.sounds.place.name then + minetest.sound_play(def.sounds.place, {pos = np}, true) + end + end + deal_falling_damage(self, dtime) + self.object:remove() + minetest.check_for_falling(npos3) + return + else + -- Normal position fix (expected case) + self.object:set_pos(npos) + end + end + + deal_falling_damage(self, dtime) + end +}) diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr new file mode 100644 index 00000000..71dfa4be --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 wurde von einem fallenden Amboss zerschmettert. +@1 was smashed by a falling block.=@1 wurde von einem fallenden Block zerschmettert. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr new file mode 100644 index 00000000..41cbf61b --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 fue aplastado por la caída de un yunque. +@1 was smashed by a falling block.=@1 fue aplastado por la caída de un bloque. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr new file mode 100644 index 00000000..781cd704 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 a été écrasé par une enclume qui tombait. +@1 was smashed by a falling block.=@1 a été écrasé par un bloc qui tombait. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/template.txt b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt new file mode 100644 index 00000000..4adabaf0 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.= +@1 was smashed by a falling block.= diff --git a/mods/ENTITIES/mcl_falling_nodes/mod.conf b/mods/ENTITIES/mcl_falling_nodes/mod.conf new file mode 100644 index 00000000..032b7502 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/mod.conf @@ -0,0 +1 @@ +name = mcl_falling_nodes diff --git a/mods/ENTITIES/mcl_item_entity/README.txt b/mods/ENTITIES/mcl_item_entity/README.txt index 66378de8..41e9e6e5 100644 --- a/mods/ENTITIES/mcl_item_entity/README.txt +++ b/mods/ENTITIES/mcl_item_entity/README.txt @@ -4,7 +4,7 @@ by PilzAdam Introduction: This mod adds Minecraft like drop/pick up of items to Minetest. -This mod has been forked from item_drop in the VoxBox subgame. +This mod has been forked from item_drop in the VoxBox game. License: Sourcecode: WTFPL (see below) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 75c914f1..7e10babc 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -55,29 +55,33 @@ end minetest.register_globalstep(function(dtime) for _,player in ipairs(minetest.get_connected_players()) do if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then - local pos = player:getpos() + local pos = player:get_pos() local inv = player:get_inventory() local checkpos = {x=pos.x,y=pos.y + item_drop_settings.player_collect_height,z=pos.z} --magnet and collection for _,object in ipairs(minetest.get_objects_inside_radius(checkpos, item_drop_settings.radius_magnet)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and (object:get_luaentity()._insta_collect or (object:get_luaentity().age > item_drop_settings.age)) then + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and object:get_luaentity()._magnet_timer and (object:get_luaentity()._insta_collect or (object:get_luaentity().age > item_drop_settings.age)) then object:get_luaentity()._magnet_timer = object:get_luaentity()._magnet_timer + dtime local collected = false if object:get_luaentity()._magnet_timer >= 0 and object:get_luaentity()._magnet_timer < item_drop_settings.magnet_time and inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then -- Collection - if vector.distance(checkpos, object:getpos()) <= item_drop_settings.radius_collect then - + if vector.distance(checkpos, object:get_pos()) <= item_drop_settings.radius_collect and not object:get_luaentity()._removed then + -- Ignore if itemstring is not set yet if object:get_luaentity().itemstring ~= "" then inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) minetest.sound_play("item_drop_pickup", { pos = pos, max_hear_distance = 16, gain = 1.0, - }) + }, true) check_pickup_achievements(object, player) - object:get_luaentity().itemstring = "" + + + -- Destroy entity + -- This just prevents this section to be run again because object:remove() doesn't remove the item immediately. + object:get_luaentity()._removed = true object:remove() collected = true end @@ -91,17 +95,17 @@ minetest.register_globalstep(function(dtime) -- Move object to player disable_physics(object, object:get_luaentity()) - local opos = object:getpos() + local opos = object:get_pos() local vec = vector.subtract(checkpos, opos) vec = vector.add(opos, vector.divide(vec, 2)) - object:moveto(vec) + object:move_to(vec) --fix eternally falling items minetest.after(0, function(object) local lua = object:get_luaentity() if lua then - object:setacceleration({x=0, y=0, z=0}) + object:set_acceleration({x=0, y=0, z=0}) end end, object) @@ -111,7 +115,8 @@ minetest.register_globalstep(function(dtime) if object:get_luaentity().init ~= true then object:get_luaentity().init = true minetest.after(1, function(args) - local player = args[1] + local playername = args[1] + local player = minetest.get_player_by_name(playername) local object = args[2] local lua = object:get_luaentity() if player == nil or not player:is_player() or object == nil or lua == nil or lua.itemstring == nil then @@ -119,20 +124,20 @@ minetest.register_globalstep(function(dtime) end if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then + if not object:get_luaentity()._removed then minetest.sound_play("item_drop_pickup", { pos = pos, max_hear_distance = 16, gain = 1.0, - }) + }, true) end check_pickup_achievements(object, player) - object:get_luaentity().itemstring = "" + object:get_luaentity()._removed = true object:remove() else enable_physics(object, object:get_luaentity()) end - end, {player, object}) + end, {player:get_player_name(), object}) end end end @@ -203,18 +208,25 @@ local check_can_drop = function(node_name, tool_capabilities) end function minetest.handle_node_drops(pos, drops, digger) - local doTileDrops = minetest.settings:get_bool("mcl_doTileDrops") or true - if minetest.settings:get_bool("creative_mode") or doTileDrops == false then + -- NOTE: This function override allows digger to be nil. + -- This means there is no digger. This is a special case which allows this function to be called + -- by hand. Creative Mode is intentionally ignored in this case. + + local doTileDrops = minetest.settings:get_bool("mcl_doTileDrops", true) + if (digger ~= nil and minetest.settings:get_bool("creative_mode")) or doTileDrops == false then return end -- Check if node will yield its useful drop by the digger's tool local dug_node = minetest.get_node(pos) - local tool = digger:get_wielded_item() - local toolcaps = tool:get_tool_capabilities() + local toolcaps + if digger ~= nil then + local tool = digger:get_wielded_item() + toolcaps = tool:get_tool_capabilities() - if not check_can_drop(dug_node.name, toolcaps) then - return + if not check_can_drop(dug_node.name, toolcaps) then + return + end end --[[ Special node drops when dug by shears by reading _mcl_shears_drop @@ -224,7 +236,7 @@ function minetest.handle_node_drops(pos, drops, digger) * table: Drop every itemstring in this table when dub by shears ]] local nodedef = minetest.registered_nodes[dug_node.name] - if toolcaps.groupcaps and toolcaps.groupcaps.shearsy_dig and nodedef._mcl_shears_drop then + if toolcaps ~= nil and toolcaps.groupcaps and toolcaps.groupcaps.shearsy_dig and nodedef._mcl_shears_drop then if nodedef._mcl_shears_drop == true then drops = { dug_node.name } else @@ -233,16 +245,22 @@ function minetest.handle_node_drops(pos, drops, digger) end for _,item in ipairs(drops) do - local count, name + local count if type(item) == "string" then - count = 1 - name = item + count = ItemStack(item):get_count() else count = item:get_count() - name = item:get_name() end + local drop_item = ItemStack(item) + drop_item:set_count(1) for i=1,count do - local obj = minetest.add_item(pos, name) + local dpos = table.copy(pos) + -- Apply offset for plantlike_rooted nodes because of their special shape + if nodedef and nodedef.drawtype == "plantlike_rooted" and nodedef.walkable then + dpos.y = dpos.y + 1 + end + -- Spawn item and apply random speed + local obj = minetest.add_item(dpos, drop_item) if obj ~= nil then local x = math.random(1, 5) if math.random(1,2) == 1 then @@ -252,7 +270,7 @@ function minetest.handle_node_drops(pos, drops, digger) if math.random(1,2) == 1 then z = -z end - obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) + obj:set_velocity({x=1/x, y=obj:get_velocity().y, z=1/z}) end end end @@ -268,12 +286,12 @@ function minetest.item_drop(itemstack, dropper, pos) cs = 1 end local item = itemstack:take_item(cs) - local obj = core.add_item(p, item) + local obj = minetest.add_item(p, item) if obj then v.x = v.x*4 v.y = v.y*4 + 2 v.z = v.z*4 - obj:setvelocity(v) + obj:set_velocity(v) -- Force collection delay obj:get_luaentity()._insta_collect = false return itemstack @@ -283,17 +301,18 @@ end --modify builtin:item -local time_to_live = tonumber(core.setting_get("item_entity_ttl")) +local time_to_live = tonumber(minetest.settings:get("item_entity_ttl")) if not time_to_live then time_to_live = 300 end -core.register_entity(":__builtin:item", { +minetest.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}, + pointable = false, visual = "wielditem", visual_size = {x = 0.4, y = 0.4}, textures = {""}, @@ -303,17 +322,27 @@ core.register_entity(":__builtin:item", { infotext = "", }, + -- Itemstring of dropped item. The empty string is used when the item is not yet initialized yet. + -- The itemstring MUST be set immediately to a non-empty string after creating the entity. + -- The hand is NOT permitted as dropped item. ;-) + -- Item entities will be deleted if they still have an empty itemstring on their first on_step tick. itemstring = '', + + -- If true, item will fall physical_state = true, - _flowing = false, -- item entity is currently flowing - -- States: - -- * "magnet": Attracted to a nearby player or item - -- * "flowing": Moving in a flowing liquid - -- * "normal": Affected by gravitiy + + -- If item entity is currently flowing in water + _flowing = false, + + -- Number of seconds this item entity has existed so far age = 0, set_item = function(self, itemstring) self.itemstring = itemstring + if self.itemstring == "" then + -- item not yet known + return + end local stack = ItemStack(itemstring) local count = stack:get_count() local max_count = stack:get_stack_max() @@ -321,8 +350,6 @@ core.register_entity(":__builtin:item", { count = max_count self.itemstring = stack:get_name().." "..max_count end - local s = 0.2 + 0.1 * (count / max_count) - local c = s local itemtable = stack:to_table() local itemname = nil local description = "" @@ -331,11 +358,18 @@ core.register_entity(":__builtin:item", { end local item_texture = nil local item_type = "" - if core.registered_items[itemname] then - item_texture = core.registered_items[itemname].inventory_image - item_type = core.registered_items[itemname].type - description = core.registered_items[itemname].description + local glow + local def = minetest.registered_items[itemname] + if def then + item_texture = def.inventory_image + item_type = def.type + description = def.description + glow = def.light_source end + local s = 0.2 + 0.1 * (count / max_count) + local wield_scale = (def and def.wield_scale and def.wield_scale.x) or 1 + local c = s + s = s / wield_scale local prop = { is_visible = true, visual = "wielditem", @@ -344,6 +378,7 @@ core.register_entity(":__builtin:item", { collisionbox = {-c, -c, -c, c, c, c}, automatic_rotate = math.pi * 0.5, infotext = description, + glow = glow, } self.object:set_properties(prop) if item_drop_settings.random_item_velocity == true then @@ -351,7 +386,7 @@ core.register_entity(":__builtin:item", { if not self or not self.object or not self.object:get_luaentity() then return end - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() if vel and vel.x == 0 and vel.z == 0 then local x = math.random(1, 5) if math.random(1,2) == 1 then @@ -362,7 +397,7 @@ core.register_entity(":__builtin:item", { z = -z end local y = math.random(2,4) - self.object:setvelocity({x=1/x, y=y, z=1/z}) + self.object:set_velocity({x=1/x, y=y, z=1/z}) end end, self) end @@ -370,18 +405,19 @@ core.register_entity(":__builtin:item", { end, get_staticdata = function(self) - return core.serialize({ + return minetest.serialize({ itemstring = self.itemstring, always_collect = self.always_collect, age = self.age, _insta_collect = self._insta_collect, _flowing = self._flowing, + _removed = self._removed, }) end, on_activate = function(self, staticdata, dtime_s) if string.sub(staticdata, 1, string.len("return")) == "return" then - local data = core.deserialize(staticdata) + local data = minetest.deserialize(staticdata) if data and type(data) == "table" then self.itemstring = data.itemstring self.always_collect = data.always_collect @@ -394,10 +430,16 @@ core.register_entity(":__builtin:item", { -- If true, can collect item without delay self._insta_collect = data._insta_collect self._flowing = data._flowing + self._removed = data._removed end else self.itemstring = staticdata end + if self._removed then + self._removed = true + self.object:remove() + return + end if self._insta_collect == nil then -- Intentionally default, since delayed collection is rare self._insta_collect = true @@ -415,73 +457,72 @@ core.register_entity(":__builtin:item", { self._forcetimer = 0 self.object:set_armor_groups({immortal = 1}) - self.object:setvelocity({x = 0, y = 2, z = 0}) - self.object:setacceleration({x = 0, y = -get_gravity(), z = 0}) + self.object:set_velocity({x = 0, y = 2, z = 0}) + self.object:set_acceleration({x = 0, y = -get_gravity(), z = 0}) self:set_item(self.itemstring) end, - try_merge_with = function(self, own_stack, object, obj) - local stack = ItemStack(obj.itemstring) - if own_stack:get_name() == stack:get_name() and stack:get_free_space() > 0 then - local overflow = false - local count = stack:get_count() + own_stack:get_count() - local max_count = stack:get_stack_max() - if count > max_count then - overflow = true - count = count - max_count - else - self.itemstring = '' - end - local pos = object:getpos() - pos.y = pos.y + (count - stack:get_count()) / max_count * 0.15 - object:moveto(pos, false) - local s, c - local max_count = stack:get_stack_max() - local name = stack:get_name() - if not overflow then - obj.itemstring = name .. " " .. count - s = 0.2 + 0.1 * (count / max_count) - c = s - object:set_properties({ - visual_size = {x = s, y = s}, - collisionbox = {-c, -c, -c, c, c, c} - }) - self.object:remove() - -- merging succeeded - return true - else - s = 0.4 - c = 0.3 - object:set_properties({ - visual_size = {x = s, y = s}, - collisionbox = {-c, -c, -c, c, c, c} - }) - obj.itemstring = name .. " " .. max_count - s = 0.2 + 0.1 * (count / max_count) - c = s - self.object:set_properties({ - visual_size = {x = s, y = s}, - collisionbox = {-c, -c, -c, c, c, c} - }) - self.itemstring = name .. " " .. count - end + try_merge_with = function(self, own_stack, object, entity) + if self.age == entity.age or entity._removed then + -- Can not merge with itself and remove entity + return false end - -- merging didn't succeed - return false + + 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 + -- Can not merge different or full stack + return false + 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() + pos.y = pos.y + ((total_count - count) / max_count) * 0.15 + self.object:move_to(pos) + + self.age = 0 -- Handle as new entity + own_stack:set_count(total_count) + self:set_item(own_stack:to_string()) + + entity._removed = true + object:remove() + return true end, on_step = function(self, dtime) + if self._removed then + return + end self.age = self.age + dtime if self._collector_timer ~= nil then self._collector_timer = self._collector_timer + dtime end if time_to_live > 0 and self.age > time_to_live then - self.itemstring = '' + self._removed = true self.object:remove() return end - local p = self.object:getpos() - local node = core.get_node_or_nil(p) + -- Delete corrupted item entities. The itemstring MUST be non-empty on its first step, + -- otherwise there might have some data corruption. + if self.itemstring == "" then + minetest.log("warning", "Item entity with empty itemstring found at "..minetest.pos_to_string(self.object:get_pos()).. "! Deleting it now.") + self._removed = true + self.object:remove() + end + + local p = self.object:get_pos() + local node = minetest.get_node_or_nil(p) local in_unloaded = (node == nil) -- If no collector was found for a long enough time, declare the magnet as disabled @@ -496,14 +537,17 @@ core.register_entity(":__builtin:item", { return end - -- Destroy item in lava or special nodes + -- Destroy item in lava, fire or special nodes local nn = node.name local def = minetest.registered_nodes[nn] - if (def and def.groups and (def.groups.lava or def.groups.destroys_items == 1)) then - -- Special effect for lava - if def.groups.lava then - minetest.sound_play("builtin_item_lava", {pos = self.object:getpos(), gain = 0.5}) + local lg = minetest.get_item_group(nn, "lava") + local fg = minetest.get_item_group(nn, "fire") + local dg = minetest.get_item_group(nn, "destroys_items") + if (def and (lg ~= 0 or fg ~= 0 or dg == 1)) then + if dg ~= 2 then + minetest.sound_play("builtin_item_lava", {pos = self.object:get_pos(), gain = 0.5}, true) end + self._removed = true self.object:remove() return end @@ -511,8 +555,8 @@ core.register_entity(":__builtin:item", { -- Push item out when stuck inside solid opaque node if def and def.walkable and def.groups and def.groups.opaque == 1 then local shootdir - local cx = p.x % 1 - local cz = p.z % 1 + local cx = (p.x % 1) - 0.5 + local cz = (p.z % 1) - 0.5 local order = {} -- First prepare the order in which the 4 sides are to be checked. @@ -520,7 +564,7 @@ core.register_entity(":__builtin:item", { -- 2nd: other direction -- 3rd and 4th: other axis local cxcz = function(o, cw, one, zero) - if cw > 0 then + if cw < 0 then table.insert(o, { [one]=1, y=0, [zero]=0 }) table.insert(o, { [one]=-1, y=0, [zero]=0 }) else @@ -529,7 +573,7 @@ core.register_entity(":__builtin:item", { end return o end - if math.abs(cx) > math.abs(cz) then + if math.abs(cx) < math.abs(cz) then order = cxcz(order, cx, "x", "z") order = cxcz(order, cz, "z", "x") else @@ -558,8 +602,8 @@ core.register_entity(":__builtin:item", { -- Set new item moving speed accordingly local newv = vector.multiply(shootdir, 3) - self.object:setacceleration({x = 0, y = 0, z = 0}) - self.object:setvelocity(newv) + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity(newv) disable_physics(self.object, self, false, false) @@ -612,8 +656,8 @@ core.register_entity(":__builtin:item", { local f = 1.39 -- Set new item moving speed into the direciton of the liquid local newv = vector.multiply(vec, f) - self.object:setacceleration({x = 0, y = 0, z = 0}) - self.object:setvelocity({x = newv.x, y = -0.22, z = newv.z}) + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z}) self.physical_state = true self._flowing = true @@ -631,13 +675,13 @@ core.register_entity(":__builtin:item", { -- If node is not registered or node is walkably solid and resting on nodebox local nn = minetest.get_node({x=p.x, y=p.y-0.5, z=p.z}).name - local v = self.object:getvelocity() + local v = self.object:get_velocity() - if not core.registered_nodes[nn] or core.registered_nodes[nn].walkable and v.y == 0 then + if not minetest.registered_nodes[nn] or minetest.registered_nodes[nn].walkable and v.y == 0 then if self.physical_state then local own_stack = ItemStack(self.object:get_luaentity().itemstring) -- Merge with close entities of the same item - for _, object in ipairs(core.get_objects_inside_radius(p, 0.8)) do + for _, object in ipairs(minetest.get_objects_inside_radius(p, 0.8)) do local obj = object:get_luaentity() if obj and obj.name == "__builtin:item" and obj.physical_state == false then @@ -657,7 +701,3 @@ core.register_entity(":__builtin:item", { -- Note: on_punch intentionally left out. The player should *not* be able to collect items by punching }) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "mcl_item_entity loaded") -end diff --git a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.1.ogg b/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.1.ogg index 2ae432d5..8010ff0a 100644 Binary files a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.1.ogg and b/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.1.ogg differ diff --git a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.2.ogg b/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.2.ogg index f58bf08e..a5087ab7 100644 Binary files a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.2.ogg and b/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.2.ogg differ diff --git a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.3.ogg b/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.3.ogg index cf57c94c..f234a482 100644 Binary files a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.3.ogg and b/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.3.ogg differ diff --git a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.4.ogg b/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.4.ogg index bfe99d9a..6436f267 100644 Binary files a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.4.ogg and b/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.4.ogg differ diff --git a/mods/ENTITIES/mcl_minecarts/README.txt b/mods/ENTITIES/mcl_minecarts/README.txt index b4b77f21..112cbd30 100644 --- a/mods/ENTITIES/mcl_minecarts/README.txt +++ b/mods/ENTITIES/mcl_minecarts/README.txt @@ -3,26 +3,19 @@ mcl_minecarts Based on the mod "boost_carts" by Krock. Target: Run smoothly and do not use too much CPU. -TODO: -- Minecraft-like physics -- Add activator rail -- Add more rail textures -- Add loaded minecarts - License of source code: ----------------------- MIT License +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 SmallJoker +Copyright (C) 2012-2016 Various Minetest developers and contributors + Authors/licenses of media files: ----------------------- Minecart model: 22i (GPLv3) -Wuzzy (based on Pixel Perfection 1.11, MIT License): - carts_rail_crossing_pwr.png - carts_rail_curved_pwr.png - carts_rail_t_junction_pwr.png - -Other texture files (CC BY-SA 3.0: +Texture files (CC BY-SA 3.0): XSSheep diff --git a/mods/ENTITIES/mcl_minecarts/depends.txt b/mods/ENTITIES/mcl_minecarts/depends.txt index 5774b1e5..cdf7feb5 100644 --- a/mods/ENTITIES/mcl_minecarts/depends.txt +++ b/mods/ENTITIES/mcl_minecarts/depends.txt @@ -1,6 +1,12 @@ +mcl_explosions mcl_core mcl_sounds mcl_player mcl_achievements -mesecons? +mcl_chests +mcl_furnaces +mesecons_commandblock +mcl_hoppers +mcl_tnt +mesecons doc_identifier? diff --git a/mods/ENTITIES/mcl_minecarts/functions.lua b/mods/ENTITIES/mcl_minecarts/functions.lua index 1a298841..42cdecd1 100644 --- a/mods/ENTITIES/mcl_minecarts/functions.lua +++ b/mods/ENTITIES/mcl_minecarts/functions.lua @@ -138,13 +138,3 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) return {x=0, y=0, z=0} end -function mcl_minecarts:boost_rail(pos, amount) - minetest.get_meta(pos):set_string("cart_acceleration", tostring(amount)) - for _,obj_ in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do - if not obj_:is_player() and - obj_:get_luaentity() and - obj_:get_luaentity().name == "mcl_minecarts:minecart" then - obj_:get_luaentity():on_punch() - end - end -end diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 6766e843..ca1791d9 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -1,324 +1,792 @@ +local S = minetest.get_translator("mcl_minecarts") + mcl_minecarts = {} mcl_minecarts.modpath = minetest.get_modpath("mcl_minecarts") mcl_minecarts.speed_max = 10 - -local vector_floor = function(v) - return { - x = math.floor(v.x), - y = math.floor(v.y), - z = math.floor(v.z) - } -end +mcl_minecarts.check_float_time = 15 dofile(mcl_minecarts.modpath.."/functions.lua") dofile(mcl_minecarts.modpath.."/rails.lua") -mcl_minecarts.cart = { - physical = false, - collisionbox = {-10/16., -0.5, -10/16, 10/16, 0.25, 10/16}, - visual = "mesh", - mesh = "mcl_minecarts_minecart.b3d", - visual_size = {x=1, y=1}, - textures = {"mcl_minecarts_minecart.png"}, - - _driver = nil, - _punched = false, -- used to re-send _velocity and position - _velocity = {x=0, y=0, z=0}, -- only used on punch - _start_pos = nil, -- Used to calculate distance for “On A Rail” achievement - _old_dir = {x=0, y=0, z=0}, - _old_pos = nil, - _old_switch = 0, - _railtype = nil, -} - -function mcl_minecarts.cart:on_rightclick(clicker) - if not clicker or not clicker:is_player() then +local function detach_driver(self) + if not self._driver then return end - local player_name = clicker:get_player_name() - if self._driver and player_name == self._driver then - self._driver = nil - self._start_pos = nil - clicker:set_detach() - elseif not self._driver then - self._driver = player_name - self._start_pos = self.object:getpos() - mcl_player.player_attached[player_name] = true - clicker:set_attach(self.object, "", {x=0, y=3, z=0}, {x=0, y=0, z=0}) + mcl_player.player_attached[self._driver] = nil + local player = minetest.get_player_by_name(self._driver) + self._driver = nil + self._start_pos = nil + if player then + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + mcl_player.player_set_animation(player, "stand" , 30) end end -function mcl_minecarts.cart:on_activate(staticdata, dtime_s) +local function activate_tnt_minecart(self, timer) + if self._boomtimer then + return + end self.object:set_armor_groups({immortal=1}) -end - -function mcl_minecarts.cart:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) - local pos = self.object:getpos() - if not self._railtype then - local node = minetest.get_node(vector_floor(pos)).name - self._railtype = minetest.get_item_group(node, "connect_to_raillike") - end - - if not puncher or not puncher:is_player() then - local cart_dir = mcl_minecarts:get_rail_direction(pos, {x=1, y=0, z=0}, nil, nil, self._railtype) - if vector.equals(cart_dir, {x=0, y=0, z=0}) then - return - end - self._velocity = vector.multiply(cart_dir, 3) - self._old_pos = nil - self._punched = true - return - end - - if puncher:get_player_control().sneak then - if self._driver then - if self._old_pos then - self.object:setpos(self._old_pos) - end - mcl_player.player_attached[self._driver] = nil - local player = minetest.get_player_by_name(self._driver) - if player then - player:set_detach() - end - end - - if not minetest.settings:get_bool("creative_mode") then - minetest.add_item(self.object:getpos(), "mcl_minecarts:minecart") - end - self.object:remove() - return - end - - local vel = self.object:getvelocity() - if puncher:get_player_name() == self._driver then - if math.abs(vel.x + vel.z) > 7 then - return - end - end - - local punch_dir = mcl_minecarts:velocity_to_dir(puncher:get_look_dir()) - punch_dir.y = 0 - local cart_dir = mcl_minecarts:get_rail_direction(pos, punch_dir, nil, nil, self._railtype) - if vector.equals(cart_dir, {x=0, y=0, z=0}) then - return - end - - time_from_last_punch = math.min(time_from_last_punch, tool_capabilities.full_punch_interval) - local f = 3 * (time_from_last_punch / tool_capabilities.full_punch_interval) - - self._velocity = vector.multiply(cart_dir, f) - self._old_pos = nil - self._punched = true -end - -function mcl_minecarts.cart:on_step(dtime) - local vel = self.object:getvelocity() - local update = {} - if self._punched then - vel = vector.add(vel, self._velocity) - self.object:setvelocity(vel) - self._old_dir.y = 0 - elseif vector.equals(vel, {x=0, y=0, z=0}) then - return - end - - local dir, last_switch = nil, nil - local pos = self.object:getpos() - if self._old_pos and not self._punched then - local flo_pos = vector_floor(pos) - local flo_old = vector_floor(self._old_pos) - if vector.equals(flo_pos, flo_old) then - return - end - end - - local ctrl, player = nil, nil - if self._driver then - player = minetest.get_player_by_name(self._driver) - if player then - ctrl = player:get_player_control() - end - end - if self._old_pos then - local diff = vector.subtract(self._old_pos, pos) - for _,v in ipairs({"x","y","z"}) do - if math.abs(diff[v]) > 1.1 then - local expected_pos = vector.add(self._old_pos, self._old_dir) - dir, last_switch = mcl_minecarts:get_rail_direction(pos, self._old_dir, ctrl, self._old_switch, self._railtype) - if vector.equals(dir, {x=0, y=0, z=0}) then - dir = false - pos = vector.new(expected_pos) - update.pos = true - end - break - end - end - end - - if vel.y == 0 then - for _,v in ipairs({"x", "z"}) do - if vel[v] ~= 0 and math.abs(vel[v]) < 0.9 then - vel[v] = 0 - update.vel = true - end - end - end - - local cart_dir = mcl_minecarts:velocity_to_dir(vel) - local max_vel = mcl_minecarts.speed_max - if not dir then - dir, last_switch = mcl_minecarts:get_rail_direction(pos, cart_dir, ctrl, self._old_switch, self._railtype) - end - - local new_acc = {x=0, y=0, z=0} - if vector.equals(dir, {x=0, y=0, z=0}) then - vel = {x=0, y=0, z=0} - update.vel = true + if timer then + self._boomtimer = timer else - -- If the direction changed - if dir.x ~= 0 and self._old_dir.z ~= 0 then - vel.x = dir.x * math.abs(vel.z) - vel.z = 0 - pos.z = math.floor(pos.z + 0.5) - update.pos = true + self._boomtimer = tnt.BOOMTIMER + end + self.object:set_properties({textures = { + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_minecarts_minecart.png", + }}) + self._blinktimer = tnt.BLINKTIMER + minetest.sound_play("tnt_ignite", {pos = self.object:get_pos(), gain = 1.0, max_hear_distance = 15}, true) +end + +local activate_normal_minecart = detach_driver + +-- Table for item-to-entity mapping. Keys: itemstring, Values: Corresponding entity ID +local entity_mapping = {} + +local function register_entity(entity_id, mesh, textures, drop, on_rightclick, on_activate_by_rail) + local cart = { + physical = false, + collisionbox = {-10/16., -0.5, -10/16, 10/16, 0.25, 10/16}, + visual = "mesh", + mesh = mesh, + visual_size = {x=1, y=1}, + textures = textures, + + on_rightclick = on_rightclick, + + _driver = nil, -- player who sits in and controls the minecart (only for minecart!) + _punched = false, -- used to re-send _velocity and position + _velocity = {x=0, y=0, z=0}, -- only used on punch + _start_pos = nil, -- Used to calculate distance for “On A Rail” achievement + _last_float_check = nil, -- timestamp of last time the cart was checked to be still on a rail + _fueltime = nil, -- how many seconds worth of fuel is left. Only used by minecart with furnace + _boomtimer = nil, -- how many seconds are left before exploding + _blinktimer = nil, -- how many seconds are left before TNT blinking + _blink = false, -- is TNT blink texture active? + _old_dir = {x=0, y=0, z=0}, + _old_pos = nil, + _old_vel = {x=0, y=0, z=0}, + _old_switch = 0, + _railtype = nil, + } + + function cart:on_activate(staticdata, dtime_s) + -- Initialize + local data = minetest.deserialize(staticdata) + if type(data) == "table" then + self._railtype = data._railtype end - if dir.z ~= 0 and self._old_dir.x ~= 0 then - vel.z = dir.z * math.abs(vel.x) - vel.x = 0 - pos.x = math.floor(pos.x + 0.5) - update.pos = true + self.object:set_armor_groups({immortal=1}) + + -- Activate cart if on activator rail + if self.on_activate_by_rail then + local pos = self.object:get_pos() + local node = minetest.get_node(vector.floor(pos)) + if node.name == "mcl_minecarts:activator_rail_on" then + self:on_activate_by_rail() + end end - -- Up, down? - if dir.y ~= self._old_dir.y then - vel.y = dir.y * math.abs(vel.x + vel.z) - pos = vector.round(pos) - update.pos = true + end + + function cart:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:get_pos() + if not self._railtype then + local node = minetest.get_node(vector.floor(pos)).name + self._railtype = minetest.get_item_group(node, "connect_to_raillike") end - - -- Slow down or speed up.. - local acc = dir.y * -1.8 - - local speed_mod = tonumber(minetest.get_meta(pos):get_string("cart_acceleration")) - if speed_mod and speed_mod ~= 0 then - if speed_mod > 0 then - for _,v in ipairs({"x","y","z"}) do - if math.abs(vel[v]) >= max_vel then - speed_mod = 0 - break + + if not puncher or not puncher:is_player() then + local cart_dir = mcl_minecarts:get_rail_direction(pos, {x=1, y=0, z=0}, nil, nil, self._railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self._velocity = vector.multiply(cart_dir, 3) + self._old_pos = nil + self._punched = true + return + end + + -- Punch+sneak: Pick up minecart (unless TNT was ignited) + if puncher:get_player_control().sneak and not self._boomtimer then + if self._driver then + if self._old_pos then + self.object:set_pos(self._old_pos) + end + detach_driver(self) + end + + -- Disable detector rail + local rou_pos = vector.round(pos) + local node = minetest.get_node(rou_pos) + if node.name == "mcl_minecarts:detector_rail_on" then + local newnode = {name="mcl_minecarts:detector_rail", param2 = node.param2} + minetest.swap_node(rou_pos, newnode) + mesecon.receptor_off(rou_pos) + end + + -- Drop items and remove cart entity + if not minetest.settings:get_bool("creative_mode") then + for d=1, #drop do + minetest.add_item(self.object:get_pos(), drop[d]) + end + elseif puncher and puncher:is_player() then + local inv = puncher:get_inventory() + for d=1, #drop do + if not inv:contains_item("main", drop[d]) then + inv:add_item("main", drop[d]) end end end - acc = acc + (speed_mod * 8) - else - acc = acc - 0.4 - end - - new_acc = vector.multiply(dir, acc) - end - - self.object:setacceleration(new_acc) - self._old_pos = vector.new(pos) - self._old_dir = vector.new(dir) - self._old_switch = last_switch - - -- Limits - for _,v in ipairs({"x","y","z"}) do - if math.abs(vel[v]) > max_vel then - vel[v] = mcl_minecarts:get_sign(vel[v]) * max_vel - update.vel = true - end - end - -- Give achievement when player reached a distance of 1000 nodes from the start position - if self._driver and (vector.distance(self._start_pos, pos) >= 1000) then - awards.unlock(self._driver, "mcl:onARail") - end - - if update.pos or self._punched then - 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:setyaw(yaw * math.pi) - end - - if self._punched then - self._punched = false - end - - if not (update.vel or update.pos) then - return - end - - - 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) - - self.object:setvelocity(vel) - if update.pos then - self.object:setpos(pos) - end - update = nil -end - -minetest.register_entity("mcl_minecarts:minecart", mcl_minecarts.cart) -minetest.register_craftitem("mcl_minecarts:minecart", { - description = "Minecart", - _doc_items_longdesc = "Minecarts can be used for a quick transportion on rails." .. "\n" .. - "Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.", - _doc_items_usagehelp = "You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving." .. "\n" .. - "To obtain the minecart, punch it while holding down the sneak key.", - - inventory_image = "mcl_minecarts_minecart_normal.png", - wield_image = "mcl_minecarts_minecart_normal.png", - stack_max = 1, - on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.type == "node" then + self.object:remove() return end - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if placer and not placer: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, placer, itemstack) or itemstack + local vel = self.object:get_velocity() + if puncher:get_player_name() == self._driver then + if math.abs(vel.x + vel.z) > 7 then + return end end - local railpos - if mcl_minecarts:is_rail(pointed_thing.under) then - railpos = pointed_thing.under - elseif mcl_minecarts:is_rail(pointed_thing.above) then - railpos = pointed_thing.under - else + local punch_dir = mcl_minecarts:velocity_to_dir(puncher:get_look_dir()) + punch_dir.y = 0 + local cart_dir = mcl_minecarts: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 cart = minetest.add_entity(railpos, "mcl_minecarts:minecart") - local railtype = minetest.get_item_group(node.name, "connect_to_raillike") - local cart_dir = mcl_minecarts:get_rail_direction(railpos, {x=1, y=0, z=0}, nil, nil, railtype) - cart:setyaw(minetest.dir_to_yaw(cart_dir)) - - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end - return itemstack - end, - groups = { minecart = 1, transport = 1}, -}) -if minetest.get_modpath("doc_identifier") ~= nil then - doc.sub.identifier.register_object("mcl_minecarts:minecart", "craftitems", "mcl_minecarts:minecart") + time_from_last_punch = math.min(time_from_last_punch, tool_capabilities.full_punch_interval) + local f = 3 * (time_from_last_punch / tool_capabilities.full_punch_interval) + + self._velocity = vector.multiply(cart_dir, f) + self._old_pos = nil + self._punched = true + end + + cart.on_activate_by_rail = on_activate_by_rail + + function cart:on_step(dtime) + local vel = self.object:get_velocity() + local update = {} + if self._last_float_check == nil then + self._last_float_check = 0 + else + self._last_float_check = self._last_float_check + dtime + end + local pos, rou_pos, node + -- Drop minecart if it isn't on a rail anymore + if self._last_float_check >= mcl_minecarts.check_float_time then + pos = self.object:get_pos() + rou_pos = vector.round(pos) + node = minetest.get_node(rou_pos) + local g = minetest.get_item_group(node.name, "connect_to_raillike") + if g ~= self._railtype and self._railtype ~= nil then + -- Detach driver + if self._driver then + if self._old_pos then + self.object:set_pos(self._old_pos) + end + mcl_player.player_attached[self._driver] = nil + local player = minetest.get_player_by_name(self._driver) + if player then + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + end + end + + -- Explode if already ignited + if self._boomtimer then + self.object:remove() + mcl_explosions.explode(pos, 4, { drop_chance = 1.0 }) + return + end + + -- Drop items and remove cart entity + if not minetest.settings:get_bool("creative_mode") then + for d=1, #drop do + minetest.add_item(self.object:get_pos(), drop[d]) + end + end + + self.object:remove() + return + end + self._last_float_check = 0 + end + + -- Update furnace stuff + if self._fueltime and self._fueltime > 0 then + self._fueltime = self._fueltime - dtime + if self._fueltime <= 0 then + self.object:set_properties({textures = + { + "default_furnace_top.png", + "default_furnace_top.png", + "default_furnace_front.png", + "default_furnace_side.png", + "default_furnace_side.png", + "default_furnace_side.png", + "mcl_minecarts_minecart.png", + }}) + self._fueltime = 0 + end + end + local has_fuel = self._fueltime and self._fueltime > 0 + + -- Update TNT stuff + if self._boomtimer then + -- Explode + self._boomtimer = self._boomtimer - dtime + local pos = self.object:get_pos() + if self._boomtimer <= 0 then + self.object:remove() + mcl_explosions.explode(pos, 4, { drop_chance = 1.0 }) + return + else + tnt.smoke_step(pos) + end + end + if self._blinktimer then + self._blinktimer = self._blinktimer - dtime + if self._blinktimer <= 0 then + self._blink = not self._blink + if self._blink then + self.object:set_properties({textures = + { + "default_tnt_top.png", + "default_tnt_bottom.png", + "default_tnt_side.png", + "default_tnt_side.png", + "default_tnt_side.png", + "default_tnt_side.png", + "mcl_minecarts_minecart.png", + }}) + else + self.object:set_properties({textures = + { + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_tnt_blink.png", + "mcl_minecarts_minecart.png", + }}) + end + self._blinktimer = tnt.BLINKTIMER + end + end + + 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}) and (not has_fuel) then + return + end + + local dir, last_switch = nil, nil + if not pos then + pos = self.object:get_pos() + end + if self._old_pos and not self._punched then + local flo_pos = vector.floor(pos) + local flo_old = vector.floor(self._old_pos) + if vector.equals(flo_pos, flo_old) and (not has_fuel) then + return + -- Prevent querying the same node over and over again + end + + if not rou_pos then + rou_pos = vector.round(pos) + end + local rou_old = vector.round(self._old_pos) + if not node then + node = minetest.get_node(rou_pos) + end + local node_old = minetest.get_node(rou_old) + + -- Update detector rails + if node.name == "mcl_minecarts:detector_rail" then + local newnode = {name="mcl_minecarts:detector_rail_on", param2 = node.param2} + minetest.swap_node(rou_pos, newnode) + mesecon.receptor_on(rou_pos) + end + if node_old.name == "mcl_minecarts:detector_rail_on" then + local newnode = {name="mcl_minecarts:detector_rail", param2 = node_old.param2} + minetest.swap_node(rou_old, newnode) + mesecon.receptor_off(rou_old) + end + -- Activate minecart if on activator rail + if node_old.name == "mcl_minecarts:activator_rail_on" and self.on_activate_by_rail then + self:on_activate_by_rail() + end + end + + local ctrl, player = nil, nil + if self._driver then + player = minetest.get_player_by_name(self._driver) + if player then + ctrl = player:get_player_control() + end + end + + -- Stop cart if velocity vector flips + if self._old_vel and self._old_vel.y == 0 and + (self._old_vel.x * vel.x < 0 or self._old_vel.z * vel.z < 0) then + self._old_vel = {x = 0, y = 0, z = 0} + self._old_pos = pos + self.object:set_velocity(vector.new()) + self.object:set_acceleration(vector.new()) + return + end + self._old_vel = vector.new(vel) + + if self._old_pos then + local diff = vector.subtract(self._old_pos, pos) + for _,v in ipairs({"x","y","z"}) do + if math.abs(diff[v]) > 1.1 then + local expected_pos = vector.add(self._old_pos, self._old_dir) + dir, last_switch = mcl_minecarts:get_rail_direction(pos, self._old_dir, ctrl, self._old_switch, self._railtype) + if vector.equals(dir, {x=0, y=0, z=0}) then + dir = false + pos = vector.new(expected_pos) + update.pos = true + end + break + end + end + end + + if vel.y == 0 then + for _,v in ipairs({"x", "z"}) do + if vel[v] ~= 0 and math.abs(vel[v]) < 0.9 then + vel[v] = 0 + update.vel = true + end + end + end + + local cart_dir = mcl_minecarts:velocity_to_dir(vel) + local max_vel = mcl_minecarts.speed_max + if not dir then + dir, last_switch = mcl_minecarts:get_rail_direction(pos, cart_dir, ctrl, self._old_switch, self._railtype) + end + + local new_acc = {x=0, y=0, z=0} + if vector.equals(dir, {x=0, y=0, z=0}) and not has_fuel then + vel = {x=0, y=0, z=0} + update.vel = true + else + -- If the direction changed + if dir.x ~= 0 and self._old_dir.z ~= 0 then + vel.x = dir.x * math.abs(vel.z) + vel.z = 0 + pos.z = math.floor(pos.z + 0.5) + update.pos = true + end + if dir.z ~= 0 and self._old_dir.x ~= 0 then + vel.z = dir.z * math.abs(vel.x) + vel.x = 0 + pos.x = math.floor(pos.x + 0.5) + update.pos = true + end + -- Up, down? + if dir.y ~= self._old_dir.y then + vel.y = dir.y * math.abs(vel.x + vel.z) + pos = vector.round(pos) + update.pos = true + end + + -- Slow down or speed up + local acc = dir.y * -1.8 + local friction = 0.4 + local speed_mod = minetest.registered_nodes[minetest.get_node(pos).name]._rail_acceleration + + acc = acc - friction + + if has_fuel then + acc = acc + 0.6 + end + + if speed_mod and speed_mod ~= 0 then + acc = acc + speed_mod + friction + end + + new_acc = vector.multiply(dir, acc) + end + + self.object:set_acceleration(new_acc) + self._old_pos = vector.new(pos) + self._old_dir = vector.new(dir) + self._old_switch = last_switch + + -- Limits + for _,v in ipairs({"x","y","z"}) do + if math.abs(vel[v]) > max_vel then + vel[v] = mcl_minecarts:get_sign(vel[v]) * max_vel + new_acc[v] = 0 + update.vel = true + end + end + + -- Give achievement when player reached a distance of 1000 nodes from the start position + if self._driver and (vector.distance(self._start_pos, pos) >= 1000) then + awards.unlock(self._driver, "mcl:onARail") + end + + + if update.pos or self._punched then + 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) + end + + if self._punched then + self._punched = false + end + + if not (update.vel or update.pos) then + return + end + + + 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) + + self.object:set_velocity(vel) + if update.pos then + self.object:set_pos(pos) + end + update = nil + end + + function cart:get_staticdata() + return minetest.serialize({_railtype = self._railtype}) + end + + minetest.register_entity(entity_id, cart) end +-- Place a minecart at pointed_thing +mcl_minecarts.place_minecart = function(itemstack, pointed_thing) + if not pointed_thing.type == "node" then + return + end + + local railpos, node + if mcl_minecarts:is_rail(pointed_thing.under) then + railpos = pointed_thing.under + node = minetest.get_node(pointed_thing.under) + elseif mcl_minecarts:is_rail(pointed_thing.above) then + railpos = pointed_thing.above + node = minetest.get_node(pointed_thing.above) + else + return + end + + -- Activate detector rail + if node.name == "mcl_minecarts:detector_rail" then + local newnode = {name="mcl_minecarts:detector_rail_on", param2 = node.param2} + minetest.swap_node(railpos, newnode) + mesecon.receptor_on(railpos) + end + + local entity_id = entity_mapping[itemstack:get_name()] + local cart = minetest.add_entity(railpos, entity_id) + local railtype = minetest.get_item_group(node.name, "connect_to_raillike") + local le = cart:get_luaentity() + if le ~= nil then + le._railtype = railtype + end + local cart_dir = mcl_minecarts:get_rail_direction(railpos, {x=1, y=0, z=0}, nil, nil, railtype) + cart:set_yaw(minetest.dir_to_yaw(cart_dir)) + + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + return itemstack +end + + +local register_craftitem = function(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative) + entity_mapping[itemstring] = entity_id + + local groups = { minecart = 1, transport = 1 } + if creative == false then + groups.not_in_creative_inventory = 1 + end + local def = { + stack_max = 1, + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then + return + end + + -- Call on_rightclick if the pointed node defines it + local node = minetest.get_node(pointed_thing.under) + if placer and not placer: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, placer, itemstack) or itemstack + end + end + + return mcl_minecarts.place_minecart(itemstack, pointed_thing) + end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Place minecart as entity on rail. If there's no rail, just drop it. + local placed + if minetest.get_item_group(dropnode.name, "rail") ~= 0 then + -- FIXME: This places minecarts even if the spot is already occupied + local pointed_thing = { under = droppos, above = { x=droppos.x, y=droppos.y+1, z=droppos.z } } + placed = mcl_minecarts.place_minecart(stack, pointed_thing) + end + if placed == nil then + -- Drop item + minetest.add_item(droppos, stack) + end + end, + groups = groups, + } + def.description = description + def._tt_help = tt_help + def._doc_items_longdesc = longdesc + def._doc_items_usagehelp = usagehelp + def.inventory_image = icon + def.wield_image = icon + minetest.register_craftitem(itemstring, def) +end + +--[[ +Register a minecart +* itemstring: Itemstring of minecart item +* entity_id: ID of minecart entity +* description: Item name / description +* longdesc: Long help text +* usagehelp: Usage help text +* mesh: Minecart mesh +* textures: Minecart textures table +* icon: Item icon +* drop: Dropped items after destroying minecart +* on_rightclick: Called after rightclick +* on_activate_by_rail: Called when above activator rail +* creative: If false, don't show in Creative Inventory +]] +local function register_minecart(itemstring, entity_id, description, tt_help, longdesc, usagehelp, mesh, textures, icon, drop, on_rightclick, on_activate_by_rail, creative) + register_entity(entity_id, mesh, textures, drop, on_rightclick, on_activate_by_rail) + register_craftitem(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative) + if minetest.get_modpath("doc_identifier") ~= nil then + doc.sub.identifier.register_object(entity_id, "craftitems", itemstring) + end +end + +-- Minecart +register_minecart( + "mcl_minecarts:minecart", + "mcl_minecarts:minecart", + S("Minecart"), + S("Vehicle for fast travel on rails"), + S("Minecarts can be used for a quick transportion on rails.") .. "\n" .. + S("Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type."), + S("You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.") .. "\n" .. + S("To obtain the minecart, punch it while holding down the sneak key.") .. "\n" .. + S("If it moves over a powered activator rail, you'll get ejected."), + "mcl_minecarts_minecart.b3d", + {"mcl_minecarts_minecart.png"}, + "mcl_minecarts_minecart_normal.png", + {"mcl_minecarts:minecart"}, + function(self, clicker) + local name = clicker:get_player_name() + 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 + detach_driver(self) + elseif not self._driver then + self._driver = player_name + self._start_pos = self.object:get_pos() + mcl_player.player_attached[player_name] = true + clicker:set_attach(self.object, "", {x=0, y=-1.75, z=-2}, {x=0, y=0, z=0}) + mcl_player.player_attached[name] = true + minetest.after(0.2, function(name) + local player = minetest.get_player_by_name(name) + if player then + mcl_player.player_set_animation(player, "sit" , 30) + player:set_eye_offset({x=0, y=-5.5, z=0},{x=0, y=-4, z=0}) + end + end, name) + end + end, activate_normal_minecart +) + +-- Minecart with Chest +register_minecart( + "mcl_minecarts:chest_minecart", + "mcl_minecarts:chest_minecart", + S("Minecart with Chest"), + nil, nil, nil, + "mcl_minecarts_minecart_chest.b3d", + { "mcl_chests_normal.png", "mcl_minecarts_minecart.png" }, + "mcl_minecarts_minecart_chest.png", + {"mcl_minecarts:minecart", "mcl_chests:chest"}, + nil, nil, false) + +-- Minecart with Furnace +register_minecart( + "mcl_minecarts:furnace_minecart", + "mcl_minecarts:furnace_minecart", + S("Minecart with Furnace"), + nil, + S("A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel."), + S("Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.") .. "\n" .. + S("To obtain the minecart and furnace, punch them while holding down the sneak key."), + + "mcl_minecarts_minecart_block.b3d", + { + "default_furnace_top.png", + "default_furnace_top.png", + "default_furnace_front.png", + "default_furnace_side.png", + "default_furnace_side.png", + "default_furnace_side.png", + "mcl_minecarts_minecart.png", + }, + "mcl_minecarts_minecart_furnace.png", + {"mcl_minecarts:minecart", "mcl_furnaces:furnace"}, + -- Feed furnace with coal + function(self, clicker) + if not clicker or not clicker:is_player() then + return + end + if not self._fueltime then + self._fueltime = 0 + end + local held = clicker:get_wielded_item() + if minetest.get_item_group(held:get_name(), "coal") == 1 then + self._fueltime = self._fueltime + 180 + + if not minetest.settings:get_bool("creative_mode") then + held:take_item() + local index = clicker:get_wield_index() + local inv = clicker:get_inventory() + inv:set_stack("main", index, held) + end + self.object:set_properties({textures = + { + "default_furnace_top.png", + "default_furnace_top.png", + "default_furnace_front_active.png", + "default_furnace_side.png", + "default_furnace_side.png", + "default_furnace_side.png", + "mcl_minecarts_minecart.png", + }}) + end + end, nil, false +) + +-- Minecart with Command Block +register_minecart( + "mcl_minecarts:command_block_minecart", + "mcl_minecarts:command_block_minecart", + S("Minecart with Command Block"), + nil, nil, nil, + "mcl_minecarts_minecart_block.b3d", + { + "jeija_commandblock_off.png^[verticalframe:2:0", + "jeija_commandblock_off.png^[verticalframe:2:0", + "jeija_commandblock_off.png^[verticalframe:2:0", + "jeija_commandblock_off.png^[verticalframe:2:0", + "jeija_commandblock_off.png^[verticalframe:2:0", + "jeija_commandblock_off.png^[verticalframe:2:0", + "mcl_minecarts_minecart.png", + }, + "mcl_minecarts_minecart_command_block.png", + {"mcl_minecarts:minecart"}, + nil, nil, false +) + +-- Minecart with Hopper +register_minecart( + "mcl_minecarts:hopper_minecart", + "mcl_minecarts:hopper_minecart", + S("Minecart with Hopper"), + nil, nil, nil, + "mcl_minecarts_minecart_hopper.b3d", + { + "mcl_hoppers_hopper_inside.png", + "mcl_minecarts_minecart.png", + "mcl_hoppers_hopper_outside.png", + "mcl_hoppers_hopper_top.png", + }, + "mcl_minecarts_minecart_hopper.png", + {"mcl_minecarts:minecart", "mcl_hoppers:hopper"}, + nil, nil, false +) + +-- Minecart with TNT +register_minecart( + "mcl_minecarts:tnt_minecart", + "mcl_minecarts:tnt_minecart", + S("Minecart with TNT"), + S("Vehicle for fast travel on rails").."\n"..S("Can be ignited by tools or powered activator rail"), + S("A minecart with TNT is an explosive vehicle that travels on rail."), + S("Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.") .. "\n" .. + S("To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited."), + "mcl_minecarts_minecart_block.b3d", + { + "default_tnt_top.png", + "default_tnt_bottom.png", + "default_tnt_side.png", + "default_tnt_side.png", + "default_tnt_side.png", + "default_tnt_side.png", + "mcl_minecarts_minecart.png", + }, + "mcl_minecarts_minecart_tnt.png", + {"mcl_minecarts:minecart", "mcl_tnt:tnt"}, + -- Ingite + function(self, clicker) + if not clicker or not clicker:is_player() then + return + end + if self._boomtimer then + return + end + local held = clicker:get_wielded_item() + if held:get_name() == "mcl_fire:flint_and_steel" then + if not minetest.settings:get_bool("creative_mode") then + held:add_wear(65535/65) -- 65 uses + local index = clicker:get_wield_index() + local inv = clicker:get_inventory() + inv:set_stack("main", index, held) + end + activate_tnt_minecart(self) + end + end, activate_tnt_minecart) + + minetest.register_craft({ output = "mcl_minecarts:minecart", recipe = { @@ -326,3 +794,40 @@ minetest.register_craft({ {"mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot"}, }, }) + +minetest.register_craft({ + output = "mcl_minecarts:tnt_minecart", + recipe = { + {"mcl_tnt:tnt"}, + {"mcl_minecarts:minecart"}, + }, +}) + +-- TODO: Re-enable crafting of special minecarts when they have been implemented +if false then + +minetest.register_craft({ + output = "mcl_minecarts:furnace_minecart", + recipe = { + {"mcl_furnaces:furnace"}, + {"mcl_minecarts:minecart"}, + }, +}) + +minetest.register_craft({ + output = "mcl_minecarts:hopper_minecart", + recipe = { + {"mcl_hoppers:hopper"}, + {"mcl_minecarts:minecart"}, + }, +}) + +minetest.register_craft({ + output = "mcl_minecarts:chest_minecart", + recipe = { + {"mcl_chests:chest"}, + {"mcl_minecarts:minecart"}, + }, +}) + +end diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr new file mode 100644 index 00000000..4d9b6c2f --- /dev/null +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr @@ -0,0 +1,35 @@ +# textdomain: mcl_minecarts +Minecart=Lore +Minecarts can be used for a quick transportion on rails.=Loren können für eine schnelle Fahrt auf Schienen benutzt werden. +Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Loren fahren nur auf Schienen und bleiben immer auf der Strecke. An einer Einmündung ohne einem Weg nach vorne fahren sie nach links. Die Geschwindigkeit hängt vom Schienentyp ab. +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Sie können die Lore auf Schienen platzieren. Rechtsklicken, um einzusteigen. +To obtain the minecart, punch it while holding down the sneak key.=Um die Lore aufzusammeln, schlagen Sie sie, während Sie die Schleichen-Taste gedrückt halten. +A minecart with TNT is an explosive vehicle that travels on rail.=Eine Lore mit TNT ist ein explosives Fahrzeug, das auf Schienen fährt. +Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Auf Schienen platzieren. Zuschlagen zum Bewegen. Das TNT wird mit einem Feuerzeug angezündet, oder, wenn die Lore sich auf einer bestromten Aktivierungsschiene befindet. +To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Um die Lore und das TNT zu erhalten, schlagen Sie sie, während Sie die Schleichtaste drücken. Das ist nicht möglich, wenn das TNT bereits gezündet wurde. +A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Eine Lore mit Ofen ist ein Fahrzeug, das auf Rädern fährt. Sie kann mit Brennstoff angetrieben werden. +Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Auf Schienen platzieren. Wird Kohle eingefügt, wird der Ofen für eine lange Zeit brennen und die Lore wird fähig sein, sich selbst anzutreiben. Zuschlagen, um die Bewegung einzuläuten. +To obtain the minecart and furnace, punch them while holding down the sneak key.=Um die Lore und den Ofen zu erhalten, schlagen Sie zu, während Sie die Schleichtaste drücken. +Minecart with Chest=Lore mit Truhe +Minecart with Furnace=Lore mit Ofen +Minecart with Command Block=Lore mit Befehlsblock +Minecart with Hopper=Lore mit Trichter +Minecart with TNT=Lore mit TNT +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Bauen Sie sie auf den Boden, um Ihr Schienennetzwerk zu errichten, die Schienen werden sich automatisch verbinden und sich nach Bedarf in Kurven, Einmündungen, Kreuzungen und Steigungen verwandeln. +Rail=Schiene +Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Normale Schienen werden Loren aufgrund von Reibung leicht verlangsamen. +Powered Rail=Antriebsschiene +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Antriebsschienen können Loren beschleunigen und abbremsen. +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Ohne Redstone-Energie wird die Schiene Loren abbremsen. Mit Redstone-Energie wird sie sie beschleunigen. +Activator Rail=Aktivierungsschiene +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Aktivierungsschienen werden benutzt, um besondere Loren zu aktivieren. +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Wenn diese Schiene mit Redstone-Energie versorgt wird, werden alle Loren, die sie passieren, aktiviert. +Detector Rail=Sensorschiene +Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Eine Sensorschiene kann eine Lore erkennen und versorgt Redstone-Mechanismen. +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Um eine Lore zu erkennen und die Redstone-Energie zu aktivieren, verbinden Sie die Schiene mit Redstonestaub oder Redstone-Mechanismen und schicken Sie eine beliebige Lore über die Schiene. +Track for minecarts=Strecke für Loren +Speed up when powered, slow down when not powered=Beschleunigt, wenn bestromt, sonst verlangsamt es +Activates minecarts when powered=Aktiviert Loren, wenn bestromt +Emits redstone power when a minecart is detected=Gibt ein Redstonesignal aus, wenn eine Lore erfasst wird +Vehicle for fast travel on rails=Fahrzeug zum schnellen Transport auf Schienen +Can be ignited by tools or powered activator rail=Kann mit Werkzeugen oder bestromten Aktivierungsschienen angezündet werden diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.es.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.es.tr new file mode 100644 index 00000000..06ee2ca6 --- /dev/null +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.es.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_minecarts +Minecart=Vagoneta +Minecarts can be used for a quick transportion on rails.=Las vagonetas se pueden usar para transportarse rápido en los rieles. +Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Las vagonetas solo viajan en rieles y siempre siguen las pistas. En un cruce en T sin camino recto, giran a la izquierda. La velocidad se ve afectada por el tipo de riel. +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Puedes colocar el vagoneta en los rieles. Haga clic derecho para insertarlo. Golpea para que se mueva. +To obtain the minecart, punch it while holding down the sneak key.=Para obtener el vagoneta, golpéalo mientras mantienes presionada la tecla. +Minecart with Chest=Vagoneta con cofre +Minecart with Furnace=Vagoneta con horno +Minecart with Command Block=Vagoneta con bloque de comandos +Minecart with Hopper=Vagoneta con tolva +Minecart with TNT=Vagoneta con dinamita +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Colóquelos en el suelo para construir su ferrocarril, los rieles se conectarán automáticamente entre sí y se convertirán en curvas, uniones en T, cruces y pendientes según sea necesario. +Rail=Raíl +Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Los rieles se pueden usar para construir vías de transporte para vagonetas. Los rieles normales ralentizan ligeramente las vagonetas debido a la fricción. +Powered Rail=Raíl propulsor +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Los rieles se pueden usar para construir vías de transporte para vagonetas. Los railes propulsores pueden acelerar y frenar las vagonetas. +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Sin energía de redstone, el riel frenará las vagonetas. Para hacer que este riel acelere las vagonetas, aliméntalo con redstone. +Activator Rail=Raíl activador +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Los rieles se pueden usar para construir vías de transporte para vagonetas. Los railes activador se utilizan para activar una vagoneta especial. +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Para hacer que este riel active las vagonetas, enciéndelo con energía de redstone y envía una vagoneta sobre este pedazo de riel. +Detector Rail=Raíl detector +Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Los rieles se pueden usar para construir vías de transporte para vagonetas. Un raíl detector puede detectar una vagoneta sobre él y alimenta los mecanismos de redstone. +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Para detectar una vagoneta y proporcionar energía de redstone, conéctelo a los senderos de redstone o mecanismos de redstone y envíe cualquier vagoneta sobre el riel. diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr new file mode 100644 index 00000000..39cdfd01 --- /dev/null +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr @@ -0,0 +1,35 @@ +# textdomain: mcl_minecarts +Minecart=Wagonnet +Minecarts can be used for a quick transportion on rails.=Les wagonnets peuvent être utilisés pour un transport rapide sur rails. +Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Les wagonnets roulent uniquement sur des rails et suivent toujours les pistes. À un carrefour en T sans voie directe, ils tournent à gauche. La vitesse dépend du type de rail. +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Vous pouvez placer le wagonnet sur des rails. Faites un clic droit dessus pour entrer dedans. Frappez-le pour le faire bouger. +To obtain the minecart, punch it while holding down the sneak key.=Pour obtenir la wagonnet, frappez-le tout en maintenant la touche furtive enfoncée. +A minecart with TNT is an explosive vehicle that travels on rail.=Un wagonnet avec de la TNT est un véhicule explosif qui se déplace sur rail. +Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Placez-le sur des rails. Frappez-le pour le déplacer. Le TNT est allumé avec un briquet ou lorsque le minecart est sur un rail d'activation alimenté. +To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Pour obtenir la wagonnet et la TNT, frappez-les tout en maintenant la touche furtive enfoncée. Vous ne pouvez pas faire cela si le TNT a été allumé. +A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Une wagonnet avec un four est un véhicule qui se déplace sur rails. Il peut se propulser avec du carburant. +Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Placez-le sur des rails. Si vous lui donnez du charbon, le four commencera à brûler pendant longtemps et le wagonnet pourra se déplacer. Frappez-le pour le faire bouger. +To obtain the minecart and furnace, punch them while holding down the sneak key.=Pour obtenir le wagonnet et le four, frappez-les tout en maintenant la touche furtive enfoncée. +Minecart with Chest=Wagonnet avec Coffre +Minecart with Furnace=Wagonnet avec Four +Minecart with Command Block=Wagonnet avec Bloc de Commande +Minecart with Hopper=Wagonnet avec Entonoir +Minecart with TNT=Wagonnet avec TNT +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Placez-les sur le sol pour construire votre chemin de fer, les rails se connecteront automatiquement les uns aux autres et se transformeront en courbes, en jonctions en T, en traversées et en pentes au besoin. +Rail=Rail +Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Les rails ralentissent légèrement les wagonnets en raison de la friction. +Powered Rail=Rail allimenté +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Les rails motorisés sont capables d'accélérer et de freiner les wagonnets. +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Sans énergie de redstone, le rail freinera les wagonnets. Pour que ce rail accélère les minecarts, alimentez-le avec une source d'énergie redstone. +Activator Rail=Rail d'activation +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Des rails activateurs sont utilisés pour activer des wagonnets spéciaux. +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Pour activer ce rail, activez les wagonnets, alimentez-le avec de l'énergie redstone et envoyez un wagonnet sur ce morceau de rail. +Detector Rail=Rail de détection +Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Un rail de détection est capable de détecter un wagonnet au-dessus et alimente les mécanismes de redstone. +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Pour détecter un wagonnet et fournir une alimentation redstone, connectez-le aux câble redstone ou aux mécanismes redstone et envoyez n'importe quel wagonnet sur le rail. +Track for minecarts=Piste pour wagonnets +Speed up when powered, slow down when not powered=Accélérez lorsqu'il est alimenté, ralentissez lorsqu'il n'est pas alimenté +Activates minecarts when powered=Active les wagonnets lorsqu'il est alimenté +Emits redstone power when a minecart is detected=Émet de l'énergie redstone lorsqu'un wagonnet est détecté +Vehicle for fast travel on rails=Véhicule pour voyager rapidement sur rails +Can be ignited by tools or powered activator rail=Peut être allumé par des outils ou un rail d'activation motorisé diff --git a/mods/ENTITIES/mcl_minecarts/locale/template.txt b/mods/ENTITIES/mcl_minecarts/locale/template.txt new file mode 100644 index 00000000..25418954 --- /dev/null +++ b/mods/ENTITIES/mcl_minecarts/locale/template.txt @@ -0,0 +1,35 @@ +# textdomain: mcl_minecarts +Minecart= +Minecarts can be used for a quick transportion on rails.= +Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.= +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.= +To obtain the minecart, punch it while holding down the sneak key.= +A minecart with TNT is an explosive vehicle that travels on rail.= +Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.= +To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.= +A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.= +Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.= +To obtain the minecart and furnace, punch them while holding down the sneak key.= +Minecart with Chest= +Minecart with Furnace= +Minecart with Command Block= +Minecart with Hopper= +Minecart with TNT= +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.= +Rail= +Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.= +Powered Rail= +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.= +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.= +Activator Rail= +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.= +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.= +Detector Rail= +Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.= +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.= +Track for minecarts= +Speed up when powered, slow down when not powered= +Activates minecarts when powered= +Emits redstone power when a minecart is detected= +Vehicle for fast travel on rails= +Can be ignited by tools or powered activator rail= diff --git a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_block.b3d b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_block.b3d new file mode 100644 index 00000000..211446bd Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_block.b3d differ diff --git a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_chest.b3d b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_chest.b3d new file mode 100644 index 00000000..5ede1c64 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_chest.b3d differ diff --git a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_hopper.b3d b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_hopper.b3d new file mode 100644 index 00000000..b6441f06 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_hopper.b3d differ diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua index f68a738c..4c26aea8 100644 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ b/mods/ENTITIES/mcl_minecarts/rails.lua @@ -1,29 +1,210 @@ -local railuse = "Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed." +local S = minetest.get_translator("mcl_minecarts") + +-- Template rail function +local register_rail = function(itemstring, tiles, def_extras, creative) + local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=minetest.raillike_group("rail"),dig_by_water=1,destroy_by_lava_flow=1, transport=1} + if creative == false then + groups.not_in_creative_inventory = 1 + end + local ndef = { + drawtype = "raillike", + tiles = tiles, + is_ground_content = false, + inventory_image = tiles[1], + wield_image = tiles[1], + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + stack_max = 64, + groups = groups, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 3.5, + _mcl_hardness = 0.7, + after_destruct = function(pos) + -- Scan for minecarts in this pos and force them to execute their "floating" check. + -- Normally, this will make them drop. + local objs = minetest.get_objects_inside_radius(pos, 1) + for o=1, #objs do + local le = objs[o]:get_luaentity() + if le then + -- All entities in this mod are minecarts, so this works + if string.sub(le.name, 1, 14) == "mcl_minecarts:" then + le._last_float_check = mcl_minecarts.check_float_time + end + end + end + end, + } + if def_extras then + for k,v in pairs(def_extras) do + ndef[k] = v + end + end + minetest.register_node(itemstring, ndef) +end + +-- Redstone rules +local rail_rules_long = +{{x=-1, y= 0, z= 0, spread=true}, + {x= 1, y= 0, z= 0, spread=true}, + {x= 0, y=-1, z= 0, spread=true}, + {x= 0, y= 1, z= 0, spread=true}, + {x= 0, y= 0, z=-1, spread=true}, + {x= 0, y= 0, z= 1, spread=true}, + + {x= 1, y= 1, z= 0}, + {x= 1, y=-1, z= 0}, + {x=-1, y= 1, z= 0}, + {x=-1, y=-1, z= 0}, + {x= 0, y= 1, z= 1}, + {x= 0, y=-1, z= 1}, + {x= 0, y= 1, z=-1}, + {x= 0, y=-1, z=-1}} + +local rail_rules_short = mesecon.rules.pplate + +local railuse = S("Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.") -- Normal rail -minetest.register_node("mcl_minecarts:rail", { - description = "Rail", - _doc_items_longdesc = "Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.", - _doc_items_usagehelp = railuse, - drawtype = "raillike", - tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, - is_ground_content = false, - inventory_image = "default_rail.png", - wield_image = "default_rail.png", - paramtype = "light", - walkable = false, - selection_box = { - type = "fixed", - -- but how to specify the dimensions for curved and sideways rails? - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, - }, - stack_max = 64, - groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=1,dig_by_water=1,destroy_by_lava_flow=1,transport=1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 3.5, - _mcl_hardness = 0.7, -}) +register_rail("mcl_minecarts:rail", + {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, + { + description = S("Rail"), + _tt_help = S("Track for minecarts"), + _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction."), + _doc_items_usagehelp = railuse, + } +) +-- Powered rail (off = brake mode) +register_rail("mcl_minecarts:golden_rail", + {"mcl_minecarts_rail_golden.png", "mcl_minecarts_rail_golden_curved.png", "mcl_minecarts_rail_golden_t_junction.png", "mcl_minecarts_rail_golden_crossing.png"}, + { + description = S("Powered Rail"), + _tt_help = S("Track for minecarts").."\n"..S("Speed up when powered, slow down when not powered"), + _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts."), + _doc_items_usagehelp = railuse .. "\n" .. S("Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power."), + _rail_acceleration = -3, + mesecons = { + conductor = { + state = mesecon.state.off, + offstate = "mcl_minecarts:golden_rail", + onstate = "mcl_minecarts:golden_rail_on", + rules = rail_rules_long, + }, + }, + } +) + +-- Powered rail (on = acceleration mode) +register_rail("mcl_minecarts:golden_rail_on", + {"mcl_minecarts_rail_golden_powered.png", "mcl_minecarts_rail_golden_curved_powered.png", "mcl_minecarts_rail_golden_t_junction_powered.png", "mcl_minecarts_rail_golden_crossing_powered.png"}, + { + _doc_items_create_entry = false, + _rail_acceleration = 4, + mesecons = { + conductor = { + state = mesecon.state.on, + offstate = "mcl_minecarts:golden_rail", + onstate = "mcl_minecarts:golden_rail_on", + rules = rail_rules_long, + }, + }, + drop = "mcl_minecarts:golden_rail", + }, + false +) + +-- Activator rail (off) +register_rail("mcl_minecarts:activator_rail", + {"mcl_minecarts_rail_activator.png", "mcl_minecarts_rail_activator_curved.png", "mcl_minecarts_rail_activator_t_junction.png", "mcl_minecarts_rail_activator_crossing.png"}, + { + description = S("Activator Rail"), + _tt_help = S("Track for minecarts").."\n"..S("Activates minecarts when powered"), + _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts."), + _doc_items_usagehelp = railuse .. "\n" .. S("To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail."), + mesecons = { + conductor = { + state = mesecon.state.off, + offstate = "mcl_minecarts:activator_rail", + onstate = "mcl_minecarts:activator_rail_on", + rules = rail_rules_long, + + }, + }, + } +) + +-- Activator rail (on) +register_rail("mcl_minecarts:activator_rail_on", + {"mcl_minecarts_rail_activator_powered.png", "mcl_minecarts_rail_activator_curved_powered.png", "mcl_minecarts_rail_activator_t_junction_powered.png", "mcl_minecarts_rail_activator_crossing_powered.png"}, + { + _doc_items_create_entry = false, + mesecons = { + conductor = { + state = mesecon.state.on, + offstate = "mcl_minecarts:activator_rail", + onstate = "mcl_minecarts:activator_rail_on", + rules = rail_rules_long, + }, + effector = { + -- Activate minecarts + action_on = function(pos, node) + local pos2 = { x = pos.x, y =pos.y + 1, z = pos.z } + local objs = minetest.get_objects_inside_radius(pos2, 1) + for _, o in pairs(objs) do + local l = o:get_luaentity() + if l and string.sub(l.name, 1, 14) == "mcl_minecarts:" and l.on_activate_by_rail then + l:on_activate_by_rail() + end + end + end, + }, + + }, + drop = "mcl_minecarts:activator_rail", + }, + false +) + +-- Detector rail (off) +register_rail("mcl_minecarts:detector_rail", + {"mcl_minecarts_rail_detector.png", "mcl_minecarts_rail_detector_curved.png", "mcl_minecarts_rail_detector_t_junction.png", "mcl_minecarts_rail_detector_crossing.png"}, + { + description = S("Detector Rail"), + _tt_help = S("Track for minecarts").."\n"..S("Emits redstone power when a minecart is detected"), + _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms."), + _doc_items_usagehelp = railuse .. "\n" .. S("To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail."), + mesecons = { + receptor = { + state = mesecon.state.off, + rules = rail_rules_short, + }, + }, + } +) + +-- Detector rail (on) +register_rail("mcl_minecarts:detector_rail_on", + {"mcl_minecarts_rail_detector_powered.png", "mcl_minecarts_rail_detector_curved_powered.png", "mcl_minecarts_rail_detector_t_junction_powered.png", "mcl_minecarts_rail_detector_crossing_powered.png"}, + { + _doc_items_create_entry = false, + mesecons = { + receptor = { + state = mesecon.state.on, + rules = rail_rules_short, + }, + }, + drop = "mcl_minecarts:detector_rail", + }, + false +) + + +-- Crafting minetest.register_craft({ output = 'mcl_minecarts:rail 16', recipe = { @@ -33,46 +214,6 @@ minetest.register_craft({ } }) --- Rail to speed up -minetest.register_node("mcl_minecarts:golden_rail", { - description = "Powered Rail", - _doc_items_longdesc = "Rails can be used to build transport tracks for minecarts. Powered rails will accelerate moving minecarts, up to a maximum speed.", - _doc_items_usagehelp = railuse, - drawtype = "raillike", - tiles = {"carts_rail_pwr.png", "carts_rail_curved_pwr.png", "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"}, - inventory_image = "carts_rail_pwr.png", - wield_image = "carts_rail_pwr.png", - paramtype = "light", - is_ground_content = false, - walkable = false, - selection_box = { - type = "fixed", - -- but how to specify the dimensions for curved and sideways rails? - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, - }, - groups = {handy=1,pickaxey=1, attached_node = 1, rail = 1, connect_to_raillike = 1, dig_by_water = 1,destroy_by_lava_flow=1, transport = 1}, - - after_place_node = function(pos, placer, itemstack) - if not mesecon then - minetest.get_meta(pos):set_string("cart_acceleration", "0.5") - end - end, - sounds = mcl_sounds.node_sound_metal_defaults(), - mesecons = { - effector = { - action_on = function(pos, node) - mcl_minecarts:boost_rail(pos, 0.5) - end, - - action_off = function(pos, node) - minetest.get_meta(pos):set_string("cart_acceleration", "0") - end, - }, - }, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 0.7, -}) - minetest.register_craft({ output = "mcl_minecarts:golden_rail 6", recipe = { @@ -82,3 +223,27 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "mcl_minecarts:activator_rail 6", + recipe = { + {"mcl_core:iron_ingot", "mcl_core:stick", "mcl_core:iron_ingot"}, + {"mcl_core:iron_ingot", "mesecons_torch:mesecon_torch_on", "mcl_core:iron_ingot"}, + {"mcl_core:iron_ingot", "mcl_core:stick", "mcl_core:iron_ingot"}, + } +}) + +minetest.register_craft({ + output = "mcl_minecarts:detector_rail 6", + recipe = { + {"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"}, + {"mcl_core:iron_ingot", "mesecons_pressureplates:pressure_plate_stone_off", "mcl_core:iron_ingot"}, + {"mcl_core:iron_ingot", "mesecons:redstone", "mcl_core:iron_ingot"}, + } +}) + + +-- Aliases +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_minecarts:golden_rail", "nodes", "mcl_minecarts:golden_rail_on") +end + diff --git a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_crossing_pwr.png b/mods/ENTITIES/mcl_minecarts/textures/carts_rail_crossing_pwr.png deleted file mode 100644 index 9ea9335d..00000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_crossing_pwr.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_curved_pwr.png b/mods/ENTITIES/mcl_minecarts/textures/carts_rail_curved_pwr.png deleted file mode 100644 index a9ab6eeb..00000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_curved_pwr.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_pwr.png b/mods/ENTITIES/mcl_minecarts/textures/carts_rail_pwr.png deleted file mode 100644 index 71282032..00000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_pwr.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_t_junction_pwr.png b/mods/ENTITIES/mcl_minecarts/textures/carts_rail_t_junction_pwr.png deleted file mode 100644 index 962d0a70..00000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_t_junction_pwr.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/default_rail_crossing.png b/mods/ENTITIES/mcl_minecarts/textures/default_rail_crossing.png index 22556d38..409f14b8 100644 Binary files a/mods/ENTITIES/mcl_minecarts/textures/default_rail_crossing.png and b/mods/ENTITIES/mcl_minecarts/textures/default_rail_crossing.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/default_rail_t_junction.png b/mods/ENTITIES/mcl_minecarts/textures/default_rail_t_junction.png index fc5b3ba3..f25c510f 100644 Binary files a/mods/ENTITIES/mcl_minecarts/textures/default_rail_t_junction.png and b/mods/ENTITIES/mcl_minecarts/textures/default_rail_t_junction.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_chest.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_chest.png new file mode 100644 index 00000000..451d8092 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_chest.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_command_block.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_command_block.png new file mode 100644 index 00000000..3b8d3d56 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_command_block.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_furnace.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_furnace.png new file mode 100644 index 00000000..71aec1c7 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_furnace.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_hopper.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_hopper.png new file mode 100644 index 00000000..f16a007f Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_hopper.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_tnt.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_tnt.png new file mode 100644 index 00000000..246d3632 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_tnt.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator.png new file mode 100644 index 00000000..c318e757 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing.png new file mode 100644 index 00000000..9e3f6708 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing_powered.png new file mode 100644 index 00000000..46433801 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved.png new file mode 100644 index 00000000..d734c31e Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved_powered.png new file mode 100644 index 00000000..3988b928 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_powered.png new file mode 100644 index 00000000..ad072f42 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction.png new file mode 100644 index 00000000..fd07b420 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction_powered.png new file mode 100644 index 00000000..37036481 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector.png new file mode 100644 index 00000000..4595df3a Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing.png new file mode 100644 index 00000000..57c72925 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing_powered.png new file mode 100644 index 00000000..c0b8490e Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved.png new file mode 100644 index 00000000..cb7c1057 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved_powered.png new file mode 100644 index 00000000..8ee6ce3b Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_powered.png new file mode 100644 index 00000000..289064f6 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction.png new file mode 100644 index 00000000..5b9da250 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction_powered.png new file mode 100644 index 00000000..7638413c Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden.png new file mode 100644 index 00000000..87a0b7bd Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing.png new file mode 100644 index 00000000..df8f6bfb Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing_powered.png new file mode 100644 index 00000000..81526029 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved.png new file mode 100644 index 00000000..d557a358 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved_powered.png new file mode 100644 index 00000000..ff1b917e Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_powered.png new file mode 100644 index 00000000..5277e24e Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction.png new file mode 100644 index 00000000..042f3d1b Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction_powered.png new file mode 100644 index 00000000..6a4af020 Binary files /dev/null and b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction_powered.png differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/rail_detector.png b/mods/ENTITIES/mcl_minecarts/textures/rail_detector.png deleted file mode 100644 index d4548bc2..00000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/rail_detector.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/rail_detector_powered.png b/mods/ENTITIES/mcl_minecarts/textures/rail_detector_powered.png deleted file mode 100644 index 07369867..00000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/rail_detector_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/rail_golden_powered.png b/mods/ENTITIES/mcl_minecarts/textures/rail_golden_powered.png deleted file mode 100644 index 9d7b9d58..00000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/rail_golden_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua similarity index 52% rename from mods/ENTITIES/mobs/api.lua rename to mods/ENTITIES/mcl_mobs/api.lua index fb8f7e3c..6b3f7423 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1,30 +1,41 @@ --- Mobs Api (4th August 2017) +-- API for Mobs Redo: MineClone 2 Edition (MRM) mobs = {} -mobs.mod = "redo" -mobs.version = "20170804" +mobs.mod = "mrm" +mobs.version = "20180531" -- don't rely too much on this, rarely updated, if ever +local MAX_MOB_NAME_LENGTH = 30 --- Intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP .. "/intllib.lua") -mobs.intllib = S +local MOB_CAP = {} +MOB_CAP.hostile = 70 +MOB_CAP.passive = 10 +MOB_CAP.ambient = 15 +MOB_CAP.water = 15 +-- Localize +local S = minetest.get_translator("mcl_mobs") -- CMI support check local use_cmi = minetest.global_exists("cmi") + -- Invisibility mod check mobs.invis = {} -if rawget(_G, "invisibility") then +if minetest.global_exists("invisibility") then mobs.invis = invisibility end +-- creative check +local creative_mode_cache = minetest.settings:get_bool("creative_mode") +function mobs.is_creative(name) + return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) +end + + -- localize math functions local pi = math.pi -local square = math.sqrt local sin = math.sin local cos = math.cos local abs = math.abs @@ -35,7 +46,6 @@ local random = math.random local floor = math.floor local atan = function(x) if not x or x ~= x then - --error("atan bassed NaN") return 0 else return atann(x) @@ -44,19 +54,31 @@ end -- Load settings -local damage_enabled = minetest.setting_getbool("enable_damage") -local peaceful_only = minetest.setting_getbool("only_peaceful_mobs") -local disable_blood = minetest.setting_getbool("mobs_disable_blood") -local creative = minetest.setting_getbool("creative_mode") -local spawn_protected = minetest.setting_getbool("mobs_spawn_protected") ~= false -local remove_far = minetest.setting_getbool("remove_far_mobs") -local difficulty = tonumber(minetest.setting_get("mob_difficulty")) or 1.0 +local damage_enabled = minetest.settings:get_bool("enable_damage") +local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false + +local disable_blood = minetest.settings:get_bool("mobs_disable_blood") +local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +local creative = minetest.settings:get_bool("creative_mode") +local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false +local remove_far = false +local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 local show_health = false -local max_per_block = tonumber(minetest.setting_get("max_objects_per_block") or 99) +local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 64) +local mobs_spawn_chance = tonumber(minetest.settings:get("mobs_spawn_chance") or 2.5) + +-- Peaceful mode message so players will know there are no monsters +if minetest.settings:get_bool("only_peaceful_mobs", false) then + minetest.register_on_joinplayer(function(player) + minetest.chat_send_player(player:get_player_name(), + S("Peaceful mode active! No monsters will spawn.")) + end) +end -- calculate aoc range for mob count -local aosrb = tonumber(minetest.setting_get("active_object_send_range_blocks")) -local abr = tonumber(minetest.setting_get("active_block_range")) +local aosrb = tonumber(minetest.settings:get("active_object_send_range_blocks")) +local abr = tonumber(minetest.settings:get("active_block_range")) local aoc_range = max(aosrb, abr) * 16 -- pathfinding settings @@ -65,25 +87,85 @@ local stuck_timeout = 3 -- how long before mob gets stuck in place and starts se local stuck_path_timeout = 10 -- how long will mob follow path before giving up -- default nodes -local node_fire = "mcl_fire:fire" -local node_permanent_flame = "mcl_fire:eternal_fire" local node_ice = "mcl_core:ice" local node_snowblock = "mcl_core:snowblock" local node_snow = "mcl_core:snow" mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" --- play sound -local mob_sound = function(self, sound) +local mod_weather = minetest.get_modpath("mcl_weather") ~= nil +local mod_explosions = minetest.get_modpath("mcl_explosions") ~= nil +local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil +local mod_hunger = minetest.get_modpath("mcl_hunger") ~= nil +local mod_worlds = minetest.get_modpath("mcl_worlds") ~= nil +local mod_armor = minetest.get_modpath("mcl_armor") ~= nil +-- play sound +local mob_sound = function(self, soundname, is_opinion, fixed_pitch) + + local soundinfo + if self.sounds_child and self.child then + soundinfo = self.sounds_child + elseif self.sounds then + soundinfo = self.sounds + end + if not soundinfo then + return + end + local sound = soundinfo[soundname] if sound then + if is_opinion and self.opinion_sound_cooloff > 0 then + return + end + local pitch + if not fixed_pitch then + local base_pitch = soundinfo.base_pitch + if not base_pitch then + base_pitch = 1 + end + if self.child and (not self.sounds_child) then + -- Children have higher pitch + pitch = base_pitch * 1.5 + else + pitch = base_pitch + end + -- randomize the pitch a bit + pitch = pitch + math.random(-10, 10) * 0.005 + end minetest.sound_play(sound, { object = self.object, gain = 1.0, - max_hear_distance = self.sounds.distance - }) + max_hear_distance = self.sounds.distance, + pitch = pitch, + }, true) + self.opinion_sound_cooloff = 1 end end +-- Reeturn true if object is in view_range +local function object_in_range(self, object) + if not object then + return false + end + local factor + -- Apply view range reduction for special player armor + if object:is_player() and mod_armor then + factor = armor:get_mob_view_range_factor(object, self.name) + end + -- Distance check + local dist + if factor and factor == 0 then + return false + elseif factor then + dist = self.view_range * factor + else + dist = self.view_range + end + if vector.distance(self.object:get_pos(), object:get_pos()) > dist then + return false + else + return true + end +end -- attack player/mob local do_attack = function(self, player) @@ -95,46 +177,96 @@ local do_attack = function(self, player) self.attack = player self.state = "attack" - if random(0, 100) < 90 then - mob_sound(self, self.sounds.war_cry) - end + -- TODO: Implement war_cry sound without being annoying + --if random(0, 100) < 90 then + --mob_sound(self, "war_cry", true) + --end end -- move mob in facing direction local set_velocity = function(self, v) - local yaw = (self.object:getyaw() or 0) + self.rotate + -- do not move if mob has been ordered to stay + if self.order == "stand" then + self.object:set_velocity({x = 0, y = 0, z = 0}) + return + end - self.object:setvelocity({ + local yaw = (self.object:get_yaw() or 0) + self.rotate + local vel = self.object:get_velocity() + self.object:set_velocity({ x = sin(yaw) * -v, - y = self.object:getvelocity().y, + y = (vel and vel.y) or 0, z = cos(yaw) * v }) end --- get overall speed of mob +-- calculate mob velocity local get_velocity = function(self) - local v = self.object:getvelocity() + local v = self.object:get_velocity() return (v.x * v.x + v.z * v.z) ^ 0.5 end --- set yaw -local set_yaw = function(self, yaw) +-- set and return valid yaw +local set_yaw = function(self, yaw, delay) if not yaw or yaw ~= yaw then yaw = 0 end - self:setyaw(yaw) + delay = delay or 0 - return yaw + if delay == 0 then + self.object:set_yaw(yaw) + return yaw + end + + self.target_yaw = yaw + self.delay = delay + + return self.target_yaw end +-- global function to set mob yaw +function mobs:yaw(self, yaw, delay) + set_yaw(self, yaw, delay) +end + +local add_texture_mod = function(self, mod) + local full_mod = "" + local already_added = false + for i=1, #self.texture_mods do + if mod == self.texture_mods[i] then + already_added = true + end + full_mod = full_mod .. self.texture_mods[i] + end + if not already_added then + full_mod = full_mod .. mod + table.insert(self.texture_mods, mod) + end + self.object:set_texture_mod(full_mod) +end +local remove_texture_mod = function(self, mod) + local full_mod = "" + local remove = {} + for i=1, #self.texture_mods do + if self.texture_mods[i] ~= mod then + full_mod = full_mod .. self.texture_mods[i] + else + table.insert(remove, i) + end + end + for i=#remove, 1 do + table.remove(self.texture_mods, remove[i]) + end + self.object:set_texture_mod(full_mod) +end -- set defined animation local set_animation = function(self, anim) @@ -165,13 +297,37 @@ function mobs:set_animation(self, anim) set_animation(self, anim) end - --- this is a faster way to calculate distance -local get_distance = function(a, b) - - local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z - - return square(x * x + y * y + z * z) +-- Returns true is node can deal damage to self +local is_node_dangerous = function(self, nodename) + local nn = nodename + if self.water_damage > 0 then + if minetest.get_item_group(nn, "water") ~= 0 then + return true + end + end + if self.lava_damage > 0 then + if minetest.get_item_group(nn, "lava") ~= 0 then + return true + end + end + if self.fire_damage > 0 then + if (minetest.get_item_group(nn, "fire") ~= 0) or nn == "mcl_nether:magma" then + return true + end + end + if minetest.registered_nodes[nn].drowning > 0 then + if self.breath_max ~= -1 then + -- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case + -- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous + if not self.breathes_in_water and minetest.get_item_group(nn, "water") ~= 0 then + return true + end + end + end + if minetest.registered_nodes[nn].damage_per_second > 0 then + return true + end + return false end @@ -199,7 +355,7 @@ local line_of_sight = function(self, pos1, pos2, stepsize) local nn = minetest.get_node(pos).name -- Target Distance (td) to travel - local td = get_distance(pos1, pos2) + local td = vector.distance(pos1, pos2) -- Actual Distance (ad) traveled local ad = 0 @@ -207,8 +363,7 @@ local line_of_sight = function(self, pos1, pos2, stepsize) -- It continues to advance in the line of sight in search of a real -- obstruction which counts as 'normal' nodebox. while minetest.registered_nodes[nn] - and (minetest.registered_nodes[nn].walkable == false - or minetest.registered_nodes[nn].drawtype == "nodebox") do + and minetest.registered_nodes[nn].walkable == false do -- Check if you can still move forward if td < ad + stepsize then @@ -216,7 +371,7 @@ local line_of_sight = function(self, pos1, pos2, stepsize) end -- Moves the analyzed pos - local d = get_distance(pos1, pos2) + local d = vector.distance(pos1, pos2) npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y @@ -247,24 +402,28 @@ end -- are we flying in what we are suppose to? (taikedz) -local flight_check = function(self, pos_w) +local flight_check = function(self) local nod = self.standing_in local def = minetest.registered_nodes[nod] - if type(self.fly_in) == "string" - and (nod == self.fly_in or def.liquid_alternative_flowing ~= "") then - - return true + if not def then return false end -- nil check + local fly_in + if type(self.fly_in) == "string" then + fly_in = { self.fly_in } elseif type(self.fly_in) == "table" then + fly_in = self.fly_in + else + return false + end - for _,fly_in in pairs(self.fly_in) do - - if nod == fly_in or def.liquid_alternative_flowing ~= "" then - - return true - end + for _,checknode in pairs(fly_in) do + if nod == checknode then + return true + elseif checknode == "__airlike" and def.walkable == false and + (def.liquidtype == "none" or minetest.get_item_group(nod, "fake_liquid") == 1) then + return true end end @@ -272,21 +431,29 @@ local flight_check = function(self, pos_w) end --- particle effects -local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow) +-- custom particle effects +local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down) radius = radius or 2 min_size = min_size or 0.5 max_size = max_size or 1 gravity = gravity or -10 glow = glow or 0 + go_down = go_down or false + + local ym + if go_down then + ym = 0 + else + ym = -radius + end minetest.add_particlespawner({ amount = amount, time = 0.25, minpos = pos, maxpos = pos, - minvel = {x = -radius, y = -radius, z = -radius}, + minvel = {x = -radius, y = ym, z = -radius}, maxvel = {x = radius, y = radius, z = radius}, minacc = {x = 0, y = gravity, z = 0}, maxacc = {x = 0, y = gravity, z = 0}, @@ -299,28 +466,33 @@ local effect = function(pos, amount, texture, min_size, max_size, radius, gravit }) end +local damage_effect = function(self, damage) + -- damage particles + if (not disable_blood) and damage > 0 then + + local amount_large = math.floor(damage / 2) + local amount_small = damage % 2 + + local pos = self.object:get_pos() + + pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5 + + local texture = "mobs_blood.png" + -- full heart damage (one particle for each 2 HP damage) + if amount_large > 0 then + effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true) + end + -- half heart damage (one additional particle if damage is an odd number) + if amount_small > 0 then + -- TODO: Use "half heart" + effect(pos, amount_small, texture, 1, 1, 1.75, 0, nil, true) + end + end +end --- update nametag colour local update_tag = function(self) - - local col = "#00FF00" - local qua = self.hp_max / 4 - - if self.health <= floor(qua * 3) then - col = "#FFFF00" - end - - if self.health <= floor(qua * 2) then - col = "#FF6600" - end - - if self.health <= floor(qua) then - col = "#FF0000" - end - self.object:set_properties({ nametag = self.nametag, - nametag_color = col }) end @@ -329,11 +501,16 @@ end -- drop items local item_drop = function(self, cooked) - -- no drops for child mobs - if self.child then return end + -- no drops if disabled by setting + if not mobs_drop_items then return end + + -- no drops for child mobs (except monster) + if (self.child and self.type ~= "monster") then + return + end local obj, item, num - local pos = self.object:getpos() + local pos = self.object:get_pos() self.drops = self.drops or {} -- nil check @@ -341,7 +518,7 @@ local item_drop = function(self, cooked) if random(1, self.drops[n].chance) == 1 then - num = random(self.drops[n].min, self.drops[n].max) + num = random(self.drops[n].min or 1, self.drops[n].max or 1) item = self.drops[n].name -- cook items when true @@ -360,7 +537,7 @@ local item_drop = function(self, cooked) if obj and obj:get_luaentity() then - obj:setvelocity({ + obj:set_velocity({ x = random(-10, 10) / 9, y = 6, z = random(-10, 10) / 9, @@ -380,27 +557,38 @@ local check_for_death = function(self, cause, cmi_cause) -- has health actually changed? if self.health == self.old_health and self.health > 0 then - return + return false end + local damaged = self.health < self.old_health self.old_health = self.health - -- still got some health? play hurt sound + -- still got some health? if self.health > 0 then - mob_sound(self, self.sounds.damage) - -- make sure health isn't higher than max if self.health > self.hp_max then self.health = self.hp_max end + -- play damage sound if health was reduced and make mob flash red. + if damaged then + add_texture_mod(self, "^[colorize:#FF000040") + minetest.after(.2, function(self) + if self and self.object then + remove_texture_mod(self, "^[colorize:#FF000040") + end + end, self) + mob_sound(self, "damage") + end + -- backup nametag so we can show health stats if not self.nametag2 then self.nametag2 = self.nametag or "" end - if show_health then + if show_health + and (cmi_cause and cmi_cause.type == "punch") then self.htimer = 2 self.nametag = "♥ " .. self.health .. " / " .. self.hp_max @@ -411,15 +599,16 @@ local check_for_death = function(self, cause, cmi_cause) return false end - if cause == "lava" then + -- dropped cooked item if mob died in fire or lava + if cause == "lava" or cause == "fire" then item_drop(self, true) else item_drop(self, nil) end - mob_sound(self, self.sounds.death) + mob_sound(self, "death") - local pos = self.object:getpos() + local pos = self.object:get_pos() -- execute custom death function if self.on_die then @@ -454,8 +643,10 @@ local check_for_death = function(self, cause, cmi_cause) set_animation(self, "die") minetest.after(length, function(self) - - if use_cmi then + if not self.object:get_luaentity() then + return + end + if use_cmi then cmi.notify_die(self.object, cmi_cause) end @@ -492,25 +683,36 @@ local within_limits = function(pos, radius) end --- is mob facing a cliff -local is_at_cliff = function(self) +-- is mob facing a cliff or danger +local is_at_cliff_or_danger = function(self) if self.fear_height == 0 then -- 0 for no falling protection! return false end - local yaw = self.object:getyaw() + if not self.object:get_luaentity() then + return false + end + local yaw = self.object:get_yaw() local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) - local pos = self.object:getpos() + local pos = self.object:get_pos() local ypos = pos.y + self.collisionbox[2] -- just above floor - if minetest.line_of_sight( + local free_fall, blocker = minetest.line_of_sight( {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z} - , 1) then - + {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) + if free_fall then return true + else + local bnode = minetest.get_node(blocker) + local danger = is_node_dangerous(self, bnode.name) + if danger then + return true + else + local def = minetest.registered_nodes[bnode.name] + return (not def and def.walkable) + end end return false @@ -528,7 +730,7 @@ local node_ok = function(pos, fallback) return node end - return minetest.registered_nodes[fallback] -- {name = fallback} + return minetest.registered_nodes[fallback] end @@ -549,28 +751,44 @@ local do_env_damage = function(self) update_tag(self) end - local pos = self.object:getpos() + local pos = self.object:get_pos() self.time_of_day = minetest.get_timeofday() -- remove mob if beyond map limits if not within_limits(pos, 0) then self.object:remove() - return + return true end - -- daylight above ground - if self.light_damage ~= 0 - and pos.y > 0 - and self.time_of_day > 0.2 - and self.time_of_day < 0.8 - and (minetest.get_node_light(pos) or 0) > 12 then - self.health = self.health - self.light_damage + -- Deal light damage to mob, returns true if mob died + local deal_light_damage = function(self, pos, damage) + if not (mod_weather and (mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then + self.health = self.health - damage - effect(pos, 5, "tnt_smoke.png") + effect(pos, 5, "tnt_smoke.png") - if check_for_death(self, "light", {type = "light"}) then return end + if check_for_death(self, "light", {type = "light"}) then + return true + end + end + end + + -- bright light harms mob + if self.light_damage ~= 0 and (minetest.get_node_light(pos) or 0) > 12 then + if deal_light_damage(self, pos, self.light_damage) then + return true + end + end + local _, dim = nil, "overworld" + if mod_worlds then + _, dim = mcl_worlds.y_to_layer(pos.y) + end + if self.sunlight_damage ~= 0 and (minetest.get_node_light(pos) or 0) >= minetest.LIGHT_MAX and dim == "overworld" then + if deal_light_damage(self, pos, self.sunlight_damage) then + return true + end end local y_level = self.collisionbox[2] @@ -581,37 +799,51 @@ local do_env_damage = function(self) -- what is mob standing in? pos.y = pos.y + y_level + 0.25 -- foot level + local pos2 = {x=pos.x, y=pos.y-1, z=pos.z} self.standing_in = node_ok(pos, "air").name --- print ("standing in " .. self.standing_in) + self.standing_on = node_ok(pos2, "air").name -- don't fall when on ignore, just stand still if self.standing_in == "ignore" then - self.object:setvelocity({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = 0, y = 0, z = 0}) end local nodef = minetest.registered_nodes[self.standing_in] + -- rain + if self.rain_damage > 0 and mod_weather then + if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then + + self.health = self.health - self.rain_damage + + if check_for_death(self, "rain", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + end + pos.y = pos.y + 1 -- for particle effect position - -- water - if self.water_damage + -- water damage + if self.water_damage > 0 and nodef.groups.water then if self.water_damage ~= 0 then self.health = self.health - self.water_damage - effect(pos, 5, "bubble.png", nil, nil, 1, nil) + effect(pos, 5, "tnt_smoke.png", nil, nil, 1, nil) if check_for_death(self, "water", {type = "environment", - pos = pos, node = self.standing_in}) then return end + pos = pos, node = self.standing_in}) then + return true + end end - -- lava or fire - elseif self.lava_damage - and (nodef.groups.lava - or self.standing_in == node_fire - or self.standing_in == node_permanent_flame) then + -- lava damage + elseif self.lava_damage > 0 + and (nodef.groups.lava) then if self.lava_damage ~= 0 then @@ -620,7 +852,29 @@ local do_env_damage = function(self) effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) if check_for_death(self, "lava", {type = "environment", - pos = pos, node = self.standing_in}) then return end + pos = pos, node = self.standing_in}) then + return true + end + end + + -- fire damage + elseif self.fire_damage > 0 + and (nodef.groups.fire) or self.standing_on == "mcl_nether:magma" then + + if self.fire_damage ~= 0 then + + self.health = self.health - self.fire_damage + if self.standing_on ~= "mcl_nether:magma" then + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) + + if check_for_death(self, "fire", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + elseif check_for_death(self, "water", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end end -- damage_per_second node check @@ -631,22 +885,76 @@ local do_env_damage = function(self) effect(pos, 5, "tnt_smoke.png") if check_for_death(self, "dps", {type = "environment", - pos = pos, node = self.standing_in}) then return end + pos = pos, node = self.standing_in}) then + return true + end + end + + -- Drowning damage + if self.breath_max ~= -1 then + local drowning = false + if self.breathes_in_water then + if minetest.get_item_group(self.standing_in, "water") == 0 then + drowning = true + end + elseif nodef.drowning > 0 then + drowning = true + end + if drowning then + + self.breath = math.max(0, self.breath - 1) + + effect(pos, 2, "bubble.png", nil, nil, 1, nil) + if self.breath <= 0 then + local dmg + if nodef.drowning > 0 then + dmg = nodef.drowning + else + dmg = 4 + end + damage_effect(self, dmg) + self.health = self.health - dmg + end + if check_for_death(self, "drowning", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + else + self.breath = math.min(self.breath_max, self.breath + 1) + end end --- suffocation inside solid node - if self.suffocation ~= 0 - and nodef.walkable == true - and nodef.groups.disable_suffocation ~= 1 - and nodef.drawtype == "normal" then + -- FIXME: Redundant with mcl_playerplus + if (self.suffocation == true) + and (nodef.walkable == nil or nodef.walkable == true) + and (nodef.collision_box == nil or nodef.collision_box.type == "regular") + and (nodef.node_box == nil or nodef.node_box.type == "regular") + and (nodef.groups.disable_suffocation ~= 1) + and (nodef.groups.opaque == 1) then - self.health = self.health - self.suffocation + -- Short grace period before starting to take suffocation damage. + -- This is different from players, who take damage instantly. + -- This has been done because mobs might briefly be inside solid nodes + -- when e.g. climbing up stairs. + -- This is a bit hacky because it assumes that do_env_damage + -- is called roughly every second only. + self.suffocation_timer = self.suffocation_timer + 1 + if self.suffocation_timer >= 3 then + -- 2 damage per second + -- TODO: Deal this damage once every 1/2 second + self.health = self.health - 2 - if check_for_death(self, "suffocation", {type = "environment", - pos = pos, node = self.standing_in}) then return end + if check_for_death(self, "suffocation", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + else + self.suffocation_timer = 0 end - check_for_death(self, "", {type = "unknown"}) + return check_for_death(self, "", {type = "unknown"}) end @@ -656,27 +964,28 @@ local do_jump = function(self) if not self.jump or self.jump_height == 0 or self.fly - or self.child then + or (self.child and self.type ~= "monster") + or self.order == "stand" then return false end + self.facing_fence = false + -- something stopping us while moving? if self.state ~= "stand" and get_velocity(self) > 0.5 - and self.object:getvelocity().y ~= 0 then + and self.object:get_velocity().y ~= 0 then return false end - local pos = self.object:getpos() - local yaw = self.object:getyaw() + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() -- what is mob standing on? pos.y = pos.y + self.collisionbox[2] - 0.2 local nod = node_ok(pos) ---print ("standing on:", nod.name, pos.y) - if minetest.registered_nodes[nod.name].walkable == false then return false end @@ -686,33 +995,80 @@ local do_jump = function(self) local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) -- what is in front of mob? - local nod = node_ok({ + nod = node_ok({ x = pos.x + dir_x, y = pos.y + 0.5, z = pos.z + dir_z }) + -- this is used to detect if there's a block on top of the block in front of the mob. + -- If there is, there is no point in jumping as we won't manage. + local nodTop = node_ok({ + x = pos.x + dir_x, + y = pos.y + 1.5, + z = pos.z + dir_z + }, "air") + + -- we don't attempt to jump if there's a stack of blocks blocking + if minetest.registered_nodes[nodTop.name] == true then + return false + end + -- thin blocks that do not need to be jumped if nod.name == node_snow then return false end ---print ("in front:", nod.name, pos.y + 0.5) + if self.walk_chance == 0 + or minetest.registered_items[nod.name].walkable then - if (minetest.registered_items[nod.name].walkable - and not nod.name:find("fence") - and not nod.name:find("gate")) - or self.walk_chance == 0 then + if minetest.get_item_group(nod.name, "fence") == 0 + and minetest.get_item_group(nod.name, "fence_gate") == 0 + and minetest.get_item_group(nod.name, "wall") == 0 then - local v = self.object:getvelocity() + local v = self.object:get_velocity() - v.y = self.jump_height + v.y = self.jump_height - set_animation(self, "jump") -- only when defined + set_animation(self, "jump") -- only when defined - self.object:setvelocity(v) + self.object:set_velocity(v) - mob_sound(self, self.sounds.jump) + -- when in air move forward + minetest.after(0.3, function(self, v) + if not self.object or not self.object:get_luaentity() then + return + end + self.object:set_acceleration({ + x = v.x * 2, + y = 0, + z = v.z * 2, + }) + end, self, v) + + if self.jump_sound_cooloff <= 0 then + mob_sound(self, "jump") + self.jump_sound_cooloff = 0.5 + end + else + self.facing_fence = true + end + + -- if we jumped against a block/wall 4 times then turn + if self.object:get_velocity().x ~= 0 + and self.object:get_velocity().z ~= 0 then + + self.jump_count = (self.jump_count or 0) + 1 + + if self.jump_count == 4 then + + local yaw = self.object:get_yaw() or 0 + + yaw = set_yaw(self, yaw + 1.35, 8) + + self.jump_count = 0 + end + end return true end @@ -731,9 +1087,9 @@ local entity_physics = function(pos, radius) for n = 1, #objs do - obj_pos = objs[n]:getpos() + obj_pos = objs[n]:get_pos() - dist = get_distance(pos, obj_pos) + dist = vector.distance(pos, obj_pos) if dist < 1 then dist = 1 end local damage = floor((4 / dist) * radius) @@ -743,7 +1099,7 @@ local entity_physics = function(pos, radius) objs[n]:punch(objs[n], 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = damage}, - }, pos) -- was nil + }, pos) end end @@ -796,14 +1152,20 @@ local breed = function(self) mesh = self.base_mesh, visual_size = self.base_size, collisionbox = self.base_colbox, + selectionbox = self.base_selbox, }) - -- jump when fully grown so not to fall into ground - self.object:setvelocity({ - x = 0, - y = self.jump_height, - z = 0 - }) + -- custom function when child grows up + if self.on_grown then + self.on_grown(self) + else + -- jump when fully grown so as not to fall into ground + self.object:set_velocity({ + x = 0, + y = self.jump_height, + z = 0 + }) + end end return @@ -822,11 +1184,11 @@ local breed = function(self) end end - -- find another same animal who is also horny and mate if close enough + -- find another same animal who is also horny and mate if nearby if self.horny == true and self.hornytimer <= 40 then - local pos = self.object:getpos() + local pos = self.object:get_pos() effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) @@ -874,35 +1236,42 @@ local breed = function(self) ent.hornytimer = 41 -- spawn baby - minetest.after(5, function() - - local mob = minetest.add_entity(pos, self.name) - local ent2 = mob:get_luaentity() - local textures = self.base_texture - - if self.child_texture then - textures = self.child_texture[1] + minetest.after(5, function(parent1, parent2, pos) + if not parent1.object:get_luaentity() then + return + end + if not parent2.object:get_luaentity() then + return end - mob:set_properties({ - textures = textures, - visual_size = { - x = self.base_size.x * .5, - y = self.base_size.y * .5, - }, - collisionbox = { - self.base_colbox[1] * .5, - self.base_colbox[2] * .5, - self.base_colbox[3] * .5, - self.base_colbox[4] * .5, - self.base_colbox[5] * .5, - self.base_colbox[6] * .5, - }, + -- custom breed function + if parent1.on_breed then + -- when false, skip going any further + if parent1.on_breed(parent1, parent2) == false then + return + end + end + + local child = mobs:spawn_child(pos, parent1.name) + + local ent_c = child:get_luaentity() + + + -- Use texture of one of the parents + local p = math.random(1, 2) + if p == 1 then + ent_c.base_texture = parent1.base_texture + else + ent_c.base_texture = parent2.base_texture + end + child:set_properties({ + textures = ent_c.base_texture }) - ent2.child = true - ent2.tamed = true - ent2.owner = self.owner - end) + + -- tamed and owned by parents' owner + ent_c.tamed = true + ent_c.owner = parent1.owner + end, self, ent, pos) num = 0 @@ -919,7 +1288,7 @@ local replace = function(self, pos) if not self.replace_rate or not self.replace_what or self.child == true - or self.object:getvelocity().y ~= 0 + or self.object:get_velocity().y ~= 0 or random(1, self.replace_rate) > 1 then return end @@ -943,8 +1312,6 @@ local replace = function(self, pos) if #minetest.find_nodes_in_area(pos, pos, what) > 0 then --- print ("replace node = ".. minetest.get_node(pos).name, pos.y) - local oldnode = {name = what} local newnode = {name = with} local on_replace_return @@ -955,13 +1322,10 @@ local replace = function(self, pos) if on_replace_return ~= false then - minetest.set_node(pos, {name = with}) - - -- when cow/sheep eats grass, replace wool and milk - if self.gotten == true then - self.gotten = false - self.object:set_properties(self) + if mobs_griefing then + minetest.set_node(pos, {name = with}) end + end end end @@ -983,13 +1347,18 @@ local day_docile = function(self) end --- path finding and smart mob routine by rnd +local los_switcher = false +local height_switcher = false + +-- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 local smart_mobs = function(self, s, p, dist, dtime) local s1 = self.path.lastpos + local target_pos = self.attack:get_pos() + -- is it becoming stuck? - if abs(s1.x - s.x) + abs(s1.z - s.z) < 1.5 then + if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then self.path.stuck_timer = self.path.stuck_timer + dtime else self.path.stuck_timer = 0 @@ -997,12 +1366,73 @@ local smart_mobs = function(self, s, p, dist, dtime) self.path.lastpos = {x = s.x, y = s.y, z = s.z} - -- im stuck, search for path - if (self.path.stuck_timer > stuck_timeout and not self.path.following) - or (self.path.stuck_timer > stuck_path_timeout and self.path.following) then + local use_pathfind = false + local has_lineofsight = minetest.line_of_sight( + {x = s.x, y = (s.y) + .5, z = s.z}, + {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) + -- im stuck, search for path + if not has_lineofsight then + + if los_switcher == true then + use_pathfind = true + los_switcher = false + end -- cannot see target! + else + if los_switcher == false then + + los_switcher = true + use_pathfind = false + + minetest.after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end -- can see target! + end + + if (self.path.stuck_timer > stuck_timeout and not self.path.following) then + + use_pathfind = true self.path.stuck_timer = 0 + minetest.after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end + + if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then + + use_pathfind = true + self.path.stuck_timer = 0 + + minetest.after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end + + if math.abs(vector.subtract(s,target_pos).y) > self.stepheight then + + if height_switcher then + use_pathfind = true + height_switcher = false + end + else + if not height_switcher then + use_pathfind = false + height_switcher = true + end + end + + if use_pathfind then -- lets try find a path, first take care of positions -- since pathfinder is very sensitive local sheight = self.collisionbox[5] - self.collisionbox[2] @@ -1010,7 +1440,6 @@ local smart_mobs = function(self, s, p, dist, dtime) -- round position to center of node to avoid stuck in walls -- also adjust height for player models! s.x = floor(s.x + 0.5) --- s.y = floor(s.y + 0.5) - sheight s.z = floor(s.z + 0.5) local ssight, sground = minetest.line_of_sight(s, { @@ -1021,24 +1450,21 @@ local smart_mobs = function(self, s, p, dist, dtime) s.y = sground.y + 1 end - local p1 = self.attack:getpos() + local p1 = self.attack:get_pos() p1.x = floor(p1.x + 0.5) p1.y = floor(p1.y + 0.5) p1.z = floor(p1.z + 0.5) - local dropheight = 10 + local dropheight = 12 if self.fear_height ~= 0 then dropheight = self.fear_height end - --- self.path.way = minetest.find_path(s, p1, 16, 2, 6, "Dijkstra") -- "A*_noprefetch" - self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "A*_noprefetch") - - -- attempt to unstick mob that is "daydreaming" - self.object:setpos({ - x = s.x + 0.1 * (random() * 2 - 1), - y = s.y + 1, - z = s.z + 0.1 * (random() * 2 - 1) - }) + local jumpheight = 0 + if self.jump and self.jump_height >= 4 then + jumpheight = math.min(math.ceil(self.jump_height / 4), 4) + elseif self.stepheight > 0.5 then + jumpheight = 1 + end + self.path.way = minetest.find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") self.state = "" do_attack(self, self.attack) @@ -1049,7 +1475,7 @@ local smart_mobs = function(self, s, p, dist, dtime) self.path.following = false -- lets make way by digging/building if not accessible - if self.pathfinding == 2 then + if self.pathfinding == 2 and mobs_griefing then -- is player higher than mob? if s.y < p1.y then @@ -1090,11 +1516,11 @@ local smart_mobs = function(self, s, p, dist, dtime) end s.y = s.y - sheight - self.object:setpos({x = s.x, y = s.y + 2, z = s.z}) + self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) else -- dig 2 blocks to make door toward player direction - local yaw1 = self.object:getyaw() + pi / 2 + local yaw1 = self.object:get_yaw() + pi / 2 local p1 = { x = s.x + cos(yaw1), y = s.y, @@ -1107,11 +1533,11 @@ local smart_mobs = function(self, s, p, dist, dtime) local ndef1 = minetest.registered_nodes[node1] if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then minetest.add_item(p1, ItemStack(node1)) minetest.set_node(p1, {name = "air"}) @@ -1136,15 +1562,15 @@ local smart_mobs = function(self, s, p, dist, dtime) end end - -- will try again in 2 second + -- will try again in 2 seconds self.path.stuck_timer = stuck_timeout - 2 - - -- frustration! cant find the damn path :( - mob_sound(self, self.sounds.random) + elseif s.y < p1.y and (not self.fly) then + do_jump(self) --add jump to pathfinding + self.path.following = true + -- Yay, I found path! + -- TODO: Implement war_cry sound without being annoying + --mob_sound(self, "war_cry", true) else - -- yay i found path - mob_sound(self, self.sounds.attack) - set_velocity(self, self.walk_velocity) -- follow path now that it has it @@ -1173,7 +1599,6 @@ local specific_attack = function(list, what) return false end - -- monster find someone to attack local monster_attack = function(self) @@ -1185,7 +1610,7 @@ local monster_attack = function(self) return end - local s = self.object:getpos() + local s = self.object:get_pos() local p, sp, dist local player, obj, min_player local type, name = "", "" @@ -1196,8 +1621,7 @@ local monster_attack = function(self) if objs[n]:is_player() then - if mobs.invis[ objs[n]:get_player_name() ] then - + if mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then type = "" else player = objs[n] @@ -1219,25 +1643,21 @@ local monster_attack = function(self) and (type == "player" or type == "npc" or (type == "animal" and self.attack_animals == true)) then - s = self.object:getpos() - p = player:getpos() + p = player:get_pos() sp = s + dist = vector.distance(p, s) + -- aim higher to make looking up hills more realistic p.y = p.y + 1 sp.y = sp.y + 1 - dist = get_distance(p, s) - if dist < self.view_range then - -- field of view check goes here - - -- choose closest player to attack - if line_of_sight(self, sp, p, 2) == true - and dist < min_dist then - min_dist = dist - min_player = player - end + -- choose closest player to attack + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player end end end @@ -1259,7 +1679,7 @@ local npc_attack = function(self) end local p, sp, obj, min_player - local s = self.object:getpos() + local s = self.object:get_pos() local min_dist = self.view_range + 1 local objs = minetest.get_objects_inside_radius(s, self.view_range) @@ -1269,11 +1689,17 @@ local npc_attack = function(self) if obj and obj.type == "monster" then - p = obj.object:getpos() + p = obj.object:get_pos() + sp = s - dist = get_distance(p, s) + local dist = vector.distance(p, s) - if dist < min_dist then + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then min_dist = dist min_player = obj.object end @@ -1286,6 +1712,109 @@ local npc_attack = function(self) end +-- specific runaway +local specific_runaway = function(list, what) + + -- no list so do not run + if list == nil then + return false + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- find someone to runaway from +local runaway_from = function(self) + + if not self.runaway_from then + return + end + + local s = self.object:get_pos() + local p, sp, dist + local player, obj, min_player + local type, name = "", "" + local min_dist = self.view_range + 1 + local objs = minetest.get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + if objs[n]:is_player() then + + if mobs.invis[ objs[n]:get_player_name() ] + or self.owner == objs[n]:get_player_name() + or (not object_in_range(self, objs[n])) then + type = "" + else + player = objs[n] + type = "player" + name = "player" + end + else + obj = objs[n]:get_luaentity() + + if obj then + player = obj.object + type = obj.type + name = obj.name or "" + end + end + + -- find specific mob to runaway from + if name ~= "" and name ~= self.name + and specific_runaway(self.runaway_from, name) then + + p = player:get_pos() + sp = s + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + dist = vector.distance(p, s) + + + -- choose closest player/mpb to runaway from + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + end + + if min_player then + + local lp = player:get_pos() + local vec = { + x = lp.x - s.x, + y = lp.y - s.y, + z = lp.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + pi + end + + yaw = set_yaw(self, yaw, 4) + self.state = "runaway" + self.runaway_timer = 3 + self.following = nil + end +end + + -- follow player if owner or holding item, if fish outta water then flop local follow_flop = function(self) @@ -1296,12 +1825,12 @@ local follow_flop = function(self) and self.state ~= "attack" and self.state ~= "runaway" then - local s = self.object:getpos() + local s = self.object:get_pos() local players = minetest.get_connected_players() for n = 1, #players do - if get_distance(players[n]:getpos(), s) < self.view_range + if (object_in_range(self, players[n])) and not mobs.invis[ players[n]:get_player_name() ] then self.following = players[n] @@ -1335,24 +1864,24 @@ local follow_flop = function(self) -- follow that thing if self.following then - local s = self.object:getpos() + local s = self.object:get_pos() local p if self.following:is_player() then - p = self.following:getpos() + p = self.following:get_pos() elseif self.following.object then - p = self.following.object:getpos() + p = self.following.object:get_pos() end if p then - local dist = get_distance(p, s) + local dist = vector.distance(p, s) -- dont follow if out of range - if dist > self.view_range then + if (not object_in_range(self, self.following)) then self.following = nil else local vec = { @@ -1364,7 +1893,7 @@ local follow_flop = function(self) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + set_yaw(self, yaw, 6) -- anyone but standing npc's can move along if dist > self.reach @@ -1387,11 +1916,11 @@ local follow_flop = function(self) -- swimmers flop when out of their element, and swim again when back in if self.fly then - local s = self.object:getpos() + local s = self.object:get_pos() if not flight_check(self, s) then self.state = "flop" - self.object:setvelocity({x = 0, y = -5, z = 0}) + self.object:set_velocity({x = 0, y = -5, z = 0}) set_animation(self, "stand") @@ -1433,6 +1962,7 @@ end -- execute current state (stand, walk, run, attacks) +-- returns true if mob has died local do_states = function(self, dtime) local yaw = self.object:get_yaw() or 0 @@ -1442,13 +1972,13 @@ local do_states = function(self, dtime) if random(1, 4) == 1 then local lp = nil - local s = self.object:getpos() + local s = self.object:get_pos() local objs = minetest.get_objects_inside_radius(s, 3) for n = 1, #objs do if objs[n]:is_player() then - lp = objs[n]:getpos() + lp = objs[n]:get_pos() break end end @@ -1465,12 +1995,10 @@ local do_states = function(self, dtime) if lp.x > s.x then yaw = yaw + pi end else --- yaw = (random(0, 360) - 180) / 180 * pi - yaw = yaw + random(-0.5, 0.5) end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw, 8) end set_velocity(self, 0) @@ -1481,32 +2009,25 @@ local do_states = function(self, dtime) or self.order ~= "stand" then if self.walk_chance ~= 0 + and self.facing_fence ~= true and random(1, 100) <= self.walk_chance - and is_at_cliff(self) == false then + and is_at_cliff_or_danger(self) == false then set_velocity(self, self.walk_velocity) self.state = "walk" set_animation(self, "walk") - - -- fly up/down randomly for flying mobs - if self.fly and random(1, 100) <= self.walk_chance then - - local v = self.object:getvelocity() - local ud = random(-1, 2) / 9 - - self.object:setvelocity({x = v.x, y = ud, z = v.z}) - end end end elseif self.state == "walk" then - local s = self.object:getpos() + local s = self.object:get_pos() local lp = nil -- is there something I need to avoid? - if self.water_damage > 0 - and self.lava_damage > 0 then + if (self.water_damage > 0 + and self.lava_damage > 0) + or self.breath_max ~= -1 then lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"}) @@ -1517,18 +2038,29 @@ local do_states = function(self, dtime) elseif self.lava_damage > 0 then lp = minetest.find_node_near(s, 1, {"group:lava"}) + + elseif self.fire_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:fire", "mcl_nether:magma"}) + end + local is_in_danger = false if lp then + + local is_in_danger = false - -- if mob in water or lava then look for land - if (self.lava_damage - and minetest.registered_nodes[self.standing_in].groups.lava) - or (self.water_damage - and minetest.registered_nodes[self.standing_in].groups.water) then + -- if mob is flying, only check for node it is currently in (no contact with node below) + if flight_check(self) then + is_in_danger = is_node_dangerous(self, self.standing_in) + elseif (is_node_dangerous(self, self.standing_in) or + is_node_dangerous(self, self.standing_on)) then + is_in_danger = true + end - lp = minetest.find_node_near(s, 5, {"group:soil", "group:stone", - "group:sand", node_ice, node_snowblock}) + -- If mob in or on dangerous block, look for land + if is_in_danger then + lp = minetest.find_node_near(s, 5, {"group:solid"}) -- did we find land? if lp then @@ -1542,51 +2074,47 @@ local do_states = function(self, dtime) if lp.x > s.x then yaw = yaw + pi end - -- look towards land and jump/move in that direction - yaw = set_yaw(self.object, yaw) - do_jump(self) - set_velocity(self, self.walk_velocity) + -- look towards land and jump/move in that direction + yaw = set_yaw(self, yaw, 6) + do_jump(self) + set_velocity(self, self.walk_velocity) else --- yaw = (random(0, 360) - 180) / 180 * pi - yaw = yaw + random(-0.5, 0.5) end + -- A danger is near but mob is not inside else - local vec = { - x = lp.x - s.x, - z = lp.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if lp.x > s.x then yaw = yaw + pi end + -- Randomly turn + if random(1, 100) <= 30 then + yaw = yaw + random(-0.5, 0.5) + yaw = set_yaw(self, yaw, 8) + end end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw, 8) -- otherwise randomly turn elseif random(1, 100) <= 30 then - --yaw = random() * 2 * pi --- yaw = (random(0, 360) - 180) / 180 * pi - yaw = yaw + random(-0.5, 0.5) - - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw, 8) end - -- stand for great fall in front - local temp_is_cliff = is_at_cliff(self) - - if temp_is_cliff + -- stand for great fall or danger or fence in front + local cliff_or_danger = false + if is_in_danger then + cliff_or_danger = is_at_cliff_or_danger(self) + end + if self.facing_fence == true + or cliff_or_danger or random(1, 100) <= 30 then set_velocity(self, 0) self.state = "stand" set_animation(self, "stand") else + set_velocity(self, self.walk_velocity) if flight_check(self) @@ -1606,7 +2134,7 @@ local do_states = function(self, dtime) -- stop after 5 seconds or when at cliff if self.runaway_timer > 5 - or is_at_cliff(self) then + or is_at_cliff_or_danger(self) then self.runaway_timer = 0 set_velocity(self, 0) self.state = "stand" @@ -1620,18 +2148,17 @@ local do_states = function(self, dtime) elseif self.state == "attack" then -- calculate distance from mob and enemy - local s = self.object:getpos() - local p = self.attack:getpos() or s - local dist = get_distance(p, s) + local s = self.object:get_pos() + local p = self.attack:get_pos() or s + local dist = vector.distance(p, s) - -- stop attacking if player or out of range - if dist > self.view_range - or not self.attack - or not self.attack:getpos() + -- stop attacking if player invisible or out of range + if not self.attack + or not self.attack:get_pos() + or not object_in_range(self, self.attack) or self.attack:get_hp() <= 0 or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then - --print(" ** stop attacking **", dist, self.view_range) self.state = "stand" set_velocity(self, 0) set_animation(self, "stand") @@ -1639,6 +2166,7 @@ local do_states = function(self, dtime) self.v_start = false self.timer = 0 self.blinktimer = 0 + self.path.way = nil return end @@ -1654,31 +2182,48 @@ local do_states = function(self, dtime) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw) - if dist > self.reach then + local node_break_radius = self.explosion_radius or 1 + local entity_damage_radius = self.explosion_damage_radius + or (node_break_radius * 2) - if not self.v_start then + -- start timer when in reach and line of sight + if not self.v_start + and dist <= self.reach + and line_of_sight(self, s, p, 2) then - self.v_start = true - set_velocity(self, self.run_velocity) - self.timer = 0 - self.blinktimer = 0 - else - self.timer = 0 - self.blinktimer = 0 + self.v_start = true + self.timer = 0 + self.blinktimer = 0 + mob_sound(self, "fuse", nil, false) - set_velocity(self, self.run_velocity) - end + -- stop timer if out of reach or direct line of sight + elseif self.allow_fuse_reset + and self.v_start + and (dist > self.reach + or not line_of_sight(self, s, p, 2)) then + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + remove_texture_mod(self, "^[brighten") + end - if self.animation and self.animation.run_start then - set_animation(self, "run") - else - set_animation(self, "walk") - end - else + -- walk right up to player unless the timer is active + if self.v_start and (self.stop_to_explode or dist < 1.5) then set_velocity(self, 0) - set_animation(self, "punch") + else + set_velocity(self, self.run_velocity) + end + + if self.animation and self.animation.run_start then + set_animation(self, "run") + else + set_animation(self, "walk") + end + + if self.v_start then self.timer = self.timer + dtime self.blinktimer = (self.blinktimer or 0) + dtime @@ -1688,50 +2233,35 @@ local do_states = function(self, dtime) self.blinktimer = 0 if self.blinkstatus then - self.object:settexturemod("") + remove_texture_mod(self, "^[brighten") else - self.object:settexturemod("^[brighten") + add_texture_mod(self, "^[brighten") end self.blinkstatus = not self.blinkstatus end - if self.timer > 3 then + if self.timer > self.explosion_timer then - local pos = self.object:getpos() - local radius = self.explosion_radius or 1 - local damage_radius = radius + local pos = self.object:get_pos() - -- dont damage anything if area protected or next to water - if minetest.find_node_near(pos, 1, {"group:water"}) - or minetest.is_protected(pos, "") then - - damage_radius = 0 - end - - self.object:remove() - - if minetest.get_modpath("mcl_tnt") and tnt and tnt.boom - and not minetest.is_protected(pos, "") then - - tnt.boom(pos, { - radius = radius, - damage_radius = damage_radius, - sound = self.sounds.explode, - }) + if mod_explosions then + if mobs_griefing and not minetest.is_protected(pos, "") then + mcl_explosions.explode(self.object:get_pos(), self.explosion_strength, { drop_chance = 1.0 }, self.object) else - minetest.sound_play(self.sounds.explode, { pos = pos, gain = 1.0, max_hear_distance = self.sounds.distance or 32 - }) + }, true) - entity_physics(pos, damage_radius) - effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) + entity_physics(pos, entity_damage_radius) + effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0) end + end + self.object:remove() - return + return true end end @@ -1746,13 +2276,13 @@ local do_states = function(self, dtime) local me_y = floor(p1.y) local p2 = p local p_y = floor(p2.y + 1) - local v = self.object:getvelocity() + local v = self.object:get_velocity() if flight_check(self, s) then if me_y < p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = 1 * self.walk_velocity, z = v.z @@ -1760,7 +2290,7 @@ local do_states = function(self, dtime) elseif me_y > p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = -1 * self.walk_velocity, z = v.z @@ -1769,7 +2299,7 @@ local do_states = function(self, dtime) else if me_y < p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = 0.01, z = v.z @@ -1777,7 +2307,7 @@ local do_states = function(self, dtime) elseif me_y > p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = -0.01, z = v.z @@ -1824,7 +2354,7 @@ local do_states = function(self, dtime) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw) -- move towards enemy if beyond mob reach if dist > self.reach then @@ -1836,7 +2366,7 @@ local do_states = function(self, dtime) smart_mobs(self, s, p, dist, dtime) end - if is_at_cliff(self) then + if is_at_cliff_or_danger(self) then set_velocity(self, 0) set_animation(self, "stand") @@ -1885,7 +2415,7 @@ local do_states = function(self, dtime) if line_of_sight(self, p2, s2) == true then -- play attack sound - mob_sound(self, self.sounds.attack) + mob_sound(self, "attack") -- punch player (or what player is attached to) local attached = self.attack:get_attach() @@ -1916,7 +2446,7 @@ local do_states = function(self, dtime) p.y = p.y - .5 s.y = s.y + .5 - local dist = get_distance(p, s) + local dist = vector.distance(p, s) local vec = { x = p.x - s.x, y = p.y - s.y, @@ -1927,7 +2457,7 @@ local do_states = function(self, dtime) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw) set_velocity(self, 0) @@ -1939,30 +2469,39 @@ local do_states = function(self, dtime) set_animation(self, "shoot") -- play shoot attack sound - mob_sound(self, self.sounds.shoot_attack) + mob_sound(self, "shoot_attack") - local p = self.object:getpos() + local p = self.object:get_pos() p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 - local obj = minetest.add_entity(p, self.arrow) - local ent = obj:get_luaentity() + -- Shoot arrow + if minetest.registered_entities[self.arrow] then + + local arrow, ent + local v = 1 + if not self.shoot_arrow then + arrow = minetest.add_entity(p, self.arrow) + ent = arrow:get_luaentity() + if ent.velocity then + v = ent.velocity + end + ent.switch = 1 + ent.owner_id = tostring(self.object) -- add unique owner id to arrow + end - if ent then local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 - local v = ent.velocity or 1 -- or set to default - ent.switch = 1 - ent.owner_id = tostring(self.object) -- add unique owner id to arrow - - -- offset makes shoot aim accurate + -- offset makes shoot aim accurate vec.y = vec.y + self.shoot_offset vec.x = vec.x * (v / amount) vec.y = vec.y * (v / amount) vec.z = vec.z * (v / amount) - - obj:setvelocity(vec) - else - obj:remove() -- arrow entity does not exist + if self.shoot_arrow then + vec = vector.normalize(vec) + self:shoot_arrow(p, vec) + else + arrow:set_velocity(vec) + end end end end @@ -1971,6 +2510,7 @@ end -- falling and fall damage +-- returns true if mob died local falling = function(self, pos) if self.fly then @@ -1978,12 +2518,12 @@ local falling = function(self, pos) end -- floating in water (or falling) - local v = self.object:getvelocity() + local v = self.object:get_velocity() if v.y > 0 then -- apply gravity when moving up - self.object:setacceleration({ + self.object:set_acceleration({ x = 0, y = -10, z = 0 @@ -1992,23 +2532,22 @@ local falling = function(self, pos) elseif v.y <= 0 and v.y > self.fall_speed then -- fall downwards at set speed - self.object:setacceleration({ + self.object:set_acceleration({ x = 0, y = self.fall_speed, z = 0 }) else -- stop accelerating once max fall speed hit - self.object:setacceleration({x = 0, y = 0, z = 0}) + self.object:set_acceleration({x = 0, y = 0, z = 0}) end -- in water then float up --- if minetest.registered_nodes[node_ok(pos).name].groups.liquid then if minetest.registered_nodes[node_ok(pos).name].groups.water then if self.floats == 1 then - self.object:setacceleration({ + self.object:set_acceleration({ x = 0, y = -self.fall_speed / (max(1, v.y) ^ 2), z = 0 @@ -2018,22 +2557,30 @@ local falling = function(self, pos) -- fall damage onto solid ground if self.fall_damage == 1 - and self.object:getvelocity().y == 0 then + and self.object:get_velocity().y == 0 then - local d = (self.old_y or 0) - self.object:getpos().y + local d = (self.old_y or 0) - self.object:get_pos().y if d > 5 then - self.health = self.health - floor(d - 5) + local add = minetest.get_item_group(self.standing_on, "fall_damage_add_percent") + local damage = d - 5 + if add ~= 0 then + damage = damage + damage * (add/100) + end + damage = floor(damage) + if damage > 0 then + self.health = self.health - damage - effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) + effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) - if check_for_death(self, "fall", {type = "fall"}) then - return + if check_for_death(self, "fall", {type = "fall"}) then + return true + end end end - self.old_y = self.object:getpos().y + self.old_y = self.object:get_pos().y end end end @@ -2042,9 +2589,13 @@ end -- deal damage and effects when mob punched local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - -- mob health check - if self.health <= 0 then - return + -- custom punch function + if self.do_punch then + + -- when false skip going any further + if self.do_punch(self, hitter, tflp, tool_caps, dir) == false then + return + end end -- error checking when mod profiling is enabled @@ -2055,16 +2606,20 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- is mob protected? if self.protected and hitter:is_player() - and minetest.is_protected(self.object:getpos(), hitter:get_player_name()) then - minetest.chat_send_player(hitter:get_player_name(), S("Mob has been protected!")) + and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then return end - -- weapon wear + -- punch interval local weapon = hitter:get_wielded_item() local punch_interval = 1.4 + -- exhaust attacker + if mod_hunger and hitter:is_player() then + mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) + end + -- calculate mob damage local damage = 0 local armor = self.object:get_armor_groups() or {} @@ -2110,8 +2665,6 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) return end --- print ("Mob Damage is", damage) - if use_cmi then local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) @@ -2119,18 +2672,32 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) if cancel then return end end - -- add weapon wear if tool_capabilities then punch_interval = tool_capabilities.full_punch_interval or 1.4 end - if weapon:get_definition() - and weapon:get_definition().tool_capabilities then - - weapon:add_wear(floor((punch_interval / 75) * 9000)) - hitter:set_wielded_item(weapon) + -- add weapon wear manually + -- Required because we have custom health handling ("health" property) + if minetest.settings:get_bool("creative_mode") ~= true + and tool_capabilities then + if tool_capabilities.punch_attack_uses then + -- Without this delay, the wear does not work. Quite hacky ... + minetest.after(0, function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + local weapon = hitter:get_wielded_item(player) + local def = weapon:get_definition() + if def.tool_capabilities and def.tool_capabilities.punch_attack_uses then + local wear = floor(65535/tool_capabilities.punch_attack_uses) + weapon:add_wear(wear) + hitter:set_wielded_item(weapon) + end + end, hitter:get_player_name()) + end end + local die = false + -- only play hit sound and show blood effects if damage is 1 or over if damage >= 1 then @@ -2140,59 +2707,34 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) local s = random(0, #weapon:get_definition().sounds) minetest.sound_play(weapon:get_definition().sounds[s], { - object = hitter, + object = self.object, --hitter, max_hear_distance = 8 - }) + }, true) else minetest.sound_play("default_punch", { - object = hitter, + object = self.object, --hitter, max_hear_distance = 5 - }) + }, true) end - -- blood_particles - if self.blood_amount > 0 - and not disable_blood then - - local pos = self.object:getpos() - - pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) * .5 - - effect(pos, self.blood_amount, self.blood_texture, nil, nil, 1, nil) - end + damage_effect(self, damage) -- do damage self.health = self.health - floor(damage) - -- exit here if dead, special item check - if weapon:get_name() == "mobs:pick_lava" then - if check_for_death(self, "lava", {type = "punch", - puncher = hitter}) then - return - end - else - if check_for_death(self, "hit", {type = "punch", - puncher = hitter}) then - return - end + -- skip future functions if dead, except alerting others + if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then + die = true end - --[[ add healthy afterglow when hit (can cause hit lag with larger textures) - core.after(0.1, function() - self.object:settexturemod("^[colorize:#c9900070") - - core.after(0.3, function() - self.object:settexturemod("") - end) - end) ]] - -- knock back effect (only on full punch) - if self.knock_back > 0 + if not die + and self.knock_back and tflp >= punch_interval then - local v = self.object:getvelocity() + local v = self.object:get_velocity() local r = 1.4 - min(punch_interval, 1.4) - local kb = r * 5 + local kb = r * 2.0 local up = 2 -- if already in air then dont go up anymore when hit @@ -2204,21 +2746,28 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- direction error check dir = dir or {x = 0, y = 0, z = 0} - self.object:setvelocity({ + -- check if tool already has specific knockback value + if tool_capabilities.damage_groups["knockback"] then + kb = tool_capabilities.damage_groups["knockback"] + else + kb = kb * 1.5 + end + + self.object:set_velocity({ x = dir.x * kb, - y = up, + y = dir.y * kb + up, z = dir.z * kb }) - self.pause_timer = r + self.pause_timer = 0.25 end end -- END if damage -- if skittish then run away - if self.runaway == true then + if not die and self.runaway == true then - local lp = hitter:getpos() - local s = self.object:getpos() + local lp = hitter:get_pos() + local s = self.object:get_pos() local vec = { x = lp.x - s.x, y = lp.y - s.y, @@ -2231,7 +2780,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw, 6) self.state = "runaway" self.runaway_timer = 0 self.following = nil @@ -2242,16 +2791,18 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- attack puncher and call other mobs for help if self.passive == false and self.state ~= "flop" - and self.child == false + and (self.child == false or self.type == "monster") and hitter:get_player_name() ~= self.owner and not mobs.invis[ name ] then - -- attack whoever punched mob - self.state = "" - do_attack(self, hitter) + if not die then + -- attack whoever punched mob + self.state = "" + do_attack(self, hitter) + end -- alert others to the attack - local objs = minetest.get_objects_inside_radius(hitter:getpos(), self.view_range) + local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) local obj = nil for n = 1, #objs do @@ -2260,12 +2811,20 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) if obj then - -- only alert members of same mob - if obj.group_attack == true + -- only alert members of same mob or friends + if obj.group_attack and obj.state ~= "attack" - and obj.owner ~= name - and obj.name == self.name then - do_attack(obj, hitter) + and obj.owner ~= name then + if obj.name == self.name then + do_attack(obj, hitter) + elseif type(obj.group_attack) == "table" then + for i=1, #obj.group_attack do + if obj.name == obj.group_attack[i] then + do_attack(obj, hitter) + break + end + end + end end -- have owned mobs attack player threat @@ -2277,18 +2836,25 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end end +local mob_detach_child = function(self, child) + + if self.driver == child then + self.driver = nil + end + +end -- get entity staticdata local mob_staticdata = function(self) -- remove mob when out of range unless tamed if remove_far + and self.can_despawn and self.remove_ok - and not self.tamed - and self.lifetimer < 20000 then - - --print ("REMOVED " .. self.name) + and ((not self.nametag) or (self.nametag == "")) + and self.lifetimer <= 20 then + minetest.log("action", "Mob "..name.." despawns in mob_staticdata at "..minetest.pos_to_string(self.object.get_pos())) self.object:remove() return ""-- nil @@ -2299,12 +2865,6 @@ local mob_staticdata = function(self) self.following = nil self.state = "stand" - -- used to rotate older mobs - if self.drawtype - and self.drawtype == "side" then - self.rotate = math.rad(90) - end - if use_cmi then self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) end @@ -2323,7 +2883,6 @@ local mob_staticdata = function(self) end end - --print('===== '..self.name..'\n'.. dump(tmp)..'\n=====\n') return minetest.serialize(tmp) end @@ -2331,8 +2890,9 @@ end -- activate mob and reload settings local mob_activate = function(self, staticdata, def, dtime) - -- remove monsters in peaceful mode, or when no data - if (self.type == "monster" and peaceful_only) then + -- remove monsters in peaceful mode + if self.type == "monster" + and minetest.settings:get_bool("only_peaceful_mobs", false) then self.object:remove() @@ -2360,6 +2920,12 @@ local mob_activate = function(self, staticdata, def, dtime) self.base_mesh = def.mesh self.base_size = self.visual_size self.base_colbox = self.collisionbox + self.base_selbox = self.selectionbox + end + + -- for current mobs that dont have this set + if not self.base_selbox then + self.base_selbox = self.selectionbox or self.base_colbox end -- set texture, model and size @@ -2367,6 +2933,7 @@ local mob_activate = function(self, staticdata, def, dtime) local mesh = self.base_mesh local vis_size = self.base_size local colbox = self.base_colbox + local selbox = self.base_selbox -- specific texture if gotten if self.gotten == true @@ -2400,37 +2967,86 @@ local mob_activate = function(self, staticdata, def, dtime) self.base_colbox[5] * .5, self.base_colbox[6] * .5 } + selbox = { + self.base_selbox[1] * .5, + self.base_selbox[2] * .5, + self.base_selbox[3] * .5, + self.base_selbox[4] * .5, + self.base_selbox[5] * .5, + self.base_selbox[6] * .5 + } end if self.health == 0 then self.health = random (self.hp_min, self.hp_max) end + if self.breath == nil then + self.breath = self.breath_max + end - -- rnd: pathfinding init + -- pathfinding init self.path = {} self.path.way = {} -- path to follow, table of positions self.path.lastpos = {x = 0, y = 0, z = 0} self.path.stuck = false self.path.following = false -- currently following path? self.path.stuck_timer = 0 -- if stuck for too long search for path - -- end init - self.object:set_armor_groups({immortal = 1, fleshy = self.armor}) - self.old_y = self.object:getpos().y + -- Armor groups + -- immortal=1 because we use custom health + -- handling (using "health" property) + local armor + if type(self.armor) == "table" then + armor = table.copy(self.armor) + armor.immortal = 1 + else + armor = {immortal=1, fleshy = self.armor} + end + self.object:set_armor_groups(armor) + self.old_y = self.object:get_pos().y self.old_health = self.health self.sounds.distance = self.sounds.distance or 10 self.textures = textures self.mesh = mesh self.collisionbox = colbox + self.selectionbox = selbox self.visual_size = vis_size - self.standing_in = "" + self.standing_in = "ignore" + self.standing_on = "ignore" + self.jump_sound_cooloff = 0 -- used to prevent jump sound from being played too often in short time + self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types + + self.texture_mods = {} + self.object:set_texture_mod("") + + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + + -- check existing nametag + if not self.nametag then + self.nametag = def.nametag + end -- set anything changed above self.object:set_properties(self) - set_yaw(self.object, (random(0, 360) - 180) / 180 * pi) + set_yaw(self, (random(0, 360) - 180) / 180 * pi, 6) update_tag(self) set_animation(self, "stand") + -- run on_spawn function if found + if self.on_spawn and not self.on_spawn_run then + if self.on_spawn(self) then + self.on_spawn_run = true -- if true, set flag to run once only + end + end + + -- run after_activate + if def.after_activate then + def.after_activate(self, staticdata, def, dtime) + end + if use_cmi then self._cmi_components = cmi.activate_components(self.serialized_cmi_components) cmi.notify_activate(self.object, dtime) @@ -2445,22 +3061,22 @@ local mob_step = function(self, dtime) cmi.notify_step(self.object, dtime) end - local pos = self.object:getpos() + local pos = self.object:get_pos() local yaw = 0 - -- when lifetimer expires remove mob (except npc and tamed) - if self.type ~= "npc" - and not self.tamed - and self.state ~= "attack" - and remove_far ~= true - and self.lifetimer < 20000 then + -- Despawning: when lifetimer expires, remove mob + if remove_far + and self.can_despawn == true + and ((not self.nametag) or (self.nametag == "")) then + + -- TODO: Finish up implementation of despawning rules self.lifetimer = self.lifetimer - dtime if self.lifetimer <= 0 then -- only despawn away from player - local objs = minetest.get_objects_inside_radius(pos, 15) + local objs = minetest.get_objects_inside_radius(pos, 32) for n = 1, #objs do @@ -2472,28 +3088,69 @@ local mob_step = function(self, dtime) end end --- minetest.log("action", --- S("lifetimer expired, removed @1", self.name)) - - effect(pos, 15, "tnt_smoke.png", 2, 4, 2, 0) - + minetest.log("action", "Mob "..name.." despawns in mob_step at "..minetest.pos_to_string(pos)) self.object:remove() return end end - falling(self, pos) + if self.jump_sound_cooloff > 0 then + self.jump_sound_cooloff = self.jump_sound_cooloff - dtime + end + if self.opinion_sound_cooloff > 0 then + self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime + end + if falling(self, pos) then + -- Return if mob died after falling + return + end + + -- smooth rotation by ThomasMonroe314 + + if self.delay and self.delay > 0 then + + local yaw = self.object:get_yaw() or 0 + + if self.delay == 1 then + yaw = self.target_yaw + else + local dif = abs(yaw - self.target_yaw) + + if yaw > self.target_yaw then + + if dif > pi then + dif = 2 * pi - dif -- need to add + yaw = yaw + dif / self.delay + else + yaw = yaw - dif / self.delay -- need to subtract + end + + elseif yaw < self.target_yaw then + + if dif > pi then + dif = 2 * pi - dif + yaw = yaw - dif / self.delay -- need to subtract + else + yaw = yaw + dif / self.delay -- need to add + end + end + + if yaw > (pi * 2) then yaw = yaw - (pi * 2) end + if yaw < 0 then yaw = yaw + (pi * 2) end + end + + self.delay = self.delay - 1 + self.object:set_yaw(yaw) + end + + -- end rotation -- knockback timer if self.pause_timer > 0 then self.pause_timer = self.pause_timer - dtime - if self.pause_timer < 1 then - self.pause_timer = 0 - end - return end @@ -2523,12 +3180,9 @@ local mob_step = function(self, dtime) self.timer = 1 end - -- node replace check (cow eats grass etc.) - replace(self, pos) - -- mob plays random sound at times if random(1, 100) == 1 then - mob_sound(self, self.sounds.random) + mob_sound(self, "random", true) end -- environmental damage timer (every 1 second) @@ -2539,7 +3193,13 @@ local mob_step = function(self, dtime) self.env_damage_timer = 0 - do_env_damage(self) + -- check for environmental damage (water, fire, lava etc.) + if do_env_damage(self) then + return + end + + -- node replace check (cow eats grass etc.) + replace(self, pos) end monster_attack(self) @@ -2550,18 +3210,20 @@ local mob_step = function(self, dtime) follow_flop(self) - do_states(self, dtime) + if do_states(self, dtime) then + return + end do_jump(self) + runaway_from(self) + end -- default function when mobs are blown up with TNT local do_tnt = function(obj, damage) - --print ("----- Damage", damage) - obj.object:punch(obj.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = damage}, @@ -2573,48 +3235,112 @@ end mobs.spawning_mobs = {} +-- Code to execute before custom on_rightclick handling +local on_rightclick_prefix = function(self, clicker) + local item = clicker:get_wielded_item() + + -- Name mob with nametag + if not self.ignores_nametag and item:get_name() == "mcl_mobs:nametag" then + + local tag = item:get_meta():get_string("name") + if tag ~= "" then + if string.len(tag) > MAX_MOB_NAME_LENGTH then + tag = string.sub(tag, 1, MAX_MOB_NAME_LENGTH) + end + self.nametag = tag + + update_tag(self) + + if not mobs.is_creative(clicker:get_player_name()) then + item:take_item() + clicker:set_wielded_item(item) + end + return true + end + + end + return false +end + +local create_mob_on_rightclick = function(on_rightclick) + return function(self, clicker) + local stop = on_rightclick_prefix(self, clicker) + if (not stop) and (on_rightclick) then + on_rightclick(self, clicker) + end + end +end + -- register mob entity function mobs:register_mob(name, def) mobs.spawning_mobs[name] = true +local can_despawn +if def.can_despawn ~= nil then + can_despawn = def.can_despawn +else + can_despawn = true +end + +local function scale_difficulty(value, default, min, special) + if (not value) or (value == default) or (value == special) then + return default + else + return max(min, value * difficulty) + end +end + +local collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25} +-- Workaround for : +-- Increase upper Y limit to avoid mobs glitching through solid nodes. +-- FIXME: Remove workaround if it's no longer needed. +if collisionbox[5] < 0.79 then + collisionbox[5] = 0.79 +end + minetest.register_entity(name, { - stepheight = def.stepheight or 1.1, -- was 0.6 + stepheight = def.stepheight or 0.6, name = name, type = def.type, attack_type = def.attack_type, fly = def.fly, - fly_in = def.fly_in or "air", + fly_in = def.fly_in or {"air", "__airlike"}, owner = def.owner or "", order = def.order or "", on_die = def.on_die, + spawn_small_alternative = def.spawn_small_alternative, do_custom = def.do_custom, jump_height = def.jump_height or 4, -- was 6 - drawtype = def.drawtype, -- DEPRECATED, use rotate instead rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 - lifetimer = def.lifetimer or 180, -- 3 minutes - hp_min = max(1, (def.hp_min or 5) * difficulty), - hp_max = max(1, (def.hp_max or 10) * difficulty), + lifetimer = def.lifetimer or 57.73, + hp_min = scale_difficulty(def.hp_min, 5, 1), + hp_max = scale_difficulty(def.hp_max, 10, 1), + breath_max = def.breath_max or 15, + breathes_in_water = def.breathes_in_water or false, physical = true, - collisionbox = def.collisionbox, + collisionbox = collisionbox, + selectionbox = def.selectionbox or def.collisionbox, visual = def.visual, visual_size = def.visual_size or {x = 1, y = 1}, mesh = def.mesh, makes_footstep_sound = def.makes_footstep_sound or false, - view_range = def.view_range or 5, + view_range = def.view_range or 16, walk_velocity = def.walk_velocity or 1, run_velocity = def.run_velocity or 2, - damage = max(0, (def.damage or 0) * difficulty), + damage = scale_difficulty(def.damage, 0, 0), light_damage = def.light_damage or 0, + sunlight_damage = def.sunlight_damage or 0, water_damage = def.water_damage or 0, - lava_damage = def.lava_damage or 0, - suffocation = def.suffocation or 2, + lava_damage = def.lava_damage or 8, + fire_damage = def.fire_damage or 1, + suffocation = def.suffocation or true, fall_damage = def.fall_damage or 1, fall_speed = def.fall_speed or -10, -- must be lower than -2 (default: -10) drops = def.drops or {}, armor = def.armor or 100, - on_rightclick = def.on_rightclick, + on_rightclick = create_mob_on_rightclick(def.on_rightclick), arrow = def.arrow, shoot_interval = def.shoot_interval, sounds = def.sounds or {}, @@ -2625,10 +3351,7 @@ minetest.register_entity(name, { attacks_monsters = def.attacks_monsters or false, group_attack = def.group_attack or false, passive = def.passive or false, - recovery_time = def.recovery_time or 0.5, - knock_back = def.knock_back or 3, - blood_amount = def.blood_amount or 5, - blood_texture = def.blood_texture or "mobs_blood.png", + knock_back = def.knock_back ~= false, shoot_offset = def.shoot_offset or 0, floats = def.floats or 1, -- floats in water by default replace_rate = def.replace_rate, @@ -2637,12 +3360,11 @@ minetest.register_entity(name, { replace_offset = def.replace_offset or 0, on_replace = def.on_replace, timer = 0, - env_damage_timer = 0, -- only used when state = "attack" + env_damage_timer = 0, tamed = false, pause_timer = 0, horny = false, hornytimer = 0, - child = false, gotten = false, health = 0, reach = def.reach or 3, @@ -2656,7 +3378,11 @@ minetest.register_entity(name, { runaway_timer = 0, pathfinding = def.pathfinding, immune_to = def.immune_to or {}, - explosion_radius = def.explosion_radius, + explosion_radius = def.explosion_radius, -- LEGACY + explosion_damage_radius = def.explosion_damage_radius, -- LEGACY + explosion_timer = def.explosion_timer or 3, + allow_fuse_reset = def.allow_fuse_reset ~= false, + stop_to_explode = def.stop_to_explode ~= false, custom_attack = def.custom_attack, double_melee_attack = def.double_melee_attack, dogshoot_switch = def.dogshoot_switch, @@ -2665,15 +3391,41 @@ minetest.register_entity(name, { dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), attack_animals = def.attack_animals or false, specific_attack = def.specific_attack, + runaway_from = def.runaway_from, owner_loyal = def.owner_loyal, + facing_fence = false, _cmi_is_mob = true, + -- MCL2 extensions + spawn_class = def.spawn_class, + ignores_nametag = def.ignores_nametag or false, + rain_damage = def.rain_damage or 0, + glow = def.glow, + can_despawn = can_despawn, + child = def.child or false, + texture_mods = {}, + shoot_arrow = def.shoot_arrow, + sounds_child = def.sounds_child, + explosion_strength = def.explosion_strength, + suffocation_timer = 0, + -- End of MCL2 extensions + + on_spawn = def.on_spawn, + on_blast = def.on_blast or do_tnt, on_step = mob_step, + do_punch = def.do_punch, + on_punch = mob_punch, + on_breed = def.on_breed, + + on_grown = def.on_grown, + + on_detach_child = mob_detach_child, + on_activate = function(self, staticdata, dtime) return mob_activate(self, staticdata, def, dtime) end, @@ -2684,47 +3436,77 @@ minetest.register_entity(name, { }) +if minetest.get_modpath("doc_identifier") ~= nil then + doc.sub.identifier.register_object(name, "basics", "mobs") +end + end -- END mobs:register_mob function -- count how many mobs of one type are inside an area -local count_mobs = function(pos, type) +local count_mobs = function(pos, mobtype) - local num_type = 0 - local num_total = 0 + local num = 0 local objs = minetest.get_objects_inside_radius(pos, aoc_range) for n = 1, #objs do - if not objs[n]:is_player() then + local obj = objs[n]:get_luaentity() - local obj = objs[n]:get_luaentity() + if obj and obj.name and obj._cmi_is_mob then - -- count mob type and add to total also - if obj and obj.name and obj.name == type then - - num_type = num_type + 1 - num_total = num_total + 1 - - -- add to total mobs - elseif obj and obj.name and obj.health ~= nil then - - num_total = num_total + 1 + -- count passive mobs only + if mobtype == "!passive" then + if obj.spawn_class == "passive" then + num = num + 1 + end + -- count hostile mobs only + elseif mobtype == "!hostile" then + if obj.spawn_class == "hostile" then + num = num + 1 + end + -- count ambient mobs only + elseif mobtype == "!ambient" then + if obj.spawn_class == "ambient" then + num = num + 1 + end + -- count water mobs only + elseif mobtype == "!water" then + if obj.spawn_class == "water" then + num = num + 1 + end + -- count mob type + elseif mobtype and obj.name == mobtype then + num = num + 1 + -- count total mobs + elseif not mobtype then + num = num + 1 end end end - return num_type, num_total + return num end -- global functions +function mobs:spawn_abm_check(pos, node, name) + -- global function to add additional spawn checks + -- return true to stop spawning mob +end + + function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn) + -- Do mobs spawn at all? + if not mobs_spawn then + return + end + -- chance/spawn number override in minetest.conf for registered mob - local numbers = minetest.setting_get(name) + local numbers = minetest.settings:get(name) if numbers then numbers = numbers:split(",") @@ -2741,27 +3523,40 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, end - minetest.register_abm({ - - label = name .. " spawning", - nodenames = nodes, - neighbors = neighbors, - interval = interval, - chance = chance, - catch_up = false, - - action = function(pos, node, active_object_count, active_object_count_wider) + local spawn_action + spawn_action = function(pos, node, active_object_count, active_object_count_wider, name) + local orig_pos = table.copy(pos) -- is mob actually registered? - if not mobs.spawning_mobs[name] then ---print ("--- mob doesn't exist", name) + if not mobs.spawning_mobs[name] + or not minetest.registered_entities[name] then + minetest.log("warning", "Mob spawn of "..name.." failed, unknown entity or mob is not registered for spawning!") return end + -- additional custom checks for spawning mob + if mobs:spawn_abm_check(pos, node, name) == true then + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, ABM check rejected!") + return + end + + -- count nearby mobs in same spawn class + local entdef = minetest.registered_entities[name] + local spawn_class = entdef and entdef.spawn_class + if not spawn_class then + if entdef.type == "monster" then + spawn_class = "hostile" + else + spawn_class = "passive" + end + end + local in_class_cap = count_mobs(pos, "!"..spawn_class) < MOB_CAP[spawn_class] -- do not spawn if too many of same mob in area - if active_object_count_wider >= max_per_block - or count_mobs(pos, name) >= aoc then ---print ("--- too many entities", name, aoc, active_object_count_wider) + if active_object_count_wider >= max_per_block -- large-range mob cap + or (not in_class_cap) -- spawn class mob cap + or count_mobs(pos, name) >= aoc then -- per-mob mob cap + -- too many entities + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too crowded!") return end @@ -2773,13 +3568,15 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, if tod > 4500 and tod < 19500 then -- daylight, but mob wants night if day_toggle == false then ---print ("--- mob needs night", name) + -- mob needs night + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs light!") return end else -- night time but mob wants day if day_toggle == true then ---print ("--- mob needs day", name) + -- mob needs day + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs daylight!") return end end @@ -2794,7 +3591,8 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, for n = 1, #objs do if objs[n]:is_player() then ---print ("--- player too close", name) + -- player too close + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, player too close!") return end end @@ -2802,14 +3600,14 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, -- mobs cannot spawn in protected areas when enabled if not spawn_protected and minetest.is_protected(pos, "") then ---print ("--- inside protected area", name) + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, position is protected!") return end -- are we spawning within height limits? if pos.y > max_height or pos.y < min_height then ---print ("--- height limits not met", name, pos.y) + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, out of height limit!") return end @@ -2818,41 +3616,84 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, if not light or light > max_light or light < min_light then ---print ("--- light limits not met", name, light) + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, bad light!") return end - -- are we spawning inside solid nodes? - if minetest.registered_nodes[node_ok(pos).name].walkable == true then ---print ("--- feet in block", name, node_ok(pos).name) - return + -- do we have enough space to spawn mob? + local ent = minetest.registered_entities[name] + local width_x = max(1, math.ceil(ent.collisionbox[4] - ent.collisionbox[1])) + local min_x, max_x + if width_x % 2 == 0 then + max_x = math.floor(width_x/2) + min_x = -(max_x-1) + else + max_x = math.floor(width_x/2) + min_x = -max_x end - pos.y = pos.y + 1 - - if minetest.registered_nodes[node_ok(pos).name].walkable == true then ---print ("--- head in block", name, node_ok(pos).name) - return + local width_z = max(1, math.ceil(ent.collisionbox[6] - ent.collisionbox[3])) + local min_z, max_z + if width_z % 2 == 0 then + max_z = math.floor(width_z/2) + min_z = -(max_z-1) + else + max_z = math.floor(width_z/2) + min_z = -max_z end - -- spawn mob half block higher than ground - pos.y = pos.y - 0.5 + local max_y = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1) + + for y = 0, max_y do + for x = min_x, max_x do + for z = min_z, max_z do + local pos2 = {x = pos.x+x, y = pos.y+y, z = pos.z+z} + if minetest.registered_nodes[node_ok(pos2).name].walkable == true then + -- inside block + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too little space!") + if ent.spawn_small_alternative ~= nil and (not minetest.registered_nodes[node_ok(pos).name].walkable) then + minetest.log("info", "Trying to spawn smaller alternative mob: "..ent.spawn_small_alternative) + spawn_action(orig_pos, node, active_object_count, active_object_count_wider, ent.spawn_small_alternative) + end + return + end + end + end + end + + -- spawn mob 1/2 node above ground + pos.y = pos.y + 0.5 + -- tweak X/Z spawn pos + if width_x % 2 == 0 then + pos.x = pos.x + 0.5 + end + if width_z % 2 == 0 then + pos.z = pos.z + 0.5 + end local mob = minetest.add_entity(pos, name) + minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) - if mob and mob:get_luaentity() then --- print ("[mobs] Spawned " .. name .. " at " --- .. minetest.pos_to_string(pos) .. " on " --- .. node.name .. " near " .. neighbors[1]) - if on_spawn and not on_spawn(mob, pos) then - return - end - else - minetest.log("warning", string.format("[mobs] %s failed to spawn at %s", - name, minetest.pos_to_string(pos))) + if on_spawn then + + local ent = mob:get_luaentity() + + on_spawn(ent, pos) end + end - end + local function spawn_abm_action(pos, node, active_object_count, active_object_count_wider) + spawn_action(pos, node, active_object_count, active_object_count_wider, name) + end + + minetest.register_abm({ + label = name .. " spawning", + nodenames = nodes, + neighbors = neighbors, + interval = interval, + chance = floor(max(1, chance * mobs_spawn_chance)), + catch_up = false, + action = spawn_abm_action, }) end @@ -2901,6 +3742,7 @@ function mobs:register_arrow(name, def) hit_player = def.hit_player, hit_node = def.hit_node, hit_mob = def.hit_mob, + hit_object = def.hit_object, drop = def.drop or false, -- drops arrow as registered item when true collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows timer = 0, @@ -2910,19 +3752,19 @@ function mobs:register_arrow(name, def) automatic_face_movement_dir = def.rotate and (def.rotate - (pi / 180)) or false, - on_activate = def.on_activate or nil, + on_activate = def.on_activate, on_step = def.on_step or function(self, dtime) self.timer = self.timer + 1 - local pos = self.object:getpos() + local pos = self.object:get_pos() if self.switch == 0 or self.timer > 150 or not within_limits(pos, 0) then - self.object:remove() ; -- print ("removed arrow") + self.object:remove(); return end @@ -2961,13 +3803,13 @@ function mobs:register_arrow(name, def) minetest.add_item(self.lastpos, self.object:get_luaentity().name) end - self.object:remove() ; -- print ("hit node") + self.object:remove(); return end end - if self.hit_player or self.hit_mob then + if self.hit_player or self.hit_mob or self.hit_object then for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.0)) do @@ -2975,7 +3817,7 @@ function mobs:register_arrow(name, def) and player:is_player() then self.hit_player(self, player) - self.object:remove() ; -- print ("hit player") + self.object:remove(); return end @@ -2986,11 +3828,18 @@ function mobs:register_arrow(name, def) and entity._cmi_is_mob == true and tostring(player) ~= self.owner_id and entity.name ~= self.object:get_luaentity().name then - self.hit_mob(self, player) + self.object:remove(); + return + end - self.object:remove() ; --print ("hit mob") - + if entity + and self.hit_object + and (not entity._cmi_is_mob) + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name then + self.hit_object(self, player) + self.object:remove(); return end end @@ -3002,34 +3851,30 @@ function mobs:register_arrow(name, def) end --- compatibility function -function mobs:explosion(pos, radius) - local self = {sounds = {}} - self.sounds.explode = "tnt_explode" - mobs:boom(self, pos, radius) +-- no damage to nodes explosion +function mobs:safe_boom(self, pos, strength) + minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds and self.sounds.distance or 32 + }, true) + + entity_physics(pos, radius) + effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) end -- make explosion with protection and tnt mod check -function mobs:boom(self, pos, radius) +function mobs:boom(self, pos, strength, fire) - if minetest.get_modpath("mcl_tnt") and tnt and tnt.boom - and not minetest.is_protected(pos, "") then - - tnt.boom(pos, { - radius = radius, - damage_radius = radius, - sound = self.sounds.explode, - }) + if mod_explosions then + if mobs_griefing and not minetest.is_protected(pos, "") then + mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object) + else + mobs:safe_boom(self, pos, strength) + end else - minetest.sound_play(self.sounds.explode, { - pos = pos, - gain = 1.0, - max_hear_distance = self.sounds.distance or 32 - }) - - entity_physics(pos, radius) - effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) + mobs:safe_boom(self, pos, radius) end end @@ -3062,6 +3907,9 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) inventory_image = invimg, groups = grp, + _doc_items_longdesc = S("This allows you to place a single mob."), + _doc_items_usagehelp = S("Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns."), + on_place = function(itemstack, placer, pointed_thing) local pos = pointed_thing.above @@ -3077,25 +3925,58 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) and within_limits(pos, 0) and not minetest.is_protected(pos, placer:get_player_name()) then + local name = placer:get_player_name() + local privs = minetest.get_player_privs(name) + if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then + if minetest.is_protected(pointed_thing.under, name) then + minetest.record_protection_violation(pointed_thing.under, name) + return itemstack + end + if not privs.maphack then + minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner.")) + return itemstack + end + mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name()) + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + return itemstack + end + + if not minetest.registered_entities[mob] then + return itemstack + end + + if minetest.settings:get_bool("only_peaceful_mobs", false) + and minetest.registered_entities[mob].type == "monster" then + minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) + return itemstack + end + pos.y = pos.y + 1 local mob = minetest.add_entity(pos, mob) local ent = mob:get_luaentity() - if not ent then - mob:remove() - return - end - + -- don't set owner if monster or sneak pressed if ent.type ~= "monster" and not placer:get_player_control().sneak then - -- set owner and tame if not monster ent.owner = placer:get_player_name() ent.tamed = true end + -- set nametag + local nametag = itemstack:get_meta():get_string("name") + if nametag ~= "" then + if string.len(nametag) > MAX_MOB_NAME_LENGTH then + nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH) + end + ent.nametag = nametag + update_tag(ent) + end + -- if not in creative then take item - if not creative then + if not mobs.is_creative(placer:get_player_name()) then itemstack:take_item() end end @@ -3107,174 +3988,21 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end --- capture critter (thanks to blert2112 for idea) +-- No-op in MCL2 (capturing mobs is not possible). +-- Provided for compability with Mobs Redo function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) - - if self.child - or not clicker:is_player() - or not clicker:get_inventory() then - return false - end - - -- get name of clicked mob - local mobname = self.name - - -- if not nil change what will be added to inventory - if replacewith then - mobname = replacewith - end - - local name = clicker:get_player_name() - local tool = clicker:get_wielded_item() - - -- are we using hand, net or lasso to pick up mob? - if tool:get_name() ~= "" - and tool:get_name() ~= "mobs:net" - and tool:get_name() ~= "mobs:lasso" then - return false - end - - -- is mob tamed? - if self.tamed == false - and force_take == false then - - minetest.chat_send_player(name, S("Not tamed!")) - - return true -- false - end - - -- cannot pick up if not owner - if self.owner ~= name - and force_take == false then - - minetest.chat_send_player(name, S("@1 is owner!", self.owner)) - - return true -- false - end - - if clicker:get_inventory():room_for_item("main", mobname) then - - -- was mob clicked with hand, net, or lasso? - local chance = 0 - - if tool:get_name() == "" then - chance = chance_hand - - elseif tool:get_name() == "mobs:net" then - - chance = chance_net - - tool:add_wear(4000) -- 17 uses - - clicker:set_wielded_item(tool) - - elseif tool:get_name() == "mobs:lasso" then - - chance = chance_lasso - - tool:add_wear(650) -- 100 uses - - clicker:set_wielded_item(tool) - - end - - -- calculate chance.. add to inventory if successful? - if chance > 0 and random(1, 100) <= chance then - - -- default mob egg - local new_stack = ItemStack(mobname) - - -- add special mob egg with all mob information - -- unless 'replacewith' contains new item to use - if not replacewith then - - new_stack = ItemStack(mobname .. "_set") - - local tmp = {} - - for _,stat in pairs(self) do - local t = type(stat) - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" then - tmp[_] = self[_] - end - end - - local data_str = minetest.serialize(tmp) - - new_stack:set_metadata(data_str) - end - - local inv = clicker:get_inventory() - - if inv:room_for_item("main", new_stack) then - inv:add_item("main", new_stack) - else - minetest.add_item(clicker:getpos(), new_stack) - end - - self.object:remove() - - mob_sound(self, "default_place_node_hard") - - - else - minetest.chat_send_player(name, S("Missed!")) - - mob_sound(self, "mobs_swing") - end - end - - return true + return false end --- protect tamed mob with rune item +-- No-op in MCL2 (protecting mobs is not possible). function mobs:protect(self, clicker) - - local name = clicker:get_player_name() - local tool = clicker:get_wielded_item() - - if tool:get_name() ~= "mobs:protector" then - return false - end - - if self.tamed == false then - minetest.chat_send_player(name, S("Not tamed!")) - return true -- false - end - - if self.protected == true then - minetest.chat_send_player(name, S("Already protected!")) - return true -- false - end - - if not creative then - tool:take_item() -- take 1 protection rune - clicker:set_wielded_item(tool) - end - - self.protected = true --- minetest.chat_send_player(name, S("Protected!")) - - local pos = self.object:getpos() - pos.y = pos.y + self.collisionbox[2] + 0.5 - - effect(self.object:getpos(), 25, "mobs_protect_particle.png", 0.5, 4, 2, 15) - - mob_sound(self, "mobs_spell") - - return true + return false end -local mob_obj = {} -local mob_sta = {} - -- feeding, taming and breeding (thanks blert2112) function mobs:feed_tame(self, clicker, feed_count, breed, tame) - if not self.follow then return false end @@ -3283,7 +4011,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) if follow_holding(self, clicker) then -- if not in creative then take item - if not creative then + if not mobs.is_creative(clicker:get_player_name()) then local item = clicker:get_wielded_item() @@ -3300,11 +4028,6 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) self.health = self.hp_max if self.htimer < 1 then - - minetest.chat_send_player(clicker:get_player_name(), - S("@1 at full health (@2)", - self.name:split(":")[2], tostring(self.health))) - self.htimer = 5 end end @@ -3331,16 +4054,8 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) self.horny = true end - self.gotten = false - if tame then - if self.tamed == false then - minetest.chat_send_player(clicker:get_player_name(), - S("@1 has been tamed!", - self.name:split(":")[2])) - end - self.tamed = true if not self.owner or self.owner == "" then @@ -3349,78 +4064,60 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) end -- make sound when fed so many times - mob_sound(self, self.sounds.random) + mob_sound(self, "random", true) end return true end - local item = clicker:get_wielded_item() - - -- if mob has been tamed you can name it with a nametag - if item:get_name() == "mobs:nametag" - and clicker:get_player_name() == self.owner then - - local name = clicker:get_player_name() - - -- store mob and nametag stack in external variables - mob_obj[name] = self - mob_sta[name] = item - - local tag = self.nametag or "" - - minetest.show_formspec(name, "mobs_nametag", "size[8,4]" - .. mcl_vars.gui_bg - .. mcl_vars.gui_bg_img - .. "field[0.5,1;7.5,0;name;" .. minetest.formspec_escape(S("Enter name:")) .. ";" .. tag .. "]" - .. "button_exit[2.5,3.5;3,1;mob_rename;" .. minetest.formspec_escape(S("Rename")) .. "]") - - end - return false - end - --- inspired by blockmen's nametag mod -minetest.register_on_player_receive_fields(function(player, formname, fields) - - -- right-clicked with nametag and name entered? - if formname == "mobs_nametag" - and fields.name - and fields.name ~= "" then - - local name = player:get_player_name() - - if not mob_obj[name] - or not mob_obj[name].object then - return - end - - -- limit name entered to 64 characters long - if string.len(fields.name) > 64 then - fields.name = string.sub(fields.name, 1, 64) - end - - -- update nametag - mob_obj[name].nametag = fields.name - - update_tag(mob_obj[name]) - - -- if not in creative then take item - if not creative then - - mob_sta[name]:take_item() - - player:set_wielded_item(mob_sta[name]) - end - - -- reset external variables - mob_obj[name] = nil - mob_sta[name] = nil - +-- Spawn a child +function mobs:spawn_child(pos, mob_type) + local child = minetest.add_entity(pos, mob_type) + if not child then + return end -end) + + local ent = child:get_luaentity() + effect(pos, 15, "tnt_smoke.png", 1, 2, 2, 15, 5) + + ent.child = true + + local textures + -- using specific child texture (if found) + if ent.child_texture then + textures = ent.child_texture[1] + end + + -- and resize to half height + child:set_properties({ + textures = textures, + visual_size = { + x = ent.base_size.x * .5, + y = ent.base_size.y * .5, + }, + collisionbox = { + ent.base_colbox[1] * .5, + ent.base_colbox[2] * .5, + ent.base_colbox[3] * .5, + ent.base_colbox[4] * .5, + ent.base_colbox[5] * .5, + ent.base_colbox[6] * .5, + }, + selectionbox = { + ent.base_selbox[1] * .5, + ent.base_selbox[2] * .5, + ent.base_selbox[3] * .5, + ent.base_selbox[4] * .5, + ent.base_selbox[5] * .5, + ent.base_selbox[6] * .5, + }, + }) + + return child +end -- compatibility function for old entities to new modpack entities @@ -3436,11 +4133,12 @@ function mobs:alias_mob(old_name, new_name) on_step = function(self) - local pos = self.object:getpos() - - minetest.add_entity(pos, new_name) + if minetest.registered_entities[new_name] then + minetest.add_entity(self.object:get_pos(), new_name) + end self.object:remove() end }) + end diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt new file mode 100644 index 00000000..17a6a8b0 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -0,0 +1,762 @@ + +Mobs Redo: MineClone 2 Edition +API documentation +============================== + +Welcome to the world of mobs in Minetest and hopefully an easy guide to defining +your own mobs and having them appear in your worlds. + + +Registering Mobs +---------------- + +To register a mob and have it ready for use requires the following function: + + mobs:register_mob(name, definition) + +The 'name' of a mob usually starts with the mod name it's running from followed +by it's own name e.g. + + "mobs_monster:sand_monster" or "mymod:totally_awesome_beast" + +... and the 'definition' is a table which holds all of the settings and +functions needed for the mob to work properly which contains the following: + + 'nametag' contains the name which is shown above mob. + 'type' holds the type of mob that inhabits your world e.g. + "animal" usually docile and walking around. + "monster" attacks player or npc on sight. + "npc" walk around and will defend themselves if hit first, they + kill monsters. + 'hp_min' the minimum health value the mob can spawn with. + 'hp_max' the maximum health value the mob can spawn with. + 'breath_max' The maximum breath value the mob can spawn with and can have. + If -1 (default), mob does not take drowning damage. + 'breathes_in_water' If true, mob loses breath when not in water. Otherwise, + mob loses breath when inside a node with `drowning` attribute + set (default: false). + 'armor' entity armor groups (see lua_api.txt). If table, a list of + armor groups like for entities. If number, set value of + 'fleshy' armor group only. + Note: The 'immortal=1' armor group will automatically be added + since this mod handles health and damage manually. + Default: 100 (mob will take full dmg from 'fleshy' hits) + 'passive' when true allows animals to defend themselves when hit, + otherwise they amble onwards. + 'walk_velocity' is the speed that your mob can walk around. + 'run_velocity' is the speed your mob can run with, usually when attacking. + 'walk_chance' has a 0-100 chance value your mob will walk from standing, + set to 0 for jumping mobs only. + 'jump' when true allows your mob to jump updwards. + 'jump_height' holds the height your mob can jump, 0 to disable jumping. + 'stepheight' height of a block that your mob can easily walk up onto, + defaults to 0.6. + 'fly' when true allows your mob to fly around instead of walking. + 'fly_in' holds the node name or a table of node names in which the + mob flies (or swims) around in. The special name + '__airlike' stands for all nodes with 'walkable=false' + that are not liquids + 'runaway' if true causes animals to turn and run away when hit. + 'view_range' how many nodes in distance the mob can see a player. + 'damage' how many health points the mob does to a player or another + mob when melee attacking. + 'knock_back' when true has mobs falling backwards when hit, the greater + the damage the more they move back. + 'fear_height' is how high a cliff or edge has to be before the mob stops + walking, 0 to turn off height fear. + 'fall_speed' has the maximum speed the mob can fall at, default is -10. + 'fall_damage' when true causes falling to inflict damage. + 'water_damage' holds the damage per second infliced to mobs when standing in + water (default: 0). + 'lava_damage' holds the damage per second inflicted to mobs when standing + in lava (default: 8). + 'fire_damage' holds the damage per second inflicted to mobs when standing + in fire (default: 1). + 'light_damage' holds the damage per second inflicted to mobs when it's too + bright (above 13 light). + 'suffocation' when true causes mobs to suffocate inside solid blocks (2 damage per second). + 'floats' when set to 1 mob will float in water, 0 has them sink. + 'follow' mobs follow player when holding any of the items which appear + on this table, the same items can be fed to a mob to tame or + breed e.g. {"farming:wheat", "default:apple"} + + 'reach' is how far the mob can attack player when standing + nearby, default is 3 nodes. + 'docile_by_day' when true has mobs wandering around during daylight + hours and only attacking player at night or when + provoked. + 'attacks_monsters' when true has npc's attacking monsters or not. + 'attack_animals' when true will have monsters attacking animals. + 'owner_loyal' when true will have tamed mobs attack anything player + punches when nearby. + 'group_attack' when true has same mob type grouping together to attack + offender. + [MCL2 extension:] When a table, this is a list of + mob types that will get alerted as well (besides same mob type) + 'attack_type' tells the api what a mob does when attacking the player + or another mob: + 'dogfight' is a melee attack when player is within mob reach. + 'shoot' has mob shoot pre-defined arrows at player when inside + view_range. + 'dogshoot' has melee attack when inside reach and shoot attack + when inside view_range. + 'explode' causes mob to stop and explode when inside reach. + 'explosion_radius' the radius of explosion node destruction, + defaults to 1 + 'explosion_damage_radius' the radius of explosion entity & player damage, + defaults to explosion_radius * 2 + 'explosion_timer' number of seconds before mob explodes while its target + is still inside reach or explosion_damage_radius, + defaults to 3. + 'allow_fuse_reset' Allow 'explode' attack_type to reset fuse and resume + chasing if target leaves the blast radius or line of + sight. Defaults to true. + 'stop_to_explode' When set to true (default), mob must stop and wait for + explosion_timer in order to explode. If false, mob will + continue chasing. + 'arrow' holds the pre-defined arrow object to shoot when + attacking. + 'dogshoot_switch' allows switching between attack types by using timers + (1 for shoot, 2 for dogfight) + 'dogshoot_count_max' contains how many seconds before switching from + dogfight to shoot. + 'dogshoot_count2_max' contains how many seconds before switching from shoot + to dogfight. + 'shoot_interval' has the number of seconds between shots. + 'shoot_offset' holds the y position added as to where the + arrow/fireball appears on mob. + 'specific_attack' has a table of entity names that mob can also attack + e.g. {"player", "mobs_animal:chicken"}. + 'runaway_from' contains a table with mob names to run away from, add + "player" to list to runaway from player also. + 'pathfinding' set to 1 for mobs to use pathfinder feature to locate + player, set to 2 so they can build/break also (only + works with dogfight attack and when 'mobs_griefing' + in minetest.conf is not false). + 'immune_to' is a table that holds specific damage when being hit by + certain items e.g. + {"default:sword_wood", 0} -- causes no damage. + {"default:gold_lump", -10} -- heals by 10 health points. + {"default:coal_block", 20} -- 20 damage when hit on head with coal blocks. + + 'makes_footstep_sound' when true you can hear mobs walking. + 'sounds' this is a table with sounds of the mob + 'distance' maximum distance sounds can be heard, default is 10. + 'base_pitch' base pitch to use adult mobs, default is 1.0 (MCL2 extension) + 'random' played randomly from time to time. + also played for overfeeding animal. + 'war_cry' what you hear when mob starts to attack player. (currently disabled) + 'attack' what you hear when being attacked. + 'shoot_attack' sound played when mob shoots. + 'damage' sound heard when mob is hurt. + 'death' played when mob is killed. + 'jump' played when mob jumps. There's a built-in cooloff timer to avoid sound spam + 'fuse' sound played when mob explode timer starts. + 'explode' sound played when mob explodes. + + Note: For all sounds except fuse and explode, the pitch is slightly randomized from the base pitch + The pitch of children is 50% higher. + + 'drops' table of items that are dropped when mob is killed, fields are: + 'name' name of item to drop. + 'chance' chance of drop, 1 for always, 2 for 1-in-2 chance etc. + 'min' minimum number of items dropped. + 'max' maximum number of items dropped. + + 'visual' holds the look of the mob you wish to create: + 'cube' looks like a normal node + 'sprite' sprite which looks same from all angles. + 'upright_sprite' flat model standing upright. + 'wielditem' how it looks when player holds it in hand. + 'mesh' uses separate object file to define mob. + 'visual_size' has the size of the mob, defaults to {x = 1, y = 1} + 'collisionbox' has the box in which mob can be interacted with the + world e.g. {-0.5, -0.5, -0.5, 0.5, 0.8, 0.5}. + NOTE: Due to a workaround, the upper Y coordinate will be forced + to a minimum value of 0.79. + 'selectionbox' has the box in which player can interact with mob + 'textures' holds a table list of textures to be used for mob, or you + could use multiple lists inside another table for random + selection e.g. { {"texture1.png"}, {"texture2.png"} } + 'child_texture' holds the texture table for when baby mobs are used. + 'gotten_texture' holds the texture table for when self.gotten value is + true, used for milking cows or shearing sheep. + 'mesh' holds the name of the external object used for mob model + e.g. "mobs_cow.b3d" + 'gotten_mesh" holds the name of the external object used for when + self.gotten is true for mobs. + 'rotate' custom model rotation, 0 = front, 90 = side, 180 = back, + 270 = other side. + 'double_melee_attack' when true has the api choose between 'punch' and + 'punch2' animations. + + 'animation' holds a table containing animation names and settings for use with mesh models: + 'stand_start' start frame for when mob stands still. + 'stand_end' end frame of stand animation. + 'stand_speed' speed of animation in frames per second. + 'walk_start' when mob is walking around. + 'walk_end' + 'walk_speed' + 'run_start' when a mob runs or attacks. + 'run_end' + 'run_speed' + 'fly_start' when a mob is flying. + 'fly_end' + 'fly_speed' + 'punch_start' when a mob melee attacks. + 'punch_end' + 'punch_speed' + 'punch2_start' alternative melee attack animation. + 'punch2_end' + 'punch2_speed' + 'shoot_start' shooting animation. + 'shoot_end' + 'shoot_speed' + 'die_start' death animation + 'die_end' + 'die_speed' + 'die_loop' when set to false stops the animation looping. + + Using '_loop = false' setting will stop any of the above animations from + looping. + + 'speed_normal' is used for animation speed for compatibility with some + older mobs. + + + MineClone 2 extensions: + + 'spawn_class' Classification of mod for the spawning algorithm: + "hostile", "passive", "ambient" or "water" + 'ignores_nametag' if true, mob cannot be named by nametag + 'rain_damage' damage per second if mob is standing in rain (default: 0) + 'sunlight_damage' holds the damage per second inflicted to mobs when they + are in direct sunlight + 'spawn_small_alternative': name of a smaller mob to use as replacement if + spawning fails due to space requirements + 'glow' same as in entity definition + 'child' if true, spawn mob as child + 'shoot_arrow(self, pos, dir)' function that is called when mob wants to shoot an arrow. + You can spawn your own arrow here. pos is mob position, + dir is mob's aiming direction + 'sounds_child' same as sounds, but for childs. If not defined, childs will use same + sound as adults but with higher pitch + + +Node Replacement +---------------- + +Mobs can look around for specific nodes as they walk and replace them to mimic +eating. + + 'replace_what' group of items to replace e.g. + {"farming:wheat_8", "farming:carrot_8"} + or you can use the specific options of what, with and + y offset by using this instead: + { + {"group:grass", "air", 0}, + {"default:dirt_with_grass", "default:dirt", -1} + } + 'replace_with' replace with what e.g. "air" or in chickens case "mobs:egg" + 'replace_rate' how random should the replace rate be (typically 10) + 'replace_offset' +/- value to check specific node to replace + + 'on_replace(self, pos, oldnode, newnode)' + is called when mob is about to replace a node. Also called + when not actually replacing due to mobs_griefing setting being false. + 'self' ObjectRef of mob + 'pos' Position of node to replace + 'oldnode' Current node + 'newnode' What the node will become after replacing + + If false is returned, the mob will not replace the node. + + By default, replacing sets self.gotten to true and resets the object + properties. + + +Custom Definition Functions +--------------------------- + +Along with the above mob registry settings we can also use custom functions to +enhance mob functionality and have them do many interesting things: + + 'on_die' a function that is called when the mob is killed the + parameters are (self, pos) + 'on_rightclick' its same as in minetest.register_entity() + 'on_blast' is called when an explosion happens near mob when using TNT + functions, parameters are (object, damage) and returns + (do_damage, do_knockback, drops) + 'on_spawn' is a custom function that runs on mob spawn with 'self' as + variable, return true at end of function to run only once. + 'after_activate' is a custom function that runs once mob has been activated + with these paramaters (self, staticdata, def, dtime) + 'on_breed' called when two similar mobs breed, paramaters are + (parent1, parent2) objects, return false to stop child from + being resized and owner/tamed flags and child textures being + applied. Function itself must spawn new child mob. + 'on_grown' is called when a child mob has grown up, only paramater is + (self). + 'do_punch' called when mob is punched with paramaters (self, hitter, + time_from_last_punch, tool_capabilities, direction), return + false to stop punch damage and knockback from taking place. + 'custom_attack' when set this function is called instead of the normal mob + melee attack, parameters are (self, to_attack). + 'on_die' a function that is called when mob is killed (self, pos) + 'do_custom' a custom function that is called every tick while mob is + active and which has access to all of the self.* variables + e.g. (self.health for health or self.standing_in for node + status), return with 'false' to skip remainder of mob API. + + +Internal Variables +------------------ + +The mob api also has some preset variables and functions that it will remember +for each mob. + + 'self.health' contains current health of mob (cannot exceed + self.hp_max) + 'self.breath' contains current breath of mob, if mob takes drowning + damage at all (cannot exceed self.breath_max). Breath + decreases by 1 each second while in a node with drowning + damage and increases by 1 each second otherwise. + 'self.texture_list' contains list of all mob textures + 'self.child_texture' contains mob child texture when growing up + 'self.base_texture' contains current skin texture which was randomly + selected from textures list + 'self.gotten' this is used to track whether some special item has been + gotten from the mob, for example, wool from sheep. + Initialized as false, and the mob must set this value + manually. + 'self.horny' when animal fed enough it is set to true and animal can + breed with same animal + 'self.hornytimer' background timer that controls breeding functions and + mob childhood timings + 'self.child' used for when breeding animals have child, will use + child_texture and be half size + 'self.owner' string used to set owner of npc mobs, typically used for + dogs + 'self.order' set to "follow" or "stand" so that npc will follow owner + or stand it's ground + 'self.nametag' contains the name of the mob which it can show above + + +Spawning Mobs in World +---------------------- + +mobs:register_spawn(name, nodes, max_light, min_light, chance, + active_object_count, max_height, day_toggle) + +mobs:spawn_specfic(name, nodes, neighbors, min_light, max_light, interval, + chance, active_object_count, min_height, max_height, day_toggle, on_spawn) + +These functions register a spawn algorithm for the mob. Without this function +the call the mobs won't spawn. + + 'name' is the name of the animal/monster + 'nodes' is a list of nodenames on that the animal/monster can + spawn on top of + 'neighbors' is a list of nodenames on that the animal/monster will + spawn beside (default is {"air"} for + mobs:register_spawn) + 'max_light' is the maximum of light + 'min_light' is the minimum of light + 'interval' is same as in register_abm() (default is 30 for + mobs:register_spawn) + 'chance' is same as in register_abm() + 'active_object_count' number of this type of mob to spawn at one time inside + map area + 'min_height' is the minimum height the mob can spawn + 'max_height' is the maximum height the mob can spawn + 'day_toggle' true for day spawning, false for night or nil for + anytime + 'on_spawn' is a custom function which runs after mob has spawned + and gives self and pos values. + +A simpler way to handle mob spawns has been added with the mobs:spawn(def) +command which uses above names to make settings clearer: + + mobs:spawn({name = "mobs_monster:tree_monster", + nodes = {"group:leaves"}, + max_light = 7, + }) + + +For each mob that spawns with this function is a field in mobs.spawning_mobs. +It tells if the mob should spawn or not. Default is true. So other mods can +only use the API of this mod by disabling the spawning of the default mobs in +this mod. + + +mobs:spawn_abm_check(pos, node, name) + +This global function can be changed to contain additional checks for mobs to +spawn e.g. mobs that spawn only in specific areas and the like. By returning +true the mob will not spawn. + + 'pos' holds the position of the spawning mob + 'node' contains the node the mob is spawning on top of + 'name' is the name of the animal/monster + + +MineClone 2 extensions +---------------------- + +mobs:spawn_child(pos, mob_type) + +This function spawns a mob as a child. The parameter mob_type is the +entitystring of the new mob. +This function returns the mob on success and nil otherwise. + + +Making Arrows +------------- + +mobs:register_arrow(name, definition) + +This function registers a arrow for mobs with the attack type shoot. + + 'name' is the name of the arrow + 'definition' is a table with the following values: + 'visual' same is in minetest.register_entity() + 'visual_size' same is in minetest.register_entity() + 'textures' same is in minetest.register_entity() + 'velocity' the velocity of the arrow + 'drop' if set to true any arrows hitting a node will drop as item + 'hit_player' a function that is called when the arrow hits a player; + this function should hurt the player, the parameters are + (self, player) + 'hit_mob' a function that is called when the arrow hits a mob; + this function should hurt the mob, the parameters are + (self, mob) + 'hit_object' a function that is called when the arrow hits an object + that is neither a player nor a mob. this function should + hurt the object, the parameters are (self, object) + 'hit_node' a function that is called when the arrow hits a node, the + parameters are (self, pos, node) + 'tail' when set to 1 adds a trail or tail to mob arrows + 'tail_texture' texture string used for above effect + 'tail_size' has size for above texture (defaults to between 5 and 10) + 'expire' contains float value for how long tail appears for + (defaults to 0.25) + 'glow' has value for how brightly tail glows 1 to 10 (default is + 0 for no glow) + 'rotate' integer value in degrees to rotate arrow + 'on_step' is a custom function when arrow is active, nil for + default. + + +Spawn Eggs +---------- + +mobs:register_egg(name, description, background, addegg, no_creative) + +This function registers a spawn egg which can be used by admin to properly spawn in a mob. + + 'name' this is the name of your new mob to spawn e.g. "mob:sheep" + 'description' the name of the new egg you are creating e.g. "Spawn Sheep" + 'background' the texture displayed for the egg in inventory + 'addegg' would you like an egg image in front of your texture (1 = yes, + 0 = no) + 'no_creative' when set to true this stops spawn egg appearing in creative + mode for destructive mobs like Dungeon Masters. + + +Explosion Function +------------------ + +mobs:boom(self, pos, radius) + 'self' mob entity + 'pos' centre position of explosion + 'radius' radius of explosion (typically set to 3) + +This function generates an explosion which removes nodes in a specific radius +and damages any entity caught inside the blast radius. Protection will limit +node destruction but not entity damage. + + +mobs:capture_mob +---------------- + +mobs:capture_mob(...) + +Does nothing and returns false. + +This function is provided for compability with Mobs Redo for an attempt to +capture a mob. +Mobs cannot be captured in MineClone 2. + +In Mobs Redo, this is generally called inside the on_rightclick section of the mob +api code, it provides a chance of capturing the mob. See Mobs Redo documentation +of parameters. + +Feeding and Taming/Breeding +--------------------------- + +mobs:feed_tame(self, clicker, feed_count, breed, tame) + +This function allows the mob to be fed the item inside self.follow be it apple, +wheat or whatever a set number of times and be tamed or bred as a result. +Will return true when mob is fed with item it likes. + + 'self' mob information + 'clicker' player information + 'feed_count' number of times mob must be fed to tame or breed + 'breed' true or false stating if mob can be bred and a child created + afterwards + 'tame' true or false stating if mob can be tamed so player can pick + them up + + +Protecting Mobs +--------------- + +mobs:protect(self, clicker) + +This function can be used to right-click any tamed mob with mobs:protector item, +this will protect the mob from harm inside of a protected area from other +players. Will return true when mob right-clicked with mobs:protector item. + + 'self' mob information + 'clicker' player information + + +Riding Mobs +----------- + +Mobs can now be ridden by players and the following shows its functions and +usage: + + +mobs:attach(self, player) + +This function attaches a player to the mob so it can be ridden. + + 'self' mob information + 'player' player information + + +mobs:detach(player, offset) + +This function will detach the player currently riding a mob to an offset +position. + + 'player' player information + 'offset' position table containing offset values + + +mobs:drive(self, move_animation, stand_animation, can_fly, dtime) + +This function allows an attached player to move the mob around and animate it at +same time. + + 'self' mob information + 'move_animation' string containing movement animation e.g. "walk" + 'stand_animation' string containing standing animation e.g. "stand" + 'can_fly' if true then jump and sneak controls will allow mob to fly + up and down + 'dtime' tick time used inside drive function + + +mobs:fly(self, dtime, speed, can_shoot, arrow_entity, move_animation, stand_animation) + +This function allows an attached player to fly the mob around using directional +controls. + + 'self' mob information + 'dtime' tick time used inside fly function + 'speed' speed of flight + 'can_shoot' true if mob can fire arrow (sneak and left mouse button + fires) + 'arrow_entity' name of arrow entity used for firing + 'move_animation' string containing name of pre-defined animation e.g. "walk" + or "fly" etc. + 'stand_animation' string containing name of pre-defined animation e.g. + "stand" or "blink" etc. + +Note: animation names above are from the pre-defined animation lists inside mob +registry without extensions. + + +mobs:set_animation(self, name) + +This function sets the current animation for mob, defaulting to "stand" if not +found. + + 'self' mob information + 'name' name of animation + + +Certain variables need to be set before using the above functions: + + 'self.v2' toggle switch used to define below values for the + first time + 'self.max_speed_forward' max speed mob can move forward + 'self.max_speed_reverse' max speed mob can move backwards + 'self.accel' acceleration speed + 'self.terrain_type' integer containing terrain mob can walk on + (1 = water, 2 or 3 = land) + 'self.driver_attach_at' position offset for attaching player to mob + 'self.driver_eye_offset' position offset for attached player view + 'self.driver_scale' sets driver scale for mobs larger than {x=1, y=1} + + +External Settings for "minetest.conf" +------------------------------------ + + 'enable_damage' if true monsters will attack players (default is true) + 'only_peaceful_mobs' if true only animals will spawn in game (default is + false) + 'mobs_disable_blood' if false, damage effects appear when mob is hit (default + is false) + 'mobs_spawn_protected' if set to false then mobs will not spawn in protected + areas (default is true) + 'mob_difficulty' sets difficulty level (health and hit damage + multiplied by this number), defaults to 1.0. + 'mob_spawn_chance' multiplies chance of all mobs spawning and can be set + to 0.5 to have mobs spawn more or 2.0 to spawn less. + e.g. 1 in 7000 * 0.5 = 1 in 3500 so better odds of + spawning. + 'mobs_spawn' if false then mobs no longer spawn without spawner or + spawn egg. + 'mobs_drop_items' when false mobs no longer drop items when they die. + 'mobs_griefing' when false mobs cannot break blocks when using either + pathfinding level 2, replace functions or mobs:boom + function. + +Players can override the spawn chance for each mob registered by adding a line +to their minetest.conf file with a new value, the lower the value the more each +mob will spawn e.g. + +mobs_animal:sheep_chance 11000 +mobs_monster:sand_monster_chance 100 + + +Rideable Horse Example Mob +-------------------------- + +mobs:register_mob("mob_horse:horse", { + type = "animal", + visual = "mesh", + visual_size = {x = 1.20, y = 1.20}, + mesh = "mobs_horse.x", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, + animation = { + speed_normal = 15, + speed_run = 30, + stand_start = 25, + stand_end = 75, + walk_start = 75, + walk_end = 100, + run_start = 75, + run_end = 100, + }, + textures = { + {"mobs_horse.png"}, + {"mobs_horsepeg.png"}, + {"mobs_horseara.png"} + }, + fear_height = 3, + runaway = true, + fly = false, + walk_chance = 60, + view_range = 5, + follow = {"farming:wheat"}, + passive = true, + hp_min = 12, + hp_max = 16, + armor = 200, + lava_damage = 5, + fall_damage = 5, + water_damage = 1, + makes_footstep_sound = true, + drops = { + {name = "mobs:meat_raw", chance = 1, min = 2, max = 3} + }, + sounds = { + random = "horse_neigh.ogg", + damage = "horse_whinney.ogg", + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 6 + self.max_speed_reverse = 2 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 20, z = -2} + self.driver_eye_offset = {x = 0, y = 3, z = 0} + self.driver_scale = {x = 1, y = 1} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + minetest.add_item(pos, "mobs:saddle") + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + end + + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == clicker:get_player_name() then + + local inv = clicker:get_inventory() + + -- detatch player already riding horse + if self.driver and clicker == self.driver then + + mobs.detach(clicker, {x = 1, y = 0, z = 1}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker.get_pos(), "mobs:saddle") + end + + -- attach player to horse + elseif not self.driver + and clicker:get_wielded_item():get_name() == "mobs:saddle" then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + inv:remove_item("main", "mobs:saddle") + end + end + + -- used to capture horse with magic lasso + mobs:capture_mob(self, clicker, 0, 0, 80, false, nil) + end +}) diff --git a/mods/ENTITIES/mcl_mobs/crafts.lua b/mods/ENTITIES/mcl_mobs/crafts.lua new file mode 100644 index 00000000..e8a5b60f --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/crafts.lua @@ -0,0 +1,16 @@ + +local S = minetest.get_translator("mcl_mobs") + +-- name tag +minetest.register_craftitem("mcl_mobs:nametag", { + description = S("Name Tag"), + _tt_help = S("Give names to mobs").."\n"..S("Set name at anvil"), + _doc_items_longdesc = S("A name tag is an item to name a mob."), + _doc_items_usagehelp = S("Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag."), + inventory_image = "mobs_nametag.png", + wield_image = "mobs_nametag.png", + stack_max = 64, + groups = { tool=1 }, +}) + +minetest.register_alias("mobs:nametag", "mcl_mobs:nametag") diff --git a/mods/ENTITIES/mcl_mobs/description.txt b/mods/ENTITIES/mcl_mobs/description.txt new file mode 100644 index 00000000..a426a100 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/description.txt @@ -0,0 +1 @@ +Adds a mob API for mods to add animals or monsters, etc. diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua new file mode 100644 index 00000000..c2d6cb21 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -0,0 +1,11 @@ + +local path = minetest.get_modpath(minetest.get_current_modname()) + +-- Mob API +dofile(path .. "/api.lua") + +-- Rideable Mobs +dofile(path .. "/mount.lua") + +-- Mob Items +dofile(path .. "/crafts.lua") diff --git a/mods/ENTITIES/mobs/license.txt b/mods/ENTITIES/mcl_mobs/license.txt similarity index 100% rename from mods/ENTITIES/mobs/license.txt rename to mods/ENTITIES/mcl_mobs/license.txt diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr new file mode 100644 index 00000000..3b1a310b --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_mobs +Peaceful mode active! No monsters will spawn.=Friedlicher Modus aktiv! Es werden keine Monster auftauchen. +This allows you to place a single mob.=Damit kann man einen Mob platzieren. +Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Platzieren Sie dies einfach dort, wo der Mob auftauchen soll. Tiere werden zahm erscheinen, außer, wenn Sie beim Platzieren die Schlichtaste drücken. Platzieren Sie dies auf einem Mobspawner, um den Mob im Mobspawner zu wechseln. +You need the “maphack” privilege to change the mob spawner.=Sie brauchen das „maphack“-Privileg, um den Mobspawner ändern zu können. +Name Tag=Namensschild +A name tag is an item to name a mob.=Ein Namensschild ist ein Gegenstand, um einen Mob zu benennen. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Bevor Sie ein Namensschild benutzen können, müssen Sie ihn an einem Amboss benennen. Dann können können Sie das Namensschild benutztn, um einen Mob zu benennen. Das wird das Namensschild verbrauchen. +Only peaceful mobs allowed!=Nur friedliche Mobs erlaubt! +Give names to mobs=Benennt Mobs +Set name at anvil=Namen am Amboss setzen diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr new file mode 100644 index 00000000..ef067141 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_mobs +Peaceful mode active! No monsters will spawn.=¡Modo pacífico activo! No aparecerán monstruos. +This allows you to place a single mob.=Esto le permite colocar un solo animal. +Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Simplemente colóquelo donde desea que aparezcan los animales. Los animales aparecerán domesticados, a menos que mantenga presionada la tecla de sigilo mientras coloca. Si coloca esto en un engendrador de animales, cambia el animal que genera. +You need the “maphack” privilege to change the mob spawner.=Necesita el privilegio "maphack" para cambiar el generador de animales. +Name Tag=Etiqueta +A name tag is an item to name a mob.=Una etiqueta es un elemento para nombrar una animal. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Antes de usar la etiqueta, debe establecer un nombre en un yunque. Luego puede usar la etiqueta para nombrar un animal. Esto usa la etiqueta. +Only peaceful mobs allowed!=¡Solo se permiten animales pacíficos! diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr new file mode 100644 index 00000000..96ac6a81 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_mobs +Peaceful mode active! No monsters will spawn.=Mode paisible actif! Aucun monstre n'apparaîtra. +This allows you to place a single mob.=Cela vous permet de placer un seul mob. +Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Placez-le là où vous voulez que le mob apparaisse. Les animaux apparaîtront apprivoisés, sauf si vous maintenez la touche furtive enfoncée pendant le placement. Si vous le placez sur un générateur de mob, vous changez le mob qu'il génère. +You need the “maphack” privilege to change the mob spawner.=Vous avez besoin du privilège "maphack" pour changer le générateur de mob. +Name Tag=Étiquette de nom +A name tag is an item to name a mob.=Une étiquette de nom est un élément pour nommer un mob. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Avant d'utiliser l'étiquette de nom, vous devez définir un nom sur une enclume. Ensuite, vous pouvez utiliser l'étiquette de nom pour nommer un mob. Cela utilise l'étiquette de nom. +Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisées! +Give names to mobs=Donne des noms aux mobs +Set name at anvil=Définir le nom sur l'enclume diff --git a/mods/ENTITIES/mcl_mobs/locale/template.txt b/mods/ENTITIES/mcl_mobs/locale/template.txt new file mode 100644 index 00000000..e24974a4 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: mcl_mobs +Peaceful mode active! No monsters will spawn.= +This allows you to place a single mob.= +Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.= +You need the “maphack” privilege to change the mob spawner.= +Name Tag= +A name tag is an item to name a mob.= +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.= +Only peaceful mobs allowed!= +Give names to mobs= +Set name at anvil= diff --git a/mods/ENTITIES/mcl_mobs/lucky_block.lua b/mods/ENTITIES/mcl_mobs/lucky_block.lua new file mode 100644 index 00000000..ea90de74 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/lucky_block.lua @@ -0,0 +1,8 @@ + +if minetest.get_modpath("lucky_block") then + + lucky_block:add_blocks({ + {"dro", {"mcl_mobs:nametag"}, 1}, + {"lig"}, + }) +end diff --git a/mods/ENTITIES/mcl_mobs/mod.conf b/mods/ENTITIES/mcl_mobs/mod.conf new file mode 100644 index 00000000..a32827a6 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/mod.conf @@ -0,0 +1,2 @@ +name = mcl_mobs +optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, lucky_block, cmi, doc_identifier, mcl_armor diff --git a/mods/ENTITIES/mobs/mount.lua b/mods/ENTITIES/mcl_mobs/mount.lua similarity index 83% rename from mods/ENTITIES/mobs/mount.lua rename to mods/ENTITIES/mcl_mobs/mount.lua index 050fbb5d..8c4a6aa5 100644 --- a/mods/ENTITIES/mobs/mount.lua +++ b/mods/ENTITIES/mcl_mobs/mount.lua @@ -121,7 +121,7 @@ end) function mobs.attach(entity, player) - local attach_at, eye_offset = {}, {} + local attach_at, eye_offset entity.player_rotation = entity.player_rotation or {x = 0, y = 0, z = 0} entity.driver_attach_at = entity.driver_attach_at or {x = 0, y = 0, z = 0} @@ -151,12 +151,14 @@ function mobs.attach(entity, player) } }) - minetest.after(0.2, function() - mcl_player.player_set_animation(player, "sit" , 30) - end) + minetest.after(0.2, function(name) + local player = minetest.get_player_by_name(name) + if player then + mcl_player.player_set_animation(player, "sit" , 30) + end + end, player:get_player_name()) - --player:set_look_yaw(entity.object:getyaw() - rot_view) - player:set_look_horizontal(entity.object:getyaw() - rot_view) + player:set_look_horizontal(entity.object:get_yaw() - rot_view) end @@ -166,34 +168,35 @@ function mobs.detach(player, offset) mcl_player.player_set_animation(player, "stand" , 30) - local pos = player:getpos() + local pos = player:get_pos() pos = {x = pos.x + offset.x, y = pos.y + 0.2 + offset.y, z = pos.z + offset.z} - minetest.after(0.1, function() - player:setpos(pos) - end) + minetest.after(0.1, function(name, pos) + local player = minetest.get_player_by_name(name) + if player then + player:set_pos(pos) + end + end, player:get_player_name(), pos) end function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) - local rot_steer, rot_view = math.pi/2, 0 + local rot_view = 0 if entity.player_rotation.y == 90 then - rot_steer, rot_view = 0, math.pi/2 + rot_view = math.pi/2 end local acce_y = 0 - local velo = entity.object:getvelocity() + local velo = entity.object:get_velocity() entity.v = get_v(velo) * get_sign(entity.v) -- process controls if entity.driver then ---print ("---velo", get_v(velo)) - local ctrl = entity.driver:get_player_control() -- move forwards @@ -212,8 +215,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end -- fix mob rotation --- entity.object:setyaw(entity.driver:get_look_yaw() - entity.rotate) - entity.object:setyaw(entity.driver:get_look_horizontal() - entity.rotate) + entity.object:set_yaw(entity.driver:get_look_horizontal() - entity.rotate) if can_fly then @@ -260,7 +262,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) return end - + -- set moving animation if moving_anim then mobs:set_animation(entity, moving_anim) @@ -273,7 +275,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) if s ~= get_sign(entity.v) then - entity.object:setvelocity({x = 0, y = 0, z = 0}) + entity.object:set_velocity({x = 0, y = 0, z = 0}) entity.v = 0 return end @@ -290,8 +292,8 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end -- Set position, velocity and acceleration - local p = entity.object:getpos() - local new_velo = {x = 0, y = 0, z = 0} + local p = entity.object:get_pos() + local new_velo local new_acce = {x = 0, y = -9.8, z = 0} p.y = p.y - 0.5 @@ -316,7 +318,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) minetest.sound_play("default_punch", { object = entity.object, max_hear_distance = 5 - }) + }, true) entity.object:punch(entity.object, 1.0, { full_punch_interval = 1.0, @@ -344,9 +346,9 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end else if math.abs(velo.y) < 1 then - local pos = entity.object:getpos() + local pos = entity.object:get_pos() pos.y = math.floor(pos.y) + 0.5 - entity.object:setpos(pos) + entity.object:set_pos(pos) velo.y = 0 end end @@ -355,11 +357,11 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end end - new_velo = get_velocity(v, entity.object:getyaw() - rot_view, velo.y) + new_velo = get_velocity(v, entity.object:get_yaw() - rot_view, velo.y) new_acce.y = new_acce.y + acce_y - entity.object:setvelocity(new_velo) - entity.object:setacceleration(new_acce) + entity.object:set_velocity(new_velo) + entity.object:set_acceleration(new_acce) -- CRASH! if enable_crash then @@ -368,8 +370,6 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) if intensity >= crash_threshold then ---print("----------- crash", intensity) - entity.object:punch(entity.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = intensity} @@ -387,40 +387,34 @@ end function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) local ctrl = entity.driver:get_player_control() - local velo = entity.object:getvelocity() + local velo = entity.object:get_velocity() local dir = entity.driver:get_look_dir() --- local yaw = entity.driver:get_look_yaw() local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands - local rot_steer, rot_view = math.pi / 2, 0 - - if entity.player_rotation.y == 90 then - rot_steer, rot_view = 0, math.pi / 2 - end if ctrl.up then - entity.object:setvelocity({ + entity.object:set_velocity({ x = dir.x * speed, y = dir.y * speed + 2, z = dir.z * speed }) elseif ctrl.down then - entity.object:setvelocity({ + entity.object:set_velocity({ x = -dir.x * speed, y = dir.y * speed + 2, z = -dir.z * speed }) elseif not ctrl.down or ctrl.up or ctrl.jump then - entity.object:setvelocity({x = 0, y = -2, z = 0}) + entity.object:set_velocity({x = 0, y = -2, z = 0}) end - entity.object:setyaw(yaw + math.pi + math.pi / 2 - entity.rotate) + entity.object:set_yaw(yaw + math.pi + math.pi / 2 - entity.rotate) -- firing arrows if ctrl.LMB and ctrl.sneak and shoots then - local pos = entity.object:getpos() + local pos = entity.object:get_pos() local obj = minetest.add_entity({ x = pos.x + 0 + dir.x * 2.5, y = pos.y + 1.5 + dir.y, @@ -431,10 +425,9 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) ent.switch = 1 -- for mob specific arrows ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} --- local yaw = entity.driver:get_look_yaw() local yaw = entity.driver:get_look_horizontal() - obj:setyaw(yaw + math.pi / 2) - obj:setvelocity(vec) + obj:set_yaw(yaw + math.pi / 2) + obj:set_velocity(vec) else obj:remove() end diff --git a/mods/ENTITIES/mobs/readme.MD b/mods/ENTITIES/mcl_mobs/readme.MD similarity index 90% rename from mods/ENTITIES/mobs/readme.MD rename to mods/ENTITIES/mcl_mobs/readme.MD index ae879e56..0d332f85 100644 --- a/mods/ENTITIES/mobs/readme.MD +++ b/mods/ENTITIES/mcl_mobs/readme.MD @@ -1,6 +1,7 @@ -MOBS REDO for MINETEST +Mobs Redo: MineClone 2 Edition +Based on Mobs Redo from TenPlus1 Built from PilzAdam's original Simple Mobs with additional mobs by KrupnoPavel, Zeg9, ExeterDad and AspireMint. @@ -10,18 +11,18 @@ This mod contains the API only for adding your own mobs into the world, so pleas https://forum.minetest.net/viewtopic.php?f=11&t=9917 -Crafts: +Items: - - Nametag (paper, black dye, string) can be used right-click on a tamed mob to give them a name. - - Nets can be used to right-click tamed mobs to pick them up and place inside inventory as a spawn egg. - - Magic Lasso is similar to nets but with a better chance of picking up larger mobs. - - Shears are used to right-click sheep and return 1-3 wool. - - Protection Rune lets you protect tamed mobs from harm by other players +- Nametag (paper, black dye, string) can be used right-click on a tamed mob to give them a name. -Lucky Blocks: 9 +Lucky Block items: 1 -Changelog: +Changelog from original Mobs Redo mod: +- 1.41- Mob pathfinding has been updated thanks to Elkien3 +- 1.40- Updated to use newer functions, requires Minetest 0.4.16+ to work. +- 1.39- Added 'on_breed', 'on_grown' and 'do_punch' custom functions per mob +- 1.38- Better entity checking, nametag setting and on_spawn function added to mob registry, tweaked light damage - 1.37- Added support for Raymoo's CMI (common mob interface) mod: https://forum.minetest.net/viewtopic.php?f=9&t=15448 - 1.36- Death check added, if mob dies in fire/lava/with lava pick then drops are cooked - 1.35- Added owner_loyal flag for owned mobs to attack player enemies, also fixed group_attack diff --git a/mods/ENTITIES/mobs/sounds/default_punch.ogg b/mods/ENTITIES/mcl_mobs/sounds/default_punch.ogg similarity index 100% rename from mods/ENTITIES/mobs/sounds/default_punch.ogg rename to mods/ENTITIES/mcl_mobs/sounds/default_punch.ogg diff --git a/mods/ENTITIES/mcl_mobs/textures/mobs_blood.png b/mods/ENTITIES/mcl_mobs/textures/mobs_blood.png new file mode 100644 index 00000000..ebda3703 Binary files /dev/null and b/mods/ENTITIES/mcl_mobs/textures/mobs_blood.png differ diff --git a/mods/ENTITIES/mobs/textures/mobs_nametag.png b/mods/ENTITIES/mcl_mobs/textures/mobs_nametag.png similarity index 100% rename from mods/ENTITIES/mobs/textures/mobs_nametag.png rename to mods/ENTITIES/mcl_mobs/textures/mobs_nametag.png diff --git a/mods/ENTITIES/mcl_paintings/depends.txt b/mods/ENTITIES/mcl_paintings/depends.txt deleted file mode 100644 index 2f12da4c..00000000 --- a/mods/ENTITIES/mcl_paintings/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mcl_core? diff --git a/mods/ENTITIES/mcl_paintings/description.txt b/mods/ENTITIES/mcl_paintings/description.txt deleted file mode 100644 index f52ec648..00000000 --- a/mods/ENTITIES/mcl_paintings/description.txt +++ /dev/null @@ -1 +0,0 @@ -Decorative paintings which you can placed on walls. diff --git a/mods/ENTITIES/mcl_paintings/init.lua b/mods/ENTITIES/mcl_paintings/init.lua index a9f1517f..df29395b 100644 --- a/mods/ENTITIES/mcl_paintings/init.lua +++ b/mods/ENTITIES/mcl_paintings/init.lua @@ -1,44 +1,263 @@ --- TODO: Move all textures to mcl_paintings when finished +mcl_paintings = {} --- Intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP .. "/intllib.lua") +dofile(minetest.get_modpath(minetest.get_current_modname()).."/paintings.lua") -minetest.register_craftitem("mcl_paintings:painting", { - description = S("Next-Gen Painting"), - _doc_items_longdesc = S("Paintings are decorations which can be placed on walls. THIS ITEM IS INCOMPLETE."), - wield_image = "gemalde_node.png", - inventory_image = "gemalde_node.png", - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return +local S = minetest.get_translator("mcl_paintings") + +local wood = "[combine:16x16:-192,0=mcl_paintings_paintings.png" + +-- Check if there's a painting for provided painting size. +-- If yes, returns the arguments. +-- If not, returns the next smaller available painting. +local shrink_painting = function(x, y) + if x > 4 or y > 4 then + return nil + end + local xstart = x + local painting + while not painting do + painting = mcl_paintings.paintings[y] and mcl_paintings.paintings[y][x] + if type(painting) == "table" then + break + elseif type(painting) == "number" then + x = painting + painting = nil + else + x = xstart + y = y - 1 end + if y < 1 then + return nil + end + end + if type(painting) == "table" then + return x, y + end +end - local under = pointed_thing.under - local above = pointed_thing.above +local get_painting = function(x, y, motive) + local painting = mcl_paintings.paintings[y] and mcl_paintings.paintings[y][x] and mcl_paintings.paintings[y][x][motive] + if not painting then + return nil + end + local px, py = -painting.cx, -painting.cy + local sx, sy = 16*x, 16*y + return "[combine:"..sx.."x"..sy..":"..px..","..py.."=mcl_paintings_paintings.png" +end - -- Use pointed node's on_rightclick function first, if present - local node_under = minetest.get_node(under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node_under.name] and minetest.registered_nodes[node_under.name].on_rightclick then - return minetest.registered_nodes[node_under.name].on_rightclick(under, node_under, placer, itemstack) or itemstack +local get_random_painting = function(x, y) + if not mcl_paintings.paintings[y] or not mcl_paintings.paintings[y][x] then + return nil + end + local max = #mcl_paintings.paintings[y][x] + if max < 1 then + return nil + end + local r = math.random(1, max) + return get_painting(x, y, r), r +end + +local size_to_minmax = function(size) + local min, max + if size == 2 then + min = -0.5 + max = 1.5 + elseif size == 3 then + min = -1.5 + max = 1.5 + elseif size == 4 then + min = -1.5 + max = 2.5 + else + min = -0.5 + max = 0.5 + end + return min, max +end + +local size_to_minmax_entity = function(size) + return -size/2, size/2 +end + +local set_entity = function(object) + local ent = object:get_luaentity() + local wallm = ent._facing + local xsize = ent._xsize + local ysize = ent._ysize + local exmin, exmax = size_to_minmax_entity(xsize) + local eymin, eymax = size_to_minmax_entity(ysize) + local visual_size = { x=xsize-0.0001, y=ysize-0.0001, z=1/32 } + if not ent._xsize or not ent._ysize or not ent._motive then + minetest.log("error", "[mcl_paintings] Painting loaded with missing painting values!") + return + end + local painting = get_painting(xsize, ysize, ent._motive) + if not painting then + minetest.log("error", "[mcl_paintings] No painting found for size " + ..xsize..","..ysize..", motive number "..ent._motive.."!") + return + end + if wallm == 4 or wallm == 5 then + object:set_properties({ + selectionbox = { exmin, eymin, -1/64, exmax, eymax, 1/64 }, + visual_size = visual_size, + textures = { wood, wood, wood, wood, painting, wood }, + }) + else + object:set_properties({ + selectionbox = { -1/64, eymin, exmin, 1/64, eymax, exmax }, + visual_size = visual_size, + textures = { wood, wood, wood, wood, painting, wood }, + }) + end + local dir = minetest.wallmounted_to_dir(wallm) + if not dir then + return + end + object:set_yaw(minetest.dir_to_yaw(dir)) +end + +minetest.register_entity("mcl_paintings:painting", { + visual = "cube", + visual_size = { x=0.999, y=0.999, z=1/32 }, + selectionbox = { -1/64, -0.5, -0.5, 1/64, 0.5, 0.5 }, + physical = false, + collide_with_objects = false, + textures = { wood, wood, wood, wood, wood, wood }, + hp_max = 1, + + _motive = 0, + _pos = nil, + _facing = 2, + _xsize = 1, + _ysize = 1, + on_activate = function(self, staticdata) + if staticdata and staticdata ~= "" then + local data = minetest.deserialize(staticdata) + if data then + self._facing = data._facing + self._pos = data._pos + self._motive = data._motive + self._xsize = data._xsize + self._ysize = data._ysize end end + set_entity(self.object) + end, + get_staticdata = function(self) + local data = { + _facing = self._facing, + _pos = self._pos, + _motive = self._motive, + _xsize = self._xsize, + _ysize = self._ysize, + } + return minetest.serialize(data) + end, + on_death = function(self, killer) + -- Drop as item on death + if not minetest.settings:get_bool("creative_mode") then + local pos = self._pos + if not pos then + pos = self.object:get_pos() + end + minetest.add_item(pos, "mcl_paintings:painting") + end + end, +}) - -- Can only be placed on side - if under.y ~= above.y then +minetest.register_craftitem("mcl_paintings:painting", { + description = S("Painting"), + inventory_image = "mcl_paintings_painting.png", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then return itemstack end - -- Can only be placed on solid nodes - if minetest.get_item_group(node_under.name, "solid") == 0 then + local dir = vector.subtract(pointed_thing.above, pointed_thing.under) + dir = vector.normalize(dir) + if dir.y ~= 0 then + -- Ceiling/floor paintings are not supported return itemstack end + local wallm = minetest.dir_to_wallmounted(dir) + if wallm then + local ppos = pointed_thing.above + local xmax + local ymax = 4 + local xmaxes = {} + local ymaxed = false + local negative = dir.x < 0 or dir.z > 0 + -- Check maximum possible painting size + local t + for y=0,3 do + for x=0,3 do + local k = x + if negative then + k = -k + end + if dir.z ~= 0 then + t = {x=k,y=y,z=0} + else + t = {x=0,y=y,z=k} + end + local unode = minetest.get_node(vector.add(pointed_thing.under, t)) + local anode = minetest.get_node(vector.add(ppos, t)) + local udef = minetest.registered_nodes[unode.name] + local adef = minetest.registered_nodes[anode.name] + if (not (udef and udef.walkable)) or (not adef or adef.walkable) then + xmaxes[y+1] = x + if x == 0 and not ymaxed then + ymax = y + ymaxed = true + end + break + end + end + if not xmaxes[y] then + xmaxes[y] = 4 + end + end + xmax = math.max(unpack(xmaxes)) - -- Spawn painting and rotate - local painting = minetest.add_entity(above, "mcl_paintings:painting") - local yaw = minetest.dir_to_yaw(vector.direction(under, above)) - painting:set_yaw(yaw) - + local xsize, ysize = xmax, ymax + xsize, ysize = shrink_painting(xsize, ysize) + if not xsize then + return itemstack + end + local _, exmax = size_to_minmax_entity(xsize) + local _, eymax = size_to_minmax_entity(ysize) + local pposa = vector.subtract(ppos, vector.multiply(dir, 0.5-2/64)) + local pexmax + local peymax = eymax - 0.5 + if negative then + pexmax = -exmax + 0.5 + else + pexmax = exmax - 0.5 + end + if dir.z ~= 0 then + pposa = vector.add(pposa, {x=pexmax, y=peymax, z=0}) + else + pposa = vector.add(pposa, {x=0, y=peymax, z=pexmax}) + end + local painting, pid = get_random_painting(xsize, ysize) + if not painting then + minetest.log("error", "[mcl_paintings] No painting found for size "..xsize..","..ysize.."!") + return itemstack + end + local staticdata = { + _facing = wallm, + _pos = ppos, + _motive = pid, + _xsize = xsize, + _ysize = ysize, + } + local obj = minetest.add_entity(pposa, "mcl_paintings:painting", minetest.serialize(staticdata)) + if not obj then + return itemstack + end + else + return itemstack + end if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end @@ -46,106 +265,12 @@ minetest.register_craftitem("mcl_paintings:painting", { end, }) --- List of painting IDs, indexed by size. --- Outer index: Width in node lengths --- Inner index: Height in node lengths -local paintings = { - [1] = { - [1] = { 1, 2, 3, 4, 5, 6, 7 }, -- 1×1 - [2] = { 8, 9, 10, 11, 12 }, -- 1×2 - }, - [2] = { - [1] = { 13, 14}, -- 2×1 - [2] = { 15, 16, 17, 18, 19, 20 }, -- 2×2 - }, - [3] = { - [4] = { 25, 26 }, -- 3×4 - }, - [4] = { - [2] = { 21 }, -- 4×2 - [4] = { 22, 23, 24 }, -- 4×4 - }, -} - --- Returns a random painting ID for the given size. --- x: Width in node lenghts --- y: Height in node lengths -local function select_painting(x, y) - if paintings[x] then - local pool = paintings[x][y] - if paintings[x][y] then - local p = math.random(1, #pool) - return p - end - end - return nil -end - --- Returns the texture table for the given painting ID -local get_textures = function(painting_id) - return { - "gemalde_bg.png", - "gemalde_bg.png", - "gemalde_bg.png", - "gemalde_bg.png", - "gemalde_"..tostring(painting_id)..".png", - "gemalde_bg.png" +minetest.register_craft({ + output = "mcl_paintings:painting", + recipe = { + { "mcl_core:stick", "mcl_core:stick", "mcl_core:stick" }, + { "mcl_core:stick", "group:wool", "mcl_core:stick" }, + { "mcl_core:stick", "mcl_core:stick", "mcl_core:stick" }, } -end - --- Painting entitty. --- Can be killed. --- Breaks and drops as item if punched. --- -minetest.register_entity("mcl_paintings:painting", { - physical = false, - collide_with_objects = true, - hp_max = 1, - -- TODO: Fix visual - visual = "cube", - visual_size = { x=1, y=1 }, - textures = get_textures(1), - - _painting = nil, -- Holds the current painting ID. Initially nil for random painting - - get_staticdata = function(self) - local out = { _painting = self._painting } - return minetest.serialize(out) - end, - on_activate = function(self, staticdata) - if staticdata and staticdata ~= "" then - local inp = minetest.deserialize(staticdata) - self._painting = inp._painting - end - -- Initial spawn. Select random painting - if not self._painting then - self._painting = select_painting(1, 1) - end - self.object:set_properties({textures = get_textures(self._painting)}) - end, - on_punch = function(self, puncher) - if not puncher or not puncher:is_player() or self._removed then - return - end - -- Drop painting as item on ground - if not minetest.settings:get_bool("creative_mode") then - minetest.add_item(self.object:getpos(), "mcl_paintings:painting") - end - self._removed = true - self.object:remove() - end }) ---[[ --- TODO: Add crafting when this mod works better -if minetest.get_modpath("mcl_core") then - minetest.register_craft({ - output = "mcl_paintings:painting", - recipe = { - {"mcl_core:stick", "mcl_core:stick", "mcl_core:stick"}, - {"mcl_core:stick", "group:wool", "mcl_core:stick"}, - {"mcl_core:stick", "mcl_core:stick", "mcl_core:stick"}, - } - }) -end -]] diff --git a/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.de.tr b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.de.tr new file mode 100644 index 00000000..98387725 --- /dev/null +++ b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.de.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_paintings +Painting=Gemälde diff --git a/mods/ENTITIES/mcl_paintings/locale/template.txt b/mods/ENTITIES/mcl_paintings/locale/template.txt new file mode 100644 index 00000000..73abae1e --- /dev/null +++ b/mods/ENTITIES/mcl_paintings/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain:mcl_paintings +Painting= diff --git a/mods/ENTITIES/mcl_paintings/paintings.lua b/mods/ENTITIES/mcl_paintings/paintings.lua new file mode 100644 index 00000000..d606306c --- /dev/null +++ b/mods/ENTITIES/mcl_paintings/paintings.lua @@ -0,0 +1,55 @@ +local TS = 16 -- texture size + +mcl_paintings.paintings = { + [1] = { + [1] = { + { cx = 0, cy = 0 }, + { cx = TS, cy = 0 }, + { cx = 2*TS, cy = 0 }, + { cx = 3*TS, cy = 0 }, + { cx = 4*TS, cy = 0 }, + { cx = 5*TS, cy = 0 }, + { cx = 6*TS, cy = 0 }, + }, + [2] = { + { cx = 0, cy = 2*TS }, + { cx = 2*TS, cy = 2*TS }, + { cx = 4*TS, cy = 2*TS }, + { cx = 6*TS, cy = 2*TS }, + { cx = 8*TS, cy = 2*TS }, + }, + [3] = 2, + [4] = 2, + }, + [2] = { + [1] = { + { cx = 0, cy = 4*TS }, + { cx = TS, cy = 4*TS }, + }, + [2] = { + { cx = 0, cy = 8*TS }, + { cx = 2*TS, cy = 8*TS }, + { cx = 4*TS, cy = 8*TS }, + { cx = 6*TS, cy = 8*TS }, + { cx = 8*TS, cy = 8*TS }, + { cx = 10*TS, cy = 8*TS }, + }, + [3] = 2, + [4] = { + { cx = 0, cy = 6*TS }, + }, + }, + [3] = { + [4] = { + { cx = 12*TS, cy = 4*TS }, + { cx = 12*TS, cy = 7*TS }, + }, + }, + [4] = { + [4] = { + { cx = 0, cy = 12*TS }, + { cx = 4*TS, cy = 12*TS }, + { cx = 8*TS, cy = 12*TS }, + }, + }, +} diff --git a/mods/ITEMS/gemalde/textures/gemalde_node.png b/mods/ENTITIES/mcl_paintings/textures/mcl_paintings_painting.png similarity index 100% rename from mods/ITEMS/gemalde/textures/gemalde_node.png rename to mods/ENTITIES/mcl_paintings/textures/mcl_paintings_painting.png diff --git a/mods/ENTITIES/mcl_paintings/textures/mcl_paintings_paintings.png b/mods/ENTITIES/mcl_paintings/textures/mcl_paintings_paintings.png new file mode 100644 index 00000000..0a8462d1 Binary files /dev/null and b/mods/ENTITIES/mcl_paintings/textures/mcl_paintings_paintings.png differ diff --git a/mods/ENTITIES/mobs/api.txt b/mods/ENTITIES/mobs/api.txt deleted file mode 100644 index 90a5966e..00000000 --- a/mods/ENTITIES/mobs/api.txt +++ /dev/null @@ -1,462 +0,0 @@ - -MOB API (13th July 2017) - -The mob api is a function that can be called on by other mods to add new animals or monsters into minetest. - - minetest.conf settings* - - 'enable_damage' if true monsters will attack players (default is true) - 'only_peaceful_mobs' if true only animals will spawn in game (default is false) - 'mobs_disable_blood' if false blood effects appear when mob is hit (default is false) - 'mobs_spawn_protected' if set to false then mobs will not spawn in protected areas (default is true) - 'remove_far_mobs' if true then mobs that are outside players visual range will be removed (default is false) - 'mobname' can change specific mob chance rate (0 to disable) and spawn number e.g. mobs_animal:cow = 1000,5 - 'mob_difficulty' sets difficulty level (health and hit damage multiplied by this number), defaults to 1.0. - 'mob_show_health' if false then punching mob will not show health status (true by default) - -mobs:register_mob(name, definition) - -This functions registers a new mob as a Minetest entity. - - 'name' is the name of the mob (e.g. "mobs:dirt_monster") - definition is a table with the following fields - 'type' the type of the mob ("monster", "animal" or "npc") where monsters attack players and npc's, animals and npc's tend to wander around and can attack when hit 1st. - 'passive' will mob defend itself, set to false to attack - 'docile_by_day' when true, mob will not attack during daylight hours unless provoked - 'attacks_monsters' usually for npc's to attack monsters in area - 'group_attack' true to defend same kind of mobs from attack in area - 'owner_loyal' when true owned mobs will attack any monsters you punch - 'attack_animals' true for monster to attack animals as well as player and npc's - 'specific_attack' has a table of entity names that monsters can attack {"player", "mobs_animal:chicken"} - 'hp_min' minimum health - 'hp_max' maximum health (mob health is randomly selected between both) - 'physical' same is in minetest.register_entity() - 'collisionbox' same is in minetest.register_entity() - 'visual' same is in minetest.register_entity() - 'visual_size' same is in minetest.register_entity() - 'textures' same is in minetest.register_entity() - although you can add multiple lines for random textures {{"texture1.png"},{"texture2.png"}}, - 'gotten_texture' alt. texture for when self.gotten value is set to true (used for shearing sheep) - 'child_texture' texture of mod for when self.child is set to true - 'mesh' same is in minetest.register_entity() - 'gotten_mesh' alternative mesh for when self.gotten is true (used for sheep) - 'makes_footstep_sound' same is in minetest.register_entity() - 'follow' item when held will cause mob to follow player, can be single string "default:apple" or table {"default:apple", "default:diamond"}. These are also items that are used to feed and tame mob. - 'view_range' the range in which the mob will follow or attack player - 'walk_chance' chance of mob walking around (0 to 100), set to 0 for jumping mob only - 'walk_velocity' the velocity when the monster is walking around - 'run_velocity' the velocity when the monster is attacking a player - 'runaway' when true mob will turn and run away when punched - 'stepheight' minimum node height mob can walk onto without jumping (default: 0.6) - 'jump' can mob jump, true or false - 'jump_height' height mob can jump, default is 6 (0 to disable jump) - 'fly' can mob fly, true or false (used for swimming mobs also) - 'fly_in' node name that mob flys inside, e.g "air", "default:water_source" for fish - 'damage' the damage mobs inflict per melee attack. - 'recovery_time' how much time from when mob is hit to recovery (default: 0.5 seconds) - 'knock_back' strength of knock-back when mob hit (default: 3) - 'immune_to' table holding special tool/item names and damage the incur e.g. - {"default:sword_wood", 0}, {"default:gold_lump", -10} immune to sword, gold lump heals - 'blood_amount' number of droplets that appear when hit - 'blood_texture' texture of blood droplets (default: "mobs_blood.png") - 'drops' is list of tables with the following fields: - 'name' itemname e.g. default:stone - 'chance' the inverted chance (same as in abm) to get the item - 'min' the minimum number of items - 'max' the maximum number of items - 'armor' this integer holds armor strength with 100 being normal, with lower numbers hardening the armor and higher numbers making it weaker (weird I know but compatible with simple mobs) - 'drawtype' "front" or "side" (DEPRECATED, replaced with below) - 'rotate' set mob rotation, 0=front, 90=side, 180=back, 270=other side - 'water_damage' the damage per second if the mob is in water - 'lava_damage' the damage per second if the mob is in lava - 'light_damage' the damage per second if the mob is in light - 'suffocation' health value mob loses when inside a solid node - 'fall_damage' will mob be hurt when falling from height - 'fall_speed' maximum falling velocity of mob (default is -10 and must be below -2) - 'fear_height' when mob walks near a drop then anything over this value makes it stop and turn back (default is 0 to disable) - 'on_die' a function that is called when the mob is killed the parameters are (self, pos) - 'floats' 1 to float in water, 0 to sink - 'on_rightclick' its same as in minetest.register_entity() - 'pathfinding' set to 1 for mobs to use pathfinder feature to locate player, set to 2 so they can build/break also (only works with dogfight attack) - 'attack_type' the attack type of a monster - 'dogfight' follows player in range and attacks when in reach - 'shoot' shoots defined arrows when player is within range - 'explode' follows player in range and will flash and explode when in reach - 'dogshoot' shoots arrows when in range and one on one attack when in reach - 'dogshoot_switch' allows switching between shoot and dogfight modes inside dogshoot using timer (1 = shoot, 2 = dogfight) - 'dogshoot_count_max' number of seconds before switching to dogfight mode. - 'dogshoot_count2_max' number of seconds before switching back to shoot mode. - 'custom_attack' when set this function is called instead of the normal mob melee attack, parameters are (self, to_attack) - 'double_melee_attack' if false then api will choose randomly between 'punch' and 'punch2' attack animations - 'on_blast' is called when an explosion happens near mob when using TNT functions, parameters are (object, damage) and returns (do_damage, do_knockback, drops) - 'explosion_radius' radius of explosion attack (defaults to 1) - 'arrow' if the attack_type is "shoot" or "dogshoot" then the entity name of a pre-defined arrow is required, see below for arrow definition. - 'shoot_interval' the minimum shoot interval - 'shoot_offset' +/- value to position arrow/fireball when fired - 'reach' how far a reach this mob has, default is 3 - 'sounds' this is a table with sounds of the mob - 'random' random sounds during gameplay - 'war_cry' sound when starting to attack player - 'attack' sound when attacking player - 'shoot_attack' sound when attacking player by shooting arrow/entity - 'damage' sound when being hit - 'death' sound when killed - 'jump' sound when jumping - 'explode' sound when exploding - 'distance' maximum distance sounds are heard from (default is 10) - -Mobs can look for specific nodes as they walk and replace them to mimic eating. - - 'replace_what' group if items to replace e.g. {"farming:wheat_8", "farming:carrot_8"} - 'replace_with' replace with what e.g. "air" or in chickens case "mobs:egg" - 'replace_rate' how random should the replace rate be (typically 10) - 'replace_offset' +/- value to check specific node to replace - 'on_replace(self, pos, oldnode, newnode)' gets called when mob is about to replace a node - self: ObjectRef of mob - pos: Position of node to replace - oldnode: Current node - newnode: What the node will become after replacing - - If false is returned, the mob will not replace the node. - - By default, replacing sets self.gotten to true and resets the object properties. - -The 'replace_what' has been updated to use tables for what, with and y_offset e.g. - - replace_what = { {"group:grass", "air", 0}, {"default:dirt_with_grass", "default:dirt", -1} } - -Mob animation comes in three parts, start_frame, end_frame and frame_speed which -can be added to the mob definition under pre-defined mob animation names like: - - 'animation' a table with the animation ranges and speed of the model - 'stand_start', 'stand_end', 'stand_speed' when mob stands still - 'walk_start', 'walk_end', 'walk_speed' when mob walks - 'run_start', 'run_end', 'run_speed' when mob runs - 'fly_start', 'fly_end', 'fly_speed' when mob flies - 'punch_start', 'punch_end', 'punch_speed' when mob attacks - 'punch2_start', 'punch2_end', 'punch2_speed' when mob attacks (alternative) - 'die_start', 'die_end', 'die_speed' when mob dies - '*_loop' bool value to determine if any set animation loops e.g (die_loop = false) - defaults to true if not set -also 'speed_normal' for compatibility with older mobs for animation speed (deprecated) - - -The mob api also has some preset variables and functions that it will remember for each mob - - 'self.health' contains current health of mob (cannot exceed self.hp_max) - 'self.texture_list' contains list of all mob textures - 'self.child_texture' contains mob child texture when growing up - 'self.base_texture' contains current skin texture which was randomly selected from textures list - 'self.gotten' this is used for obtaining milk from cow and wool from sheep - 'self.horny' when animal fed enough it is set to true and animal can breed with same animal - 'self.hornytimer' background timer that controls breeding functions and mob childhood timings - 'self.child' used for when breeding animals have child, will use child_texture and be half size - 'self.owner' string used to set owner of npc mobs, typically used for dogs - 'self.order' set to "follow" or "stand" so that npc will follow owner or stand it's ground - 'self.nametag' contains the name of the mob which it can show above - 'on_die' a function that is called when mob is killed - 'do_custom' a custom function that is called every tick while mob is active and which has access to all of the self.* variables e.g. (self.health for health or self.standing_in for node status), return with 'false' to skip remainder of mob API. - - -mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle) - -mobs:spawn_specfic(name, nodes, neighbors, min_light, max_light, interval, chance, active_object_count, min_height, max_height, day_toggle, on_spawn) - -These functions register a spawn algorithm for the mob. Without this function the call the mobs won't spawn. - - 'name' is the name of the animal/monster - 'nodes' is a list of nodenames on that the animal/monster can spawn on top of - 'neighbors' is a list of nodenames on that the animal/monster will spawn beside (default is {"air"} for mobs:register_spawn) - 'max_light' is the maximum of light - 'min_light' is the minimum of light - 'interval' is same as in register_abm() (default is 30 for mobs:register_spawn) - 'chance' is same as in register_abm() - 'active_object_count' mob is only spawned if active_object_count_wider of ABM is <= this - 'min_height' is the minimum height the mob can spawn - 'max_height' is the maximum height the mob can spawn - 'day_toggle' true for day spawning, false for night or nil for anytime - 'on_spawn' is a custom function which runs after mob has spawned and gives self and pos values. - -... also a simpler way to handle mob spawns has been added with the mobs:spawn(def) command which uses above names to make settings clearer: - - mobs:spawn({name = "mobs_monster:tree_monster", - nodes = {"group:leaves"}, - max_light = 7, - }) - - -Players can override the spawn chance for each mob registered by adding a line to their minetest.conf file with a new value, the lower the value the more each mob will spawn e.g. - -mobs_animal:sheep_chance 11000 or mobs_monster:sand_monster_chance 100 - -For each mob that spawns with this function is a field in mobs.spawning_mobs. It tells if the mob should spawn or not. Default is true. So other mods can only use the API of this mod by disabling the spawning of the default mobs in this mod. - - -mobs:register_arrow(name, definition) - -This function registers a arrow for mobs with the attack type shoot. - - 'name' is the name of the arrow - -definition' is a table with the following values: - 'visual' same is in minetest.register_entity() - 'visual_size' same is in minetest.register_entity() - 'textures' same is in minetest.register_entity() - 'velocity' the velocity of the arrow - 'drop' if set to true any arrows hitting a node will drop as item - 'hit_player' a function that is called when the arrow hits a player; this function should hurt the player - the parameters are (self, player) - 'hit_mob' a function that is called when the arrow hits a mob; this function should hurt the mob - the parameters are (self, player) - 'hit_node' a function that is called when the arrow hits a node - the parameters are (self, pos, node) - 'tail' when set to 1 adds a trail or tail to mob arrows - 'tail_texture' texture string used for above effect - 'tail_size' has size for above texture (defaults to between 5 and 10) - 'expire' contains float value for how long tail appears for (defaults to 0.25) - 'glow' has value for how brightly tail glows 1 to 10 (default is 0, no glow) - 'rotate' integer value in degrees to rotate arrow - 'on_step' is a custom function when arrow is active, nil for default. - - -mobs:register_egg(name, description, background, addegg, no_creative) - -This function registers a spawn egg which can be used by admin to properly spawn in a mob. - - 'name' this is the name of your new mob to spawn e.g. "mob:sheep" - 'description' the name of the new egg you are creating e.g. "Spawn Sheep" - 'background' the texture displayed for the egg in inventory - 'addegg' would you like an egg image in front of your texture (1=yes, 0=no) - 'no_creative' when set to true this stops spawn egg appearing in creative mode for destructive mobs like Dungeon Masters - - -mobs:explosion(pos, radius) -- DEPRECATED!!! use mobs:boom() instead - -mobs:boom(self, pos, radius) -This function generates an explosion which removes nodes in a specific radius and damages any entity caught inside the blast radius. Protection will limit node destruction but not entity damage. - - 'self' mob entity - 'pos' centre position of explosion - 'radius' radius of explosion (typically set to 3) - - -mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) - -This function is generally called inside the on_rightclick section of the mob api code, it provides a chance of capturing the mob by hand, using the net or magic lasso items, and can also have the player take the mob by force if tamed and replace with another item entirely. - - 'self' mob information - 'clicker' player information - 'chance_hand' chance of capturing mob by hand (1 to 100) 0 to disable - 'chance_net' chance of capturing mob using net (1 to 100) 0 to disable - 'chance_lasso' chance of capturing mob using magic lasso (1 to 100) 0 to disable - 'force_take' take mob by force, even if tamed (true or false) - 'replacewith' once captured replace mob with this item instead (overrides new mob eggs with saved information) - - -mobs:feed_tame(self, clicker, feed_count, breed, tame) - -This function allows the mob to be fed the item inside self.follow be it apple, wheat or whatever a set number of times and be tamed or bred as a result. Will return true when mob is fed with item it likes. - - 'self' mob information - 'clicker' player information - 'feed_count' number of times mob must be fed to tame or breed - 'breed' true or false stating if mob can be bred and a child created afterwards - 'tame' true or false stating if mob can be tamed so player can pick them up - - -mobs:protect(self, clicker) - -This function can be used to right-click any tamed mob with mobs:protector item, this will protect the mob from harm inside of a protected area from other players. Will return true when mob right-clicked with mobs:protector item. - - 'self' mob information - 'clicker' player information - - -Mobs can now be ridden by players and the following shows the functions and usage: - - -mobs:attach(self, player) - -This function attaches a player to the mob so it can be ridden. - - 'self' mob information - 'player' player information - - -mobs:detach(player, offset) - -This function will detach the player currently riding a mob to an offset position. - - 'player' player information - 'offset' position table containing offset values - - -mobs:drive(self, move_animation, stand_animation, can_fly, dtime) - -This function allows an attached player to move the mob around and animate it at same time. - - 'self' mob information - 'move_animation' string containing movement animation e.g. "walk" - 'stand_animation' string containing standing animation e.g. "stand" - 'can_fly' if true then jump and sneak controls will allow mob to fly up and down - 'dtime' tick time used inside drive function - - -mobs:fly(self, dtime, speed, can_shoot, arrow_entity, move_animation, stand_animation) - -This function allows an attached player to fly the mob around using directional controls. - - 'self' mob information - 'dtime' tick time used inside fly function - 'speed' speed of flight - 'can_shoot' true if mob can fire arrow (sneak and left mouse button fires) - 'arrow_entity' name of arrow entity used for firing - 'move_animation' string containing name of pre-defined animation e.g. "walk" or "fly" etc. - 'stand_animation' string containing name of pre-defined animation e.g. "stand" or "blink" etc. - - Note: animation names above are from the pre-defined animation lists inside mob registry without extensions. - - -mobs:set_animation(self, name) - -This function sets the current animation for mob, defaulting to "stand" if not found. - - 'self' mob information - 'name' name of animation - - -Certain variables need to be set before using the above functions: - - 'self.v2' toggle switch used to define below values for the first time - 'self.max_speed_forward' max speed mob can move forward - 'self.max_speed_reverse' max speed mob can move backwards - 'self.accel' acceleration speed - 'self.terrain_type' integer containing terrain mob can walk on (1 = water, 2 or 3 = land) - 'self.driver_attach_at' position offset for attaching player to mob - 'self.driver_eye_offset' position offset for attached player view - 'self.driver_scale' sets driver scale for mobs larger than {x=1, y=1} - - -Here is an example mob to show how the above functions work: - - --- rideable horse -mobs:register_mob("mob_horse:horse", { - type = "animal", - visual = "mesh", - visual_size = {x = 1.20, y = 1.20}, - mesh = "mobs_horse.x", - collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, - animation = { - speed_normal = 15, - speed_run = 30, - stand_start = 25, - stand_end = 75, - walk_start = 75, - walk_end = 100, - run_start = 75, - run_end = 100, - }, - textures = { - {"mobs_horse.png"}, - {"mobs_horsepeg.png"}, - {"mobs_horseara.png"} - }, - fear_height = 3, - runaway = true, - fly = false, - walk_chance = 60, - view_range = 5, - follow = {"farming:wheat"}, - passive = true, - hp_min = 12, - hp_max = 16, - armor = 200, - lava_damage = 5, - fall_damage = 5, - water_damage = 1, - makes_footstep_sound = true, - drops = { - {name = "mobs:meat_raw", chance = 1, min = 2, max = 3} - }, - - do_custom = function(self, dtime) - - -- set needed values if not already present - if not self.v2 then - self.v2 = 0 - self.max_speed_forward = 6 - self.max_speed_reverse = 2 - self.accel = 6 - self.terrain_type = 3 - self.driver_attach_at = {x = 0, y = 20, z = -2} - self.driver_eye_offset = {x = 0, y = 3, z = 0} - self.driver_scale = {x = 1, y = 1} - end - - -- if driver present allow control of horse - if self.driver then - - mobs.drive(self, "walk", "stand", false, dtime) - - return false -- skip rest of mob functions - end - - return true - end, - - on_die = function(self, pos) - - -- drop saddle when horse is killed while riding - -- also detach from horse properly - if self.driver then - minetest.add_item(pos, "mobs:saddle") - mobs.detach(self.driver, {x = 1, y = 0, z = 1}) - end - - end, - - on_rightclick = function(self, clicker) - - -- make sure player is clicking - if not clicker or not clicker:is_player() then - return - end - - -- feed, tame or heal horse - if mobs:feed_tame(self, clicker, 10, true, true) then - return - end - - -- make sure tamed horse is being clicked by owner only - if self.tamed and self.owner == clicker:get_player_name() then - - local inv = clicker:get_inventory() - - -- detatch player already riding horse - if self.driver and clicker == self.driver then - - mobs.detach(clicker, {x = 1, y = 0, z = 1}) - - -- add saddle back to inventory - if inv:room_for_item("main", "mobs:saddle") then - inv:add_item("main", "mobs:saddle") - else - minetest.add_item(clicker.getpos(), "mobs:saddle") - end - - -- attach player to horse - elseif not self.driver - and clicker:get_wielded_item():get_name() == "mobs:saddle" then - - self.object:set_properties({stepheight = 1.1}) - mobs.attach(self, clicker) - - -- take saddle from inventory - inv:remove_item("main", "mobs:saddle") - end - end - - -- used to capture horse with magic lasso - mobs:capture_mob(self, clicker, 0, 0, 80, false, nil) - end -}) diff --git a/mods/ENTITIES/mobs/crafts.lua b/mods/ENTITIES/mobs/crafts.lua deleted file mode 100644 index b96a8c04..00000000 --- a/mods/ENTITIES/mobs/crafts.lua +++ /dev/null @@ -1,14 +0,0 @@ - -local S = mobs.intllib - --- name tag -minetest.register_craftitem("mobs:nametag", { - description = S("Name Tag"), - _doc_items_longdesc = S("A name tag is an item to name most animals and monsters."), - _doc_items_usagehelp = S("Rightclick an animal or monster while holding the name tag, then enter a name."), - inventory_image = "mobs_nametag.png", - wield_image = "mobs_nametag.png", - stack_max = 64, - groups = { tool=1 }, -}) - diff --git a/mods/ENTITIES/mobs/depends.txt b/mods/ENTITIES/mobs/depends.txt deleted file mode 100644 index da5ffd9b..00000000 --- a/mods/ENTITIES/mobs/depends.txt +++ /dev/null @@ -1,6 +0,0 @@ -mcl_core -mcl_tnt? -invisibility? -intllib? -lucky_block? -cmi? diff --git a/mods/ENTITIES/mobs/description.txt b/mods/ENTITIES/mobs/description.txt deleted file mode 100644 index 919852a1..00000000 --- a/mods/ENTITIES/mobs/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds a mob api for mods to add animals or monsters etc. \ No newline at end of file diff --git a/mods/ENTITIES/mobs/init.lua b/mods/ENTITIES/mobs/init.lua deleted file mode 100644 index 24c981f8..00000000 --- a/mods/ENTITIES/mobs/init.lua +++ /dev/null @@ -1,19 +0,0 @@ - -local path = minetest.get_modpath("mobs") - --- Mob API -dofile(path .. "/api.lua") - --- Rideable Mobs -dofile(path .. "/mount.lua") - --- Mob Items -dofile(path .. "/crafts.lua") - --- Mob Spawner --- MCL2 has its own spawners in mcl_mobspawners - --- Lucky Blocks -dofile(path .. "/lucky_block.lua") - -minetest.log("action", "[MOD] Mobs Redo loaded") diff --git a/mods/ENTITIES/mobs/intllib.lua b/mods/ENTITIES/mobs/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/ENTITIES/mobs/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/ENTITIES/mobs/locale/de_DE.po b/mods/ENTITIES/mobs/locale/de_DE.po deleted file mode 100644 index d627dfde..00000000 --- a/mods/ENTITIES/mobs/locale/de_DE.po +++ /dev/null @@ -1,127 +0,0 @@ -# Mobs Redo translation. -# Copyright (C) 2017 TenPlus1 -# This file is distributed under the same license as the mobs package. -# Wuzzy , 2017 -# -msgid "" -msgstr "" -"Project-Id-Version: mobs\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-07-02 14:27+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: de_DE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Kreatur wurde geschützt!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Gezähmt)" - -#: api.lua -msgid "Not tamed!" -msgstr "Nicht gezähmt!" - -#: api.lua -msgid "@1 is owner!" -msgstr "@1 ist der Besitzer!" - -#: api.lua -msgid "Missed!" -msgstr "Daneben!" - -#: api.lua -msgid "Already protected!" -msgstr "Bereits geschützt!" - -#: api.lua -msgid "Protected!" -msgstr "Geschützt!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 bei voller Gesundheit (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 wurde gezähmt!" - -#: api.lua -msgid "Enter name:" -msgstr "Namen eingeben:" - -#: api.lua -msgid "Rename" -msgstr "Umbenennen" - -#: crafts.lua -msgid "Name Tag" -msgstr "Namensschild" - -#: crafts.lua -msgid "Leather" -msgstr "Leder" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Rohes Fleisch" - -#: crafts.lua -msgid "Meat" -msgstr "Fleisch" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Lasso (Rechtsklick auf Tier, um es zu nehmen)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Netz (Rechtsklick auf Tier, um es zu nehmen)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Stahlschere (Rechtsklick zum Scheren)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Kreaturschutzrune" - -#: crafts.lua -msgid "Saddle" -msgstr "Sattel" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Kreaturenspawner" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Kreatur MinLicht MaxLicht Menge SpielerEntfng" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Nicht aktiv (Einstellungen eingeben)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Spawner aktiv (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Kreaturenspawner-Einstellungen gescheitert!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"Syntax: „name min_licht[0-14] max_licht[0-14] max_mobs_im_gebiet[0 zum " -"Deaktivieren] distanz[1-20] y_versatz[-10 bis 10]“" \ No newline at end of file diff --git a/mods/ENTITIES/mobs/locale/pt.po b/mods/ENTITIES/mobs/locale/pt.po deleted file mode 100644 index 05c3ae3d..00000000 --- a/mods/ENTITIES/mobs/locale/pt.po +++ /dev/null @@ -1,129 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: mobs\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-07-02 14:55+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: pt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: api.lua -msgid "Mob has been protected!" -msgstr "" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "" - -#: api.lua -msgid "Not tamed!" -msgstr "Indomesticado!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Dono @1!" - -#: api.lua -msgid "Missed!" -msgstr "Faltou!" - -#: api.lua -msgid "Already protected!" -msgstr "" - -#: api.lua -msgid "Protected!" -msgstr "" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 em plena saude (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 foi domesticado!" - -#: api.lua -msgid "Enter name:" -msgstr "Insira um nome:" - -#: api.lua -msgid "Rename" -msgstr "Renomear" - -#: crafts.lua -msgid "Name Tag" -msgstr "Etiqueta" - -#: crafts.lua -msgid "Leather" -msgstr "Couro" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Carne crua" - -#: crafts.lua -msgid "Meat" -msgstr "Carne" - -#: crafts.lua -#, fuzzy -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Laço (clique-direito no animal para por no inventario)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Net (clique-direito no animal para por no inventario)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Tesoura de Aço (clique-direito para tosquiar)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "" - -#: crafts.lua -msgid "Saddle" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Spawnador de Mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob LuzMinima LuzMaxima Valor DistJogador" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Spawnador Inativo (configurar)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Spawnador Ativo (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Configuraçao de Spawnador do Mob falhou!" - -#: spawner.lua -#, fuzzy -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"> nome luz_min[0-14] luz_max[0-14] max_mobs_na_area[0 para desabilitar] " -"distancia[1-20] y_offset[-10 a 10]" \ No newline at end of file diff --git a/mods/ENTITIES/mobs/locale/template.pot b/mods/ENTITIES/mobs/locale/template.pot deleted file mode 100644 index 90e52416..00000000 --- a/mods/ENTITIES/mobs/locale/template.pot +++ /dev/null @@ -1,124 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+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 -msgid "Mob has been protected!" -msgstr "" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "" - -#: api.lua -msgid "Not tamed!" -msgstr "" - -#: api.lua -msgid "@1 is owner!" -msgstr "" - -#: api.lua -msgid "Missed!" -msgstr "" - -#: api.lua -msgid "Already protected!" -msgstr "" - -#: api.lua -msgid "Protected!" -msgstr "" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "" - -#: api.lua -msgid "Enter name:" -msgstr "" - -#: api.lua -msgid "Rename" -msgstr "" - -#: crafts.lua -msgid "Name Tag" -msgstr "" - -#: crafts.lua -msgid "Leather" -msgstr "" - -#: crafts.lua -msgid "Raw Meat" -msgstr "" - -#: crafts.lua -msgid "Meat" -msgstr "" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "" - -#: crafts.lua -msgid "Saddle" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" \ No newline at end of file diff --git a/mods/ENTITIES/mobs/locale/tr.po b/mods/ENTITIES/mobs/locale/tr.po deleted file mode 100644 index b9c06d58..00000000 --- a/mods/ENTITIES/mobs/locale/tr.po +++ /dev/null @@ -1,129 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: mobs\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-07-02 14:56+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: api.lua -msgid "Mob has been protected!" -msgstr "" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "" - -#: api.lua -msgid "Not tamed!" -msgstr "Evcil değil!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Sahibi @1!" - -#: api.lua -msgid "Missed!" -msgstr "Kaçırdın!" - -#: api.lua -msgid "Already protected!" -msgstr "" - -#: api.lua -msgid "Protected!" -msgstr "" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 tam canında (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 tamamen evcilleştirilmiştir!" - -#: api.lua -msgid "Enter name:" -msgstr "İsim gir:" - -#: api.lua -msgid "Rename" -msgstr "Yeniden adlandır" - -#: crafts.lua -msgid "Name Tag" -msgstr "İsim etiketi" - -#: crafts.lua -msgid "Leather" -msgstr "Deri" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Çiğ et" - -#: crafts.lua -msgid "Meat" -msgstr "Et" - -#: crafts.lua -#, fuzzy -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Kement (hayvana sağ tıklayarak envantere koy)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Ağ (hayvana sağ tıklayarak envantere koy)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Çelik makas (sağ tıklayarak kes)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "" - -#: crafts.lua -msgid "Saddle" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Canavar Yaratıcı" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob MinIşık MaxIşık Miktar OyuncuMesafesi" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Yaratıcı aktif değil (ayarlara gir)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Yaratıcı aktif (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Yaratıcı ayarları uygulanamadı." - -#: spawner.lua -#, fuzzy -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"> isim min_isik[0-14] max_isik[0-14] alandaki_max_canavar_sayisi[kapatmak " -"icin 0] mesafe[1-20] y_cikinti[-10 ve 10 arası]" \ No newline at end of file diff --git a/mods/ENTITIES/mobs/lucky_block.lua b/mods/ENTITIES/mobs/lucky_block.lua deleted file mode 100644 index 0c2794f6..00000000 --- a/mods/ENTITIES/mobs/lucky_block.lua +++ /dev/null @@ -1,15 +0,0 @@ - -if minetest.get_modpath("lucky_block") then - - lucky_block:add_blocks({ - {"dro", {"mobs:meat_raw"}, 5}, - {"dro", {"mobs:meat"}, 5}, - {"dro", {"mobs:nametag"}, 1}, - {"dro", {"mobs:leather"}, 5}, - {"dro", {"mobs:net"}, 1}, - {"dro", {"mobs:magic_lasso"}, 1}, - {"dro", {"mobs:shears"}, 1}, - {"dro", {"mobs:protector"}, 1}, - {"lig"}, - }) -end diff --git a/mods/ENTITIES/mobs/mod.conf b/mods/ENTITIES/mobs/mod.conf deleted file mode 100644 index f3a3ad74..00000000 --- a/mods/ENTITIES/mobs/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = mobs diff --git a/mods/ENTITIES/mobs/textures/mobs_blood.png b/mods/ENTITIES/mobs/textures/mobs_blood.png deleted file mode 100644 index aa4a6123..00000000 Binary files a/mods/ENTITIES/mobs/textures/mobs_blood.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua index 410719f6..74c92d41 100644 --- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua +++ b/mods/ENTITIES/mobs_mc/0_gameconfig.lua @@ -2,10 +2,10 @@ All mobs in this mod must use variables in this table, instead of hardcoding the itemstring. This way, external mods are enabled to replace the itemstrings to provide -their own items and subgame integration is made much simpler. +their own items and game integration is made much simpler. An item IDs is supposed to be overwritten by adding -mobs_mc.override.items["example:item"] in a subgame mod +mobs_mc.override.items["example:item"] in a game mod with name "mobs_mc_gameconfig". ]] @@ -81,6 +81,7 @@ mobs_mc.items = { gunpowder = "tnt:gunpowder", flint_and_steel = "fire:flint_and_steel", water_source = "default:water_source", + river_water_source = "default:river_water_source", black_dye = "dye:black", poppy = "flowers:rose", dandelion = "flowers:dandelion_yellow", @@ -146,7 +147,7 @@ mobs_mc.items = { -- Light blue intentionally missing -- Special items - music_discs = {}, -- No music discs by default; used by creeper. Override this if your subgame has music discs. + music_discs = {}, -- No music discs by default; used by creeper. Override this if your game has music discs. } -- Tables for attracting, feeding and breeding mobs @@ -156,6 +157,7 @@ mobs_mc.follow = { chicken = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general parrot = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general horse = { mobs_mc.items.apple, mobs_mc.items.sugar, mobs_mc.items.wheat, mobs_mc.items.hay_bale, mobs_mc.items.golden_apple, mobs_mc.items.golden_carrot }, + llama = { mobs_mc.items.wheat, mobs_mc.items.hay_bale, }, pig = { mobs_mc.items.potato, mobs_mc.items.carrot, mobs_mc.items.carrot_on_a_stick, mobs_mc.items.apple, -- Minetest Game extra }, @@ -228,7 +230,9 @@ mobs_mc.enderman_takable = { "default:dirt_with_snow", "default:dirt_with_rainforest_litter", "default:dirt_with_grass_footsteps", - "default:cactus", +-- FIXME: For some reason, Minetest has a Lua error when an enderman tries to place a Minetest Game cactus. +-- Maybe this is because default:cactus has rotate_and_place? +-- "default:cactus", -- TODO: Re-enable cactus when it works again "default:gravel", "default:clay", "flowers:mushroom_red", @@ -239,6 +243,26 @@ mobs_mc.enderman_takable = { "nether:rack", } +--[[ Table of nodes to replace when an enderman takes it. +If the enderman takes an indexed node, it the enderman will get the item in the value. +Table indexes: Original node, taken by enderman. +Table values: The item which the enderman *actually* gets +Example: + mobs_mc.enderman_node_replace = { + ["default:dirt_with_dry_grass"] = "default_dirt_with_grass", + } +-- This means, if the enderman takes a dirt with dry grass, he will get a dirt with grass +-- on his hand instead. +]] +mobs_mc.enderman_replace_on_take = {} -- no replacements by default + +-- A table which can be used to override block textures of blocks carried by endermen. +-- Only works for cube-shaped nodes and nodeboxes. +-- Key: itemstrings of the blocks to replace +-- Value: A table with the texture overrides (6 textures) +mobs_mc.enderman_block_texture_overrides = { +} + -- List of nodes on which mobs can spawn mobs_mc.spawn = { solid = { "group:cracky", "group:crumbly", "group:shovely", "group:pickaxey" }, -- spawn on "solid" nodes (this is mostly just guessing) @@ -255,8 +279,8 @@ mobs_mc.spawn = { -- These probably don't need overrides mushroom_island = { mobs_mc.items.mycelium, "mcl_core:mycelium" }, - nether_fortress = { mobs_mc.items.nether_brick_block, "mcl_nether:nether_brick", "mcl_portals:nether_air" }, - nether = { mobs_mc.items.netherrack, "mcl_nether:netherrack", "mcl_portals:nether_air" }, + nether_fortress = { mobs_mc.items.nether_brick_block, "mcl_nether:nether_brick", }, + nether = { mobs_mc.items.netherrack, "mcl_nether:netherrack", }, nether_portal = { mobs_mc.items.nether_portal, "mcl_portals:portal" }, water = { mobs_mc.items.water_source, "mcl_core:water_source", "default:water_source" }, } @@ -264,7 +288,7 @@ mobs_mc.spawn = { -- This table contains important spawn height references for the mob spawn height. -- Please base your mob spawn height on these numbers to keep things clean. mobs_mc.spawn_height = { - water = tonumber(minetest.setting_get("water_level")) or 0, -- Water level in the Overworld + water = tonumber(minetest.settings:get("water_level")) or 0, -- Water level in the Overworld -- Overworld boundaries (inclusive) overworld_min = -2999, @@ -281,6 +305,7 @@ mobs_mc.spawn_height = { mobs_mc.misc = { shears_wear = 276, -- Wear to add per shears usage (238 uses) + totem_fail_nodes = {} -- List of nodes in which the totem of undying fails } -- Item name overrides from mobs_mc_gameconfig (if present) @@ -298,5 +323,11 @@ if minetest.get_modpath("mobs_mc_gameconfig") and mobs_mc.override then if mobs_mc.override.enderman_takable then mobs_mc.enderman_takable = mobs_mc.override.enderman_takable end + if mobs_mc.override.enderman_replace_on_take then + mobs_mc.enderman_replace_on_take = mobs_mc.override.enderman_replace_on_take + end + if mobs_mc.enderman_block_texture_overrides then + mobs_mc.enderman_block_texture_overrides = mobs_mc.override.enderman_block_texture_overrides + end end diff --git a/mods/ENTITIES/mobs_mc/1_items_default.lua b/mods/ENTITIES/mobs_mc/1_items_default.lua index 07b3ba63..1085235a 100644 --- a/mods/ENTITIES/mobs_mc/1_items_default.lua +++ b/mods/ENTITIES/mobs_mc/1_items_default.lua @@ -3,21 +3,20 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes - ---dofile(minetest.get_modpath("mobs").."/api.lua") --THIS IS THE MASTER ITEM LIST TO USE WITH DEFAULT --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +-- NOTE: Most strings intentionally not marked for translation, other mods already have these items. +-- TODO: Remove this file eventually, most items are already outsourced in other mods. + +local S = minetest.get_translator("mobs_mc") local c = mobs_mc.is_item_variable_overridden -- Blaze if c("blaze_rod") then minetest.register_craftitem("mobs_mc:blaze_rod", { - description = S("Blaze Rod"), - _doc_items_longdesc = S("This is a crafting component dropped from dead blazes."), + description = "Blaze Rod", + _doc_items_longdesc = "This is a crafting component dropped from dead blazes.", wield_image = "mcl_mobitems_blaze_rod.png", inventory_image = "mcl_mobitems_blaze_rod.png", }) @@ -43,8 +42,8 @@ end if c("blaze_powder") then minetest.register_craftitem("mobs_mc:blaze_powder", { - description = S("Blaze Powder"), - _doc_items_longdesc = S("This item is mainly used for brewing potions and crafting."), + description = "Blaze Powder", + _doc_items_longdesc = "This item is mainly used for brewing potions and crafting.", wield_image = "mcl_mobitems_blaze_powder.png", inventory_image = "mcl_mobitems_blaze_powder.png", }) @@ -60,8 +59,8 @@ end -- Chicken if c("chicken_raw") then minetest.register_craftitem("mobs_mc:chicken_raw", { - description = S("Raw Chicken"), - _doc_items_longdesc = S("Raw chicken is a food item and can be eaten safely. Cooking it will increase its nutritional value."), + description = "Raw Chicken", + _doc_items_longdesc = "Raw chicken is a food item and can be eaten safely. Cooking it will increase its nutritional value.", inventory_image = "mcl_mobitems_chicken_raw.png", groups = { food = 2, eatable = 2 }, on_use = minetest.item_eat(2), @@ -70,8 +69,8 @@ end if c("chicken_cooked") then minetest.register_craftitem("mobs_mc:chicken_cooked", { - description = S("Cooked Chicken"), - _doc_items_longdesc = S("A cooked chicken is a healthy food item which can be eaten."), + description = "Cooked Chicken", + _doc_items_longdesc = "A cooked chicken is a healthy food item which can be eaten.", inventory_image = "mcl_mobitems_chicken_cooked.png", groups = { food = 2, eatable = 6 }, on_use = minetest.item_eat(6), @@ -89,8 +88,8 @@ end if c("feather") then minetest.register_craftitem("mobs_mc:feather", { - description = S("Feather"), - _doc_items_longdesc = S("Feathers are used in crafting and are dropped from chickens."), + description = "Feather", + _doc_items_longdesc = "Feathers are used in crafting and are dropped from chickens.", inventory_image = "mcl_mobitems_feather.png", }) end @@ -98,8 +97,8 @@ end -- Cow and mooshroom if c("beef_raw") then minetest.register_craftitem("mobs_mc:beef_raw", { - description = S("Raw Beef"), - _doc_items_longdesc = S("Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value."), + description = "Raw Beef", + _doc_items_longdesc = "Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.", inventory_image = "mcl_mobitems_beef_raw.png", groups = { food = 2, eatable = 3 }, on_use = minetest.item_eat(3), @@ -108,8 +107,8 @@ end if c("beef_cooked") then minetest.register_craftitem("mobs_mc:beef_cooked", { - description = S("Steak"), - _doc_items_longdesc = S("Steak is cooked beef from cows and can be eaten."), + description = "Steak", + _doc_items_longdesc = "Steak is cooked beef from cows and can be eaten.", inventory_image = "mcl_mobitems_beef_cooked.png", groups = { food = 2, eatable = 8 }, on_use = minetest.item_eat(8), @@ -129,8 +128,8 @@ end if c("milk") then -- milk minetest.register_craftitem("mobs_mc:milk_bucket", { - description = S("Milk"), - _doc_items_longdesc = S("Milk is a food item obtained by using a bucket on a cow."), + description = "Milk", + _doc_items_longdesc = "Milk is a food item obtained by using a bucket on a cow.", inventory_image = "mobs_bucket_milk.png", groups = { food = 3, eatable = 1 }, on_use = minetest.item_eat(1, "bucket:bucket_empty"), @@ -140,8 +139,8 @@ end if c("bowl") then minetest.register_craftitem("mobs_mc:bowl", { - description = S("Bowl"), - _doc_items_longdesc = S("Bowls are mainly used to hold tasty soups."), + description = "Bowl", + _doc_items_longdesc = "Bowls are mainly used to hold tasty soups.", inventory_image = "mcl_core_bowl.png", }) @@ -162,8 +161,8 @@ end if c("mushroom_stew") then minetest.register_craftitem("mobs_mc:mushroom_stew", { - description = S("Mushroom Stew"), - _doc_items_longdesc = S("Mushroom stew is a healthy soup."), + description = "Mushroom Stew", + _doc_items_longdesc = "Mushroom stew is a healthy soup.", inventory_image = "farming_mushroom_stew.png", groups = { food = 3, eatable = 6 }, on_use = minetest.item_eat(6, "mobs_mc:bowl"), @@ -181,7 +180,7 @@ if c("dragon_egg") then --ender dragon minetest.register_node("mobs_mc:dragon_egg", { - description = S("Dragon Egg"), + description = "Dragon Egg", tiles = { "mcl_end_dragon_egg.png", "mcl_end_dragon_egg.png", @@ -225,7 +224,7 @@ end -- Enderman if c("ender_eye") then minetest.register_craftitem("mobs_mc:ender_eye", { - description = S("Eye of Ender"), + description = "Eye of Ender", _doc_items_longdesc = longdesc_craftitem, inventory_image = "mcl_end_ender_eye.png", groups = { craftitem = 1 }, @@ -243,8 +242,8 @@ end -- Ghast if c("ghast_tear") then minetest.register_craftitem("mobs_mc:ghast_tear", { - description = S("Ghast Tear"), - _doc_items_longdesc = S("A ghast tear is an item used in potion brewing. It is dropped from dead ghasts."), + description = "Ghast Tear", + _doc_items_longdesc = "A ghast tear is an item used in potion brewing. It is dropped from dead ghasts.", wield_image = "mcl_mobitems_ghast_tear.png", inventory_image = "mcl_mobitems_ghast_tear.png", groups = { brewitem = 1 }, @@ -255,27 +254,16 @@ end if c("saddle") then -- Overwrite the saddle from Mobs Redo minetest.register_craftitem(":mobs:saddle", { - description = S("Saddle"), - _doc_items_longdesc = S("Saddles can be put on horses, donkeys, mules and pigs in order to mount them."), - _doc_items_usagehelp = S("Rightclick an animal while holding a saddle to put on the saddle. You can now mount the animal by rightclicking it again."), + description = "Saddle", + _doc_items_longdesc = "Saddles can be put on horses, donkeys, mules and pigs in order to mount them.", + _doc_items_usagehelp = "Rightclick an animal while holding a saddle to put on the saddle. You can now mount the animal by rightclicking it again.", inventory_image = "mcl_mobitems_saddle.png", stack_max = 1, }) end -if c("saddle") and c("lether") and c("string") and c("iron_ingot") then - minetest.register_craft({ - output = "mobs_mc:saddle", - recipe = { - {"mobs:leather", "mobs:leather", "mobs:leather"}, - {"farming:string", "", "farming:string"}, - {"default:steel_ingot", "", "default:steel_ingot"} - }, - }) -end - -- Horse Armor -local horse_armor_use = S("Rightclick a horse to put on the horse armor. Donkeys and mules can't wear horse armor.") +local horse_armor_use = S("Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.") -- TODO: Balance the horse armor strength, compare with MC armor strength if c("iron_horse_armor") then minetest.register_craftitem("mobs_mc:iron_horse_armor", { @@ -284,6 +272,9 @@ if c("iron_horse_armor") then _doc_items_usagehelp = horse_armor_use, inventory_image = "mobs_mc_iron_horse_armor.png", _horse_overlay_image = "mobs_mc_horse_armor_iron.png", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + }, stack_max = 1, groups = { horse_armor = 85 }, }) @@ -295,6 +286,9 @@ if c("gold_horse_armor") then _doc_items_usagehelp = horse_armor_use, inventory_image = "mobs_mc_gold_horse_armor.png", _horse_overlay_image = "mobs_mc_horse_armor_gold.png", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + }, stack_max = 1, groups = { horse_armor = 60 }, }) @@ -306,6 +300,9 @@ if c("diamond_horse_armor") then _doc_items_usagehelp = horse_armor_use, inventory_image = "mobs_mc_diamond_horse_armor.png", _horse_overlay_image = "mobs_mc_horse_armor_diamond.png", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_diamond", + }, stack_max = 1, groups = { horse_armor = 45 }, }) @@ -314,8 +311,8 @@ end -- Pig if c("porkchop_raw") then minetest.register_craftitem("mobs_mc:porkchop_raw", { - description = S("Raw Porkchop"), - _doc_items_longdesc = S("A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value."), + description = "Raw Porkchop", + _doc_items_longdesc = "A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.", inventory_image = "mcl_mobitems_porkchop_raw.png", groups = { food = 2, eatable = 3 }, on_use = minetest.item_eat(3), @@ -324,7 +321,7 @@ end if c("porkchop_cooked") then minetest.register_craftitem("mobs_mc:porkchop_cooked", { - description = S("Cooked Porkchop"), + description = "Cooked Porkchop", _doc_items_longdesc = "Cooked porkchop is the cooked flesh of a pig and is used as food.", inventory_image = "mcl_mobitems_porkchop_cooked.png", groups = { food = 2, eatable = 8 }, @@ -343,9 +340,9 @@ end if c("carrot_on_a_stick") then minetest.register_tool("mobs_mc:carrot_on_a_stick", { - description = S("Carrot on a Stick"), - _doc_items_longdesc = S("A carrot on a stick can be used on saddled pigs to ride them. Pigs will also follow anyone who holds a carrot on a stick near them."), - _doc_items_usagehelp = S("Rightclick a saddled pig with the carrot on a stick to mount it. You can now ride it like a horse."), + description = "Carrot on a Stick", + _doc_items_longdesc = "A carrot on a stick can be used on saddled pigs to ride them. Pigs will also follow anyone who holds a carrot on a stick near them.", + _doc_items_usagehelp = "Rightclick a saddled pig with the carrot on a stick to mount it. You can now ride it like a horse.", wield_image = "mcl_mobitems_carrot_on_a_stick.png", inventory_image = "mcl_mobitems_carrot_on_a_stick.png", sounds = { breaks = "default_tool_breaks" }, @@ -385,8 +382,8 @@ end -- Rabbit if c("rabbit_raw") then minetest.register_craftitem("mobs_mc:rabbit_raw", { - description = S("Raw Rabbit"), - _doc_items_longdesc = S("Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value."), + description = "Raw Rabbit", + _doc_items_longdesc = "Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.", inventory_image = "mcl_mobitems_rabbit_raw.png", groups = { food = 2, eatable = 3 }, on_use = minetest.item_eat(3), @@ -395,8 +392,8 @@ end if c("rabbit_cooked") then minetest.register_craftitem("mobs_mc:rabbit_cooked", { - description = S("Cooked Rabbit"), - _doc_items_longdesc = S("This is a food item which can be eaten."), + description = "Cooked Rabbit", + _doc_items_longdesc = "This is a food item which can be eaten.", inventory_image = "mcl_mobitems_rabbit_cooked.png", groups = { food = 2, eatable = 5 }, on_use = minetest.item_eat(5), @@ -414,8 +411,8 @@ end if c("rabbit_hide") then minetest.register_craftitem("mobs_mc:rabbit_hide", { - description = S("Rabbit Hide"), - _doc_items_longdesc = S("Rabbit hide is used to create leather."), + description = "Rabbit Hide", + _doc_items_longdesc = "Rabbit hide is used to create leather.", inventory_image = "mcl_mobitems_rabbit_hide.png" }) end @@ -432,8 +429,8 @@ end if c("rabbit_foot") then minetest.register_craftitem("mobs_mc:rabbit_foot", { - description = S("Rabbit's Foot"), - _doc_items_longdesc = S("This item is used in brewing."), + description = "Rabbit's Foot", + _doc_items_longdesc = "This item is used in brewing.", inventory_image = "mcl_mobitems_rabbit_foot.png" }) end @@ -441,8 +438,8 @@ end -- Sheep if c("mutton_raw") then minetest.register_craftitem("mobs_mc:mutton_raw", { - description = S("Raw Mutton"), - _doc_items_longdesc = S("Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value."), + description = "Raw Mutton", + _doc_items_longdesc = "Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.", inventory_image = "mcl_mobitems_mutton_raw.png", groups = { food = 2, eatable = 4 }, on_use = minetest.item_eat(4), @@ -451,8 +448,8 @@ end if c("mutton_cooked") then minetest.register_craftitem("mobs_mc:mutton_cooked", { - description = S("Cooked Mutton"), - _doc_items_longdesc = S("Cooked mutton is the cooked flesh from a sheep and is used as food."), + description = "Cooked Mutton", + _doc_items_longdesc = "Cooked mutton is the cooked flesh from a sheep and is used as food.", inventory_image = "mcl_mobitems_mutton_cooked.png", groups = { food = 2, eatable = 8 }, on_use = minetest.item_eat(8), @@ -471,8 +468,8 @@ end -- Shulker if c("shulker_shell") then minetest.register_craftitem("mobs_mc:shulker_shell", { - description = S("Shulker Shell"), - _doc_items_longdesc = S("Shulker shells are used in crafting. They are dropped from dead shulkers."), + description = "Shulker Shell", + _doc_items_longdesc = "Shulker shells are used in crafting. They are dropped from dead shulkers.", inventory_image = "mcl_mobitems_shulker_shell.png", groups = { craftitem = 1 }, }) @@ -481,8 +478,8 @@ end -- Magma cube if c("magma_cream") then minetest.register_craftitem("mobs_mc:magma_cream", { - description = S("Magma Cream"), - _doc_items_longdesc = S("Magma cream is a crafting component."), + description = "Magma Cream", + _doc_items_longdesc = "Magma cream is a crafting component.", wield_image = "mcl_mobitems_magma_cream.png", inventory_image = "mcl_mobitems_magma_cream.png", groups = { brewitem = 1 }, @@ -492,8 +489,8 @@ end -- Slime if c("slimeball") then minetest.register_craftitem("mobs_mc:slimeball", { - description = S("Slimeball"), - _doc_items_longdesc = S("Slimeballs are used in crafting. They are dropped from slimes."), + description = "Slimeball", + _doc_items_longdesc = "Slimeballs are used in crafting. They are dropped from slimes.", inventory_image = "mcl_mobitems_slimeball.png" }) if minetest.get_modpath("mesecons_materials") then @@ -507,8 +504,8 @@ end -- Spider if c("spider_eye") then minetest.register_craftitem("mobs_mc:spider_eye", { - description = S("Spider Eye"), - _doc_items_longdesc = S("Spider eyes are used mainly in crafting and brewing. Spider eyes can be eaten, but they poison you and reduce your health by 2 hit points."), + description = "Spider Eye", + _doc_items_longdesc = "Spider eyes are used mainly in crafting and brewing. Spider eyes can be eaten, but they poison you and reduce your health by 2 hit points.", inventory_image = "mcl_mobitems_spider_eye.png", wield_image = "mcl_mobitems_spider_eye.png", -- Simplified poisonous food @@ -519,29 +516,84 @@ end -- Evoker if c("totem") then - -- TODO: Implement actual MC totem behaviour + local hud_totem = {} + + -- Totem of Undying minetest.register_craftitem("mobs_mc:totem", { description = S("Totem of Undying"), + _tt_help = minetest.colorize("#00FF00", S("Protects you from death while wielding it")), _doc_items_longdesc = S("A totem of undying is a rare artifact which may safe you from certain death."), - _doc_items_usagehelp = S("Hold it in your hand and punch once to instantly get back to full health. The totem gets destroyed in the process."), - wield_image = "mcl_mobitems_totem.png", - inventory_image = "mcl_mobitems_totem.png", + _doc_items_usagehelp = S("The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however."), + inventory_image = "mcl_totems_totem.png", + wield_image = "mcl_totems_totem.png", stack_max = 1, - on_use = function(itemstack, user, pointed_thing) - user:set_hp(20) - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end - return itemstack - end, }) + + minetest.register_on_leaveplayer(function(player) + hud_totem[player:get_player_name()] = nil + end) + + -- Save the player from death when holding totem of undying in hand + minetest.register_on_player_hpchange(function(player, hp_change) + local hp = player:get_hp() + -- Fatal damage? + if hp + hp_change <= 0 then + local wield = player:get_wielded_item() + if wield:get_name() == "mobs_mc:totem" then + local ppos = player:get_pos() + local pnname = minetest.get_node(ppos).name + -- Some exceptions when _not_ to save the player + for n=1, #mobs_mc.misc.totem_fail_nodes do + if pnname == mobs_mc.misc.totem_fail_nodes[n] then + return hp_change + end + end + -- Reset breath as well + if player:get_breath() < 11 then + player:set_breath(10) + end + if not minetest.settings:get_bool("creative_mode") then + wield:take_item() + player:set_wielded_item(wield) + end + -- Effects + minetest.sound_play({name = "mcl_totems_totem", gain=1}, {pos=ppos, max_hear_distance=16}, true) + + -- Big totem overlay + if not hud_totem[player:get_player_name()] then + hud_totem[player:get_player_name()] = player:hud_add({ + hud_elem_type = "image", + text = "mcl_totems_totem.png", + position = { x=0.5, y=1 }, + scale = { x=17, y=17 }, + offset = { x=0, y=-178 }, + z_index = 100, + }) + minetest.after(3, function(name) + local player = minetest.get_player_by_name(name) + if player and player:is_player() then + local name = player:get_player_name() + if hud_totem[name] then + player:hud_remove(hud_totem[name]) + hud_totem[name] = nil + end + end + end, player:get_player_name()) + end + + -- Set HP to exactly 1 + return -hp + 1 + end + end + return hp_change + end, true) end -- Rotten flesh if c("rotten_flesh") then minetest.register_craftitem("mobs_mc:rotten_flesh", { - description = S("Rotten Flesh"), - _doc_items_longdesc = S("Yuck! This piece of flesh clearly has seen better days. Eating it will only poison you and reduces your health by 4 hit points. But tamed wolves can eat it just fine."), + description = "Rotten Flesh", + _doc_items_longdesc = "Yuck! This piece of flesh clearly has seen better days. Eating it will only poison you and reduces your health by 4 hit points. But tamed wolves can eat it just fine.", inventory_image = "mcl_mobitems_rotten_flesh.png", -- Simplified poisonous food groups = { food = 2, eatable = -4 }, @@ -552,8 +604,8 @@ end -- Misc. if c("nether_star") then minetest.register_craftitem("mobs_mc:nether_star", { - description = S("Nether Star"), - _doc_items_longdesc = S("A nether star is a crafting component. It is dropped from the Wither."), + description = "Nether Star", + _doc_items_longdesc = "A nether star is a crafting component. It is dropped from the Wither.", inventory_image = "mcl_mobitems_nether_star.png" }) end @@ -581,9 +633,9 @@ end if c("bone") then minetest.register_craftitem("mobs_mc:bone", { - description = S("Bone"), - _doc_items_longdesc = S("Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient."), - _doc_items_usagehelp = S("Hold the bone in your hand near wolves to attract them. Rightclick the wolf to give it a bone and tame it."), + description = "Bone", + _doc_items_longdesc = "Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.", + _doc_items_usagehelp = "Hold the bone in your hand near wolves to attract them. Rightclick the wolf to give it a bone and tame it.", inventory_image = "mcl_mobitems_bone.png" }) if minetest.get_modpath("bones") then diff --git a/mods/ENTITIES/mobs_mc/2_throwing.lua b/mods/ENTITIES/mobs_mc/2_throwing.lua index 81da2774..089e39ca 100644 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ b/mods/ENTITIES/mobs_mc/2_throwing.lua @@ -3,9 +3,10 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +-- NOTE: Strings intentionally not marked for translation, other mods already have these items. +-- TODO: Remove this file eventually, all items here are already outsourced in other mods. + +local S = minetest.get_translator("mobs_mc") --maikerumines throwing code --arrow (weapon) @@ -14,15 +15,18 @@ local c = mobs_mc.is_item_variable_overridden minetest.register_node("mobs_mc:arrow_box", { drawtype = "nodebox", + is_ground_content = false, node_box = { type = "fixed", fixed = { -- Shaft - {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, - --Spitze + {-6.5/17, -1.5/17, -1.5/17, -4.5/17, 1.5/17, 1.5/17}, + {-4.5/17, -0.5/17, -0.5/17, 5.5/17, 0.5/17, 0.5/17}, + {5.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + -- Tip {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, - --Federn + -- Fletching {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, @@ -34,8 +38,17 @@ minetest.register_node("mobs_mc:arrow_box", { {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, } }, - tiles = {"mcl_throwing_arrow.png^[transformFX", "mcl_throwing_arrow.png^[transformFX", "mcl_throwing_arrow_back.png", "mcl_throwing_arrow_front.png", "mcl_throwing_arrow.png", "mcl_throwing_arrow.png^[transformFX"}, - groups = {not_in_creative_inventory=1}, + tiles = {"mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow_back.png", "mcl_bows_arrow_front.png", "mcl_bows_arrow.png", "mcl_bows_arrow.png^[transformFX"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + groups = {not_in_creative_inventory=1, dig_immediate=3}, + node_placement_prediction = "", + on_construct = function(pos) + minetest.log("error", "[mobs_mc] Trying to construct mobs_mc:arrow_box at "..minetest.pos_to_string(pos)) + minetest.remove_node(pos) + end, + drop = "", }) local THROWING_ARROW_ENTITY={ @@ -52,13 +65,13 @@ local THROWING_ARROW_ENTITY={ --ARROW CODE THROWING_ARROW_ENTITY.on_step = function(self, dtime) self.timer=self.timer+dtime - local pos = self.object:getpos() + local pos = self.object:get_pos() local node = minetest.get_node(pos) minetest.add_particle({ pos = pos, - vel = {x=0, y=0, z=0}, - acc = {x=0, y=0, z=0}, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0, z=0}, expirationtime = .3, size = 1, collisiondetection = false, @@ -72,7 +85,7 @@ THROWING_ARROW_ENTITY.on_step = function(self, dtime) if obj:get_luaentity() ~= nil then if obj:get_luaentity().name ~= "mobs_mc:arrow_entity" and obj:get_luaentity().name ~= "__builtin:item" then local damage = 3 - minetest.sound_play("damage", {pos = pos}) + minetest.sound_play("damage", {pos = pos}, true) obj:punch(self.object, 1.0, { full_punch_interval=1.0, damage_groups={fleshy=damage}, @@ -81,7 +94,7 @@ THROWING_ARROW_ENTITY.on_step = function(self, dtime) end else local damage = 3 - minetest.sound_play("damage", {pos = pos}) + minetest.sound_play("damage", {pos = pos}, true) obj:punch(self.object, 1.0, { full_punch_interval=1.0, damage_groups={fleshy=damage}, @@ -93,7 +106,7 @@ THROWING_ARROW_ENTITY.on_step = function(self, dtime) if self.lastpos.x~=nil then if node.name ~= "air" then - minetest.sound_play("bowhit1", {pos = pos}) + minetest.sound_play("bowhit1", {pos = pos}, true) minetest.add_item(self.lastpos, 'mobs_mc:arrow') self.object:remove() end @@ -113,13 +126,13 @@ local throwing_shoot_arrow = function(itemstack, player) if not minetest.settings:get_bool("creative_mode") then player:get_inventory():remove_item("main", arrow[1]) end - local playerpos = player:getpos() + local playerpos = player:get_pos() local obj = minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, arrow[2]) --mc local dir = player:get_look_dir() - obj:setvelocity({x=dir.x*22, y=dir.y*22, z=dir.z*22}) - obj:setacceleration({x=dir.x*-3, y=-10, z=dir.z*-3}) - obj:setyaw(player:get_look_yaw()+math.pi) - minetest.sound_play("throwing_sound", {pos=playerpos}) + obj:set_velocity({x=dir.x*22, y=dir.y*22, z=dir.z*22}) + obj:set_acceleration({x=dir.x*-3, y=-10, z=dir.z*-3}) + obj:set_yaw(player:get_look_yaw()+math.pi) + minetest.sound_play("throwing_sound", {pos=playerpos}, true) if obj:get_luaentity().player == "" then obj:get_luaentity().player = player end @@ -132,10 +145,10 @@ end if c("arrow") then minetest.register_craftitem("mobs_mc:arrow", { - description = S("Arrow"), - _doc_items_longdesc = S("Arrows are ammunition for bows."), - _doc_items_usagehelp = S("To use arrows as ammunition for a bow, put them in the inventory slot following the bow. Slots are counted left to right, top to bottom."), - inventory_image = "mcl_throwing_arrow_inv.png", + description = "Arrow", + _doc_items_longdesc = "Arrows are ammunition for bows.", + _doc_items_usagehelp = "To use arrows as ammunition for a bow, put them in the inventory slot following the bow. Slots are counted left to right, top to bottom.", + inventory_image = "mcl_bows_arrow_inv.png", }) end @@ -152,10 +165,10 @@ end if c("bow") then minetest.register_tool("mobs_mc:bow_wood", { - description = S("Bow"), - _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes."), - _doc_items_usagehelp = S("To use the bow, you first need to have at least one arrow in slot following the bow. Leftclick to shoot. Each hit deals 3 damage."), - inventory_image = "mcl_throwing_bow.png", + description = "Bow", + _doc_items_longdesc = "Bows are ranged weapons to shoot arrows at your foes.", + _doc_items_usagehelp = "To use the bow, you first need to have at least one arrow in slot following the bow. Leftclick to shoot. Each hit deals 3 damage.", + inventory_image = "mcl_bows_bow.png", on_use = function(itemstack, user, pointed_thing) if throwing_shoot_arrow(itemstack, user, pointed_thing) then if not minetest.settings:get_bool("creative_mode") then @@ -197,8 +210,8 @@ if c("egg") then }, nil) end, - hit_mob = function(self, player) - player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {}, }, nil) @@ -247,13 +260,13 @@ if c("egg") then -- shoot egg local mobs_shoot_egg = function (item, player, pointed_thing) - local playerpos = player:getpos() + local playerpos = player:get_pos() minetest.sound_play("default_place_node_hard", { pos = playerpos, gain = 1.0, max_hear_distance = 5, - }) + }, true) local obj = minetest.add_entity({ x = playerpos.x, @@ -267,13 +280,13 @@ if c("egg") then ent.velocity = egg_VELOCITY -- needed for api internal timing ent.switch = 1 -- needed so that egg doesn't despawn straight away - obj:setvelocity({ + obj:set_velocity({ x = dir.x * egg_VELOCITY, y = dir.y * egg_VELOCITY, z = dir.z * egg_VELOCITY }) - obj:setacceleration({ + obj:set_acceleration({ x = dir.x * -3, y = -egg_GRAVITY, z = dir.z * -3 @@ -291,8 +304,8 @@ if c("egg") then end minetest.register_craftitem("mobs_mc:egg", { - description = S("Egg"), - _doc_items_longdesc = S("Eggs can be thrown and break on impact. There is a small chance that 1 or even 4 chicks will pop out"), + description = "Egg", + _doc_items_longdesc = "Eggs can be thrown and break on impact. There is a small chance that 1 or even 4 chicks will pop out", _doc_items_usagehelp = how_to_throw, inventory_image = "mobs_chicken_egg.png", on_use = mobs_shoot_egg, @@ -337,7 +350,7 @@ if c("snowball") then -- shoot snowball local mobs_shoot_snowball = function (item, player, pointed_thing) - local playerpos = player:getpos() + local playerpos = player:get_pos() local obj = minetest.add_entity({ x = playerpos.x, @@ -351,13 +364,13 @@ if c("snowball") then ent.velocity = snowball_VELOCITY -- needed for api internal timing ent.switch = 1 -- needed so that egg doesn't despawn straight away - obj:setvelocity({ + obj:set_velocity({ x = dir.x * snowball_VELOCITY, y = dir.y * snowball_VELOCITY, z = dir.z * snowball_VELOCITY }) - obj:setacceleration({ + obj:set_acceleration({ x = dir.x * -3, y = -snowball_GRAVITY, z = dir.z * -3 @@ -377,8 +390,8 @@ if c("snowball") then -- Snowball minetest.register_craftitem("mobs_mc:snowball", { - description = S("Snowball"), - _doc_items_longdesc = S("Snowballs can be thrown at your enemies. A snowball deals 3 damage to blazes, but is harmless to anything else."), + description = "Snowball", + _doc_items_longdesc = "Snowballs can be thrown at your enemies. A snowball deals 3 damage to blazes, but is harmless to anything else.", _doc_items_usagehelp = how_to_throw, inventory_image = "mcl_throwing_snowball.png", on_use = mobs_shoot_snowball, @@ -386,7 +399,3 @@ if c("snowball") then end --end maikerumine code - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC mobs loaded") -end diff --git a/mods/ENTITIES/mobs_mc/3_shared.lua b/mods/ENTITIES/mobs_mc/3_shared.lua index 84a43dfe..fce0850b 100644 --- a/mods/ENTITIES/mobs_mc/3_shared.lua +++ b/mods/ENTITIES/mobs_mc/3_shared.lua @@ -32,13 +32,13 @@ mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval) self._teleport_timer = self._teleport_timer - dtime if self._teleport_timer <= 0 then self._teleport_timer = teleport_check_interval - local mob_pos = self.object:getpos() + local mob_pos = self.object:get_pos() local owner = minetest.get_player_by_name(self.owner) if not owner then -- No owner found, no teleportation return end - local owner_pos = owner:getpos() + local owner_pos = owner:get_pos() local dist_from_owner = vector.distance(owner_pos, mob_pos) if dist_from_owner > dist then -- Check for nodes below air in a 5×1×5 area around the owner position @@ -53,7 +53,7 @@ mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval) if minetest.registered_nodes[minetest.get_node(telepos).name].walkable == false and minetest.registered_nodes[minetest.get_node(telepos_below).name].walkable == true then -- Correct position found! Let's teleport. - self.object:setpos(telepos) + self.object:set_pos(telepos) return end end diff --git a/mods/ENTITIES/mobs_mc/4_heads.lua b/mods/ENTITIES/mobs_mc/4_heads.lua index 80c97198..01b8ee57 100644 --- a/mods/ENTITIES/mobs_mc/4_heads.lua +++ b/mods/ENTITIES/mobs_mc/4_heads.lua @@ -1,9 +1,10 @@ --MC Heads for minetest --maikerumine --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +-- NOTE: Strings intentionally not marked for translation, other mods already have these items. +-- TODO: Remove this file eventually, all items here are already outsourced in other mods. + +local S = minetest.get_translator("mobs_mc") -- Heads system @@ -55,7 +56,7 @@ local function addhead(mobname, desc, longdesc) end -- Add heads -addhead("zombie", S("Zombie Head"), S("A zombie head is a small decorative block which resembles the head of a zombie.")) -addhead("creeper", S("Creeper Head"), S("A creeper head is a small decorative block which resembles the head of a creeper.")) -addhead("skeleton", S("Skeleton Skull"), S("A skeleton skull is a small decorative block which resembles the skull of a skeleton.")) -addhead("wither_skeleton", S("Wither Skeleton Skull"), S("A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton.")) +addhead("zombie", "Zombie Head", "A zombie head is a small decorative block which resembles the head of a zombie.") +addhead("creeper", "Creeper Head", "A creeper head is a small decorative block which resembles the head of a creeper.") +addhead("skeleton", "Skeleton Skull", "A skeleton skull is a small decorative block which resembles the skull of a skeleton.") +addhead("wither_skeleton", "Wither Skeleton Skull", "A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton.") diff --git a/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua b/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua new file mode 100644 index 00000000..303feb1a --- /dev/null +++ b/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua @@ -0,0 +1,11 @@ +function mobs:spawn_abm_check(pos, node, name) + -- Don't spawn monsters on mycelium + if (node.name == "mcl_core:mycelium" or node.name == "mcl_core:mycelium_snow") and minetest.registered_entities[name].type == "monster" then + return true + -- Spawn on opaque or liquid nodes + elseif minetest.get_item_group(node.name, "opaque") ~= 0 or minetest.registered_nodes[node.name].liquidtype ~= "none" then + return false + end + -- Reject everything else + return true +end diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index e0fe9976..69615048 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -65,6 +65,14 @@ Origin of those models: * `mobs_mc_llama_gray.png` * `mobs_mc_llama_chest.png` * `mobs_mc_endermite.png` + * `mobs_mc_magmacube.png` + * `mobs_mc_chicken.png` + * `mobs_mc_wither.png` + * `mobs_mc_wither_skeleton.png` + * `mobs_mc_TEMP_wither_projectile.png` + * Gerold55 + * `mobs_mc_mooshroom_brown.png` (CC0) + * `mobs_mc_mushroom_brown.png` (CC0) * “Spawn egg” textures (`mobs_mc_spawn_icon_*`) by 22i * Any other texture not mentioned here are licensed under the MIT License @@ -73,6 +81,9 @@ Origin of those models: * PilzAdam and Wuzzy (CC0) * `mobs_mc_chicken_lay_egg.ogg` +* [AGFX](http://www.freesound.org/people/DrMinky/sounds/) (CC0) + * `mobs_mc_chicken_child.ogg` + * Source: * Randomation (CC0) * `green_slime_damage.ogg` * `green_slime_attack.ogg` @@ -84,6 +95,10 @@ Origin of those models: * Zozzy from Freesound.org (CC0) * `mobs_mc_cow.ogg` * Source: +* [Bird\_man](https://freesound.org/people/Bird_man/packs/16972/) + * `mobs_mc_cow_hurt.ogg` (CC0) + * Heavily modified + * Source: * [NPXcoot](https://github.com/NPXcoot1) (CC BY-SA 4.0) * `mobs_mc_ender_dragon_*` * Blender Foundation (CC BY 3.0) @@ -98,7 +113,7 @@ Origin of those models: * TenPlus1, from `mobs_monster` or `mobs_animal` mod (MIT License) * `mobs_chicken.ogg` * `mobs_fireball.ogg` - * `mobs_kitten.ogg` + * `mobs_mc_cat_idle.1.ogg` * `mobs_mc_llama.ogg` * `mobs_pig.ogg` * `mobs_pig_angry.ogg` @@ -108,10 +123,70 @@ Origin of those models: * BrandonReese (LGPL v2.1) * `mobs_eerie.ogg` * [Under7dude](https://freesound.org/people/Under7dude/) (CC0) - * `mobs_mc_zombie_idle.ogg` + * `mobs_mc_zombie_growl.ogg` * Source: * [haratman](https://freesound.org/people/haratman/) (CC0) * `mobs_mc_zombie_death.ogg` * Source: * `mobs_mc_zombie_hurt.ogg` * Source: +* [Spennnyyy](https://freesound.org/people/Spennnyyy/) (CC0) + * `mcl_totems_totem.ogg` + * Source: +* [Baŝto](https://opengameart.org/users/ba%C5%9Dto) + * `mobs_mc_skeleton_random.*.ogg` (CC BY 3.0) + * Source: +* [spookymodem](https://freesound.org/people/spookymodem/) + * `mobs_mc_skeleton_death.ogg` (CC0) + * +* [Cribbler](https://freesound.org/people/Cribbler/) + * `mobs_mc_skeleton_hurt.ogg` (CC0) + * Source: +* [GoodListener](https://freesound.org/people/GoodListener/) + * `mobs_mc_horse_random.1.ogg` (CC BY 3.0) + * Source: + * `mobs_mc_horse_death.ogg` (CC BY 3.0) + * Source: +* [ERH](https://freesound.org/people/ERH/) + * `mobs_mc_horse_random.2.ogg` (CC BY 3.0) + * Source: +* [j1987](https://freesound.org/people/j1987/) + * `mobs_mc_creeper_death.ogg` (CC0) + * Source: +* [themightyglider](https://opengameart.org/users/themightyglider) + * `mobs_mc_creeper_hurt.ogg` (CC0) + * Source: +* [pauliw](https://opengameart.org/users/pauliw) + * `mobs_mc_vex_hurt.ogg` (CC0) + * Source: + * `mobs_mc_vex_death.ogg` (CC0) + * Source: +* [suonho](https://freesound.org/people/suonho/) + * `mobs_mc_bat_idle.ogg` (CC BY 3.0) + * Source: +* [cmusounddesign](https://freesound.org/people/cmusounddesign/) + * `mobs_mc_cat_hiss.ogg` (CC BY 3.0) + * Source: +* [SelsRoyalNavy](https://freesound.org/people/SelsRoyalNavy/) + * `mobs_mc_cat_idle.2.ogg` (CC0) + * Source: +* [ebcrosby](https://freesound.org/people/ebcrosby/) + * `mobs_mc_ocelot_hurt.ogg` (CC BY 3.0) + * Source: +* [Inocodum](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=3115) + * `mobs_mc_silverfish_hurt.ogg` (CC BY-SA 4.0) + * `mobs_mc_silverfish_death.ogg` (CC BY-SA 4.0) + * `mobs_mc_silverfish_idle.ogg` (CC BY-SA 4.0) + * Source: +* [LukeIRL](https://freesound.org/people/LukeIRL/) + * `mobs_mc_magma_cube_small.ogg` (CC BY 4.0) + * Derived from: + * `mobs_mc_magma_cube_big.ogg` (CC BY 4.0) + * Derived from: +* [kbnevel](https://freesound.org/people/kbnevel/) + * `mobs_mc_magma_cube_attack.ogg` (CC0) + * Derived from: + +Note: Many of these sounds have been more or less modified to fit the game. + +Sounds not mentioned hre are licensed under CC0. diff --git a/mods/ENTITIES/mobs_mc/README.md b/mods/ENTITIES/mobs_mc/README.md index a52bce09..d3ac29a1 100644 --- a/mods/ENTITIES/mobs_mc/README.md +++ b/mods/ENTITIES/mobs_mc/README.md @@ -8,7 +8,7 @@ This mod adds mobs which closely resemble the mobs from the game Minecraft, vers * [Wuzzy2](https://github.com/Wuzzy2): Zombies, husks, item textures, and code * [toby109tt](https://github.com/tobyplowy): Mapping fixes - better 2D planes * [22i](https://github.com/22i): Models (done in Blender) and mob icons for spawn eggs -* [XSSheep](https://www.planetminecraft.com/member/xssheep/): Mob and item textures (from [Pixel Perfection](https://www.planetminecraft.com/texture_pack/131pixel-perfection/) +* [XSSheep](https://www.planetminecraft.com/member/xssheep/): Mob and item textures (from [Pixel Perfection](https://www.planetminecraft.com/texture_pack/131pixel-perfection/)) * MysticTempest: More mob textures * See `LICENSE_media.md` for detailed credits about each file @@ -19,8 +19,8 @@ This mod adds mobs which closely resemble the mobs from the game Minecraft, vers ## Useful information for developers -### Subgame integration -Want to include this mod in your subgame? Read `gameconfig.md`. +### Game integration +Want to include this mod in your game? Read `gameconfig.md`. ### Links diff --git a/mods/ENTITIES/mobs_mc/agent.lua b/mods/ENTITIES/mobs_mc/agent.lua new file mode 100644 index 00000000..8fa7314c --- /dev/null +++ b/mods/ENTITIES/mobs_mc/agent.lua @@ -0,0 +1,39 @@ +--################### +--################### AGENT +--################### + +local S = minetest.get_translator("mobs_mc") + +mobs:register_mob("mobs_mc:agent", { + type = "npc", + spawn_class = "passive", + passive = true, + hp_min = 20, + hp_max = 20, + armor = 100, + collisionbox = {-0.35, -0.01, -0.35, 0.35, 1, 0.35}, + visual = "mesh", + mesh = "mobs_mc_agent.b3d", + textures = { + {"mobs_mc_agent.png"}, + }, + -- TODO: sounds + visual_size = {x=3, y=3}, + walk_chance = 0, + walk_velocity = 0.6, + run_velocity = 2, + jump = true, + animation = { + stand_speed = 25, + walk_speed = 25, + run_speed = 50, + stand_start = 20, + stand_end = 60, + walk_start = 0, + walk_end = 20, + run_start = 0, + run_end = 20, + }, +}) + +mobs:register_egg("mobs_mc:agent", S("Agent"), "mobs_mc_spawn_icon_agent.png", 0) diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 5e6b9aa9..be0d72e8 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -1,11 +1,11 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:bat", { type = "animal", + spawn_class = "ambient", + can_despawn = true, passive = true, hp_min = 6, hp_max = 6, @@ -17,27 +17,34 @@ mobs:register_mob("mobs_mc:bat", { }, visual_size = {x=1, y=1}, sounds = { - random = "mobs_rat", -- TODO: This sound is supposed to be very high-pitched and scary + random = "mobs_mc_bat_idle", distance = 16, }, walk_velocity = 4.5, run_velocity = 6.0, -- TODO: Hang upside down animation = { - walk_speed = 80, stand_speed = 80, run_speed = 80, - stand_start = 0, stand_end = 40, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, + stand_speed = 80, + stand_start = 0, + stand_end = 40, + walk_speed = 80, + walk_start = 0, + walk_end = 40, + run_speed = 80, + run_start = 0, + run_end = 40, + -- TODO: Less ugly death animation +--[[ die_speed = 60, + die_start = 40, + die_end = 80, + die_loop = false, +]] }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fall_damage = 0, view_range = 16, fly = true, - fly_in = "air", }) @@ -59,8 +66,3 @@ mobs:spawn_specific("mobs_mc:bat", mobs_mc.spawn.solid, {"air"}, 0, maxlight, 20 -- spawn eggs mobs:register_egg("mobs_mc:bat", S("Bat"), "mobs_mc_spawn_icon_bat.png", 0) - - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Bat loaded") -end diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 3af10105..8231148e 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -3,11 +3,8 @@ -- Model and mobs_blaze.png see https://github.com/22i/minecraft-voxel-blender-models -- blaze.lua partial copy of mobs_mc/ghast.lua --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### BLAZE --################### @@ -15,6 +12,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:blaze", { type = "monster", + spawn_class = "hostile", hp_min = 20, hp_max = 20, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.79, 0.3}, @@ -24,6 +22,7 @@ mobs:register_mob("mobs_mc:blaze", { textures = { {"mobs_mc_blaze.png"}, }, + armor = { fleshy = 100, snowball_vulnerable = 100 }, visual_size = {x=3, y=3}, sounds = { random = "mobs_mc_blaze_breath", @@ -43,18 +42,20 @@ mobs:register_mob("mobs_mc:blaze", { max = 1,}, }, animation = { - stand_start = 1, - stand_end = 40, - walk_start = 1, - walk_end = 40, - run_start = 1, - run_end = 40, - shoot_start = 1, - shoot_end = 40, + stand_speed = 25, + stand_start = 0, + stand_end = 100, + walk_speed = 25, + walk_start = 0, + walk_end = 100, + run_speed = 50, + run_start = 0, + run_end = 100, }, -- MC Wiki: takes 1 damage every half second while in water water_damage = 2, lava_damage = 0, + fire_damage = 0, fall_damage = 0, fall_speed = -2.25, light_damage = 0, @@ -62,13 +63,13 @@ mobs:register_mob("mobs_mc:blaze", { attack_type = "dogshoot", arrow = "mobs_mc:blaze_fireball", shoot_interval = 3.5, + shoot_offset = 1.0, passive = false, jump = true, jump_height = 4, fly = true, - jump_chance = 98, - fear_height = 120, - blood_amount = 0, + fear_height = 0, + glow = 14, }) mobs:spawn_specific("mobs_mc:blaze", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 3, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) @@ -78,7 +79,7 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { visual = "sprite", visual_size = {x = 0.3, y = 0.3}, textures = {"mcl_fire_fire_charge.png"}, - velocity = 12, + velocity = 15, -- Direct hit, no fire... just plenty of pain hit_player = function(self, player) @@ -88,30 +89,39 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { }, nil) end, - hit_mob = function(self, player) - player:punch(self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 5}, }, nil) end, + hit_object = function(self, object) + local lua = object:get_luaentity() + if lua then + if lua.name == "mcl_minecarts:tnt_minecart" then + lua:on_activate_by_rail(2) + end + end + end, + -- Node hit, make fire hit_node = function(self, pos, node) - local pos_above = {x=pos.x, y=pos.y+1, z=pos.z} - if minetest.registered_nodes[minetest.get_node(pos_above).name].buildable_to then + if node.name == "air" then minetest.set_node(pos_above, {name=mobs_mc.items.fire}) + else + local v = self.object:get_velocity() + v = vector.normalize(v) + local crashpos = vector.subtract(pos, v) + local crashnode = minetest.get_node(crashpos) + -- Set fire if node is air, or a replacable flammable node (e.g. a plant) + if crashnode.name == "air" or + (minetest.registered_nodes[crashnode.name].buildable_to and minetest.get_item_group(crashnode.name, "flammable") >= 1) then + minetest.set_node(crashpos, {name=mobs_mc.items.fire}) + end end end }) -- spawn eggs mobs:register_egg("mobs_mc:blaze", S("Blaze"), "mobs_mc_spawn_icon_blaze.png", 0) - - - - - - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Blaze loaded") -end diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index cd8a22b2..d0c9c7c7 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -1,11 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### CHICKEN @@ -15,6 +10,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:chicken", { type = "animal", + spawn_class = "passive", hp_min = 4, hp_max = 4, @@ -40,15 +36,17 @@ mobs:register_mob("mobs_mc:chicken", { min = 0, max = 2,}, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fall_damage = 0, fall_speed = -2.25, sounds = { random = "mobs_chicken", - death = "Chickenhurt1", -- TODO: replace - damage = "Chickenhurt1", -- TODO: replace + -- TODO: death, damage + distance = 16, + }, + sounds_child = { + random = "mobs_mc_chicken_child", + damage = "mobs_mc_chicken_child", + death = "mobs_mc_chicken_child", distance = 16, }, animation = { @@ -81,7 +79,7 @@ mobs:register_mob("mobs_mc:chicken", { return end - local pos = self.object:getpos() + local pos = self.object:get_pos() minetest.add_item(pos, mobs_mc.items.egg) @@ -89,7 +87,7 @@ mobs:register_mob("mobs_mc:chicken", { pos = pos, gain = 1.0, max_hear_distance = 16, - }) + }, true) end, }) @@ -99,7 +97,3 @@ mobs:spawn_specific("mobs_mc:chicken", mobs_mc.spawn.grassland, {"air"}, 9, mine -- spawn eggs mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC chicken loaded") -end diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index f7f2d47b..58d2cd58 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -1,19 +1,19 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") local cow_def = { type = "animal", + spawn_class = "passive", hp_min = 10, hp_max = 10, collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45}, visual = "mesh", mesh = "mobs_mc_cow.b3d", - textures = { - {"mobs_mc_cow.png"}, - }, + textures = { { + "mobs_mc_cow.png", + "blank.png", + }, }, visual_size = {x=2.8, y=2.8}, makes_footstep_sound = true, walk_velocity = 1, @@ -27,14 +27,11 @@ local cow_def = { min = 0, max = 2,}, }, - water_damage = 1, - lava_damage = 5, - light_damage = 0, runaway = true, sounds = { random = "mobs_mc_cow", - death = "Cowhurt1", -- TODO: Replace - damage = "Cowhurt1", -- TODO: Replace + damage = "mobs_mc_cow_hurt", + death = "mobs_mc_cow_hurt", distance = 16, }, animation = { @@ -60,7 +57,7 @@ local cow_def = { if inv:room_for_item("main", {name=mobs_mc.items.milk}) then clicker:get_inventory():add_item("main", mobs_mc.items.milk) else - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = pos.y + 0.5 minetest.add_item(pos, {name = mobs_mc.items.milk}) end @@ -79,7 +76,7 @@ mobs:register_mob("mobs_mc:cow", cow_def) local mooshroom_def = table.copy(cow_def) mooshroom_def.mesh = "mobs_mc_cow.b3d" -mooshroom_def.textures = { {"mobs_mc_mooshroom.png^mobs_mc_mooshroom_mooshroom.png"}, } +mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } } mooshroom_def.on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, true) then return end if mobs:protect(self, clicker) then return end @@ -90,14 +87,19 @@ mooshroom_def.on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() -- Use shears to get mushrooms and turn mooshroom into cow if item:get_name() == mobs_mc.items.shears then - local pos = self.object:getpos() - minetest.sound_play("shears", {pos = pos}) - minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_red .. " 5") + local pos = self.object:get_pos() + minetest.sound_play("shears", {pos = pos}, true) - local oldyaw = self.object:getyaw() + if self.base_texture[1] == "mobs_mc_mooshroom_brown.png" then + minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_brown .. " 5") + else + minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_red .. " 5") + end + + local oldyaw = self.object:get_yaw() self.object:remove() local cow = minetest.add_entity(pos, "mobs_mc:cow") - cow:setyaw(oldyaw) + cow:set_yaw(oldyaw) if not minetest.settings:get_bool("creative_mode") then item:add_wear(mobs_mc.misc.shears_wear) @@ -111,7 +113,7 @@ mooshroom_def.on_rightclick = function(self, clicker) if inv:room_for_item("main", {name=mobs_mc.items.milk}) then clicker:get_inventory():add_item("main", mobs_mc.items.milk) else - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = pos.y + 0.5 minetest.add_item(pos, {name = mobs_mc.items.milk}) end @@ -123,7 +125,7 @@ mooshroom_def.on_rightclick = function(self, clicker) if inv:room_for_item("main", {name=mobs_mc.items.mushroom_stew}) then clicker:get_inventory():add_item("main", mobs_mc.items.mushroom_stew) else - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = pos.y + 0.5 minetest.add_item(pos, {name = mobs_mc.items.mushroom_stew}) end @@ -134,16 +136,9 @@ mobs:register_mob("mobs_mc:mooshroom", mooshroom_def) -- Spawning -mobs:spawn_specific("mobs_mc:cow", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 20, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -mobs:spawn_specific("mobs_mc:mooshroom", mobs_mc.spawn.mushroom_island, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 10, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) - --- compatibility -mobs:alias_mob("mobs_animal:cow", "mobs_mc:cow") +mobs:spawn_specific("mobs_mc:cow", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 10, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) +mobs:spawn_specific("mobs_mc:mooshroom", mobs_mc.spawn.mushroom_island, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 5, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn egg mobs:register_egg("mobs_mc:cow", S("Cow"), "mobs_mc_spawn_icon_cow.png", 0) mobs:register_egg("mobs_mc:mooshroom", S("Mooshroom"), "mobs_mc_spawn_icon_mooshroom.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Cow loaded") -end diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index b8ba9e2c..e5ff688c 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -1,11 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### CREEPER @@ -16,6 +11,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:creeper", { type = "monster", + spawn_class = "hostile", hp_min = 20, hp_max = 20, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3}, @@ -28,19 +24,23 @@ mobs:register_mob("mobs_mc:creeper", { visual_size = {x=3, y=3}, sounds = { attack = "tnt_ignite", - death = "Creeperdeath", -- TODO: Replace - damage = "Creeper4", -- TODO: Replce - war_cry = "tnt_ignite", + death = "mobs_mc_creeper_death", + damage = "mobs_mc_creeper_hurt", + fuse = "tnt_ignite", explode = "tnt_explode", distance = 16, }, makes_footstep_sound = true, - walk_velocity = 1.5, - run_velocity = 3, + walk_velocity = 1.05, + run_velocity = 2.1, + runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, attack_type = "explode", - explosion_radius = 3, - explosion_fire = false, + explosion_strength = 3, + reach = 4, + explosion_timer = 1.5, + allow_fuse_reset = true, + stop_to_explode = true, -- Force-ignite creeper with flint and steel and explode after 1.5 seconds. -- TODO: Make creeper flash after doing this as well. @@ -57,19 +57,19 @@ mobs:register_mob("mobs_mc:creeper", { item:add_wear(1000) -- Tool break sound if item:get_count() == 0 and wdef.sound and wdef.sound.breaks then - minetest.sound_play(wdef.sound.breaks, {pos = clicker:getpos(), gain = 0.5}) + minetest.sound_play(wdef.sound.breaks, {pos = clicker:get_pos(), gain = 0.5}, true) end clicker:set_wielded_item(item) end - self._forced_explosion_countdown_timer = 1.5 - minetest.sound_play(self.sounds.attack, {pos = self.object:getpos(), gain = 1, max_hear_distance = 16}) + self._forced_explosion_countdown_timer = self.explosion_timer + minetest.sound_play(self.sounds.attack, {pos = self.object:get_pos(), gain = 1, max_hear_distance = 16}, true) end end, do_custom = function(self, dtime) if self._forced_explosion_countdown_timer ~= nil then self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime if self._forced_explosion_countdown_timer <= 0 then - mobs:explosion(self.object:getpos(), self.explosion_radius, 0, 1, self.sounds.explode) + mobs:boom(self, self.object:get_pos(), self.explosion_strength) self.object:remove() end end @@ -114,22 +114,11 @@ mobs:register_mob("mobs_mc:creeper", { }, floats = 1, fear_height = 4, - water_damage = 1, - lava_damage = 4, - light_damage = 0, view_range = 16, - blood_amount = 0, }) mobs:spawn_specific("mobs_mc:creeper", mobs_mc.spawn.solid, {"air"}, 0, 7, 20, 16500, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) --- compatibility -mobs:alias_mob("mobs:creeper", "mobs_mc:creeper") - -- spawn eggs mobs:register_egg("mobs_mc:creeper", S("Creeper"), "mobs_mc_spawn_icon_creeper.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Creeper loaded") -end diff --git a/mods/ENTITIES/mobs_mc/depends.txt b/mods/ENTITIES/mobs_mc/depends.txt index 3c2630eb..b37d4adb 100644 --- a/mods/ENTITIES/mobs_mc/depends.txt +++ b/mods/ENTITIES/mobs_mc/depends.txt @@ -1,11 +1,11 @@ +mcl_init default? -mobs -tnt? +mcl_mobs +mcl_tnt? +mcl_bows? mcl_throwing? -throwing? -fishing? +mcl_fishing? bones? mesecons_materials? mobs_mc_gameconfig? -intllib? doc_items? diff --git a/mods/ENTITIES/mobs_mc/description.txt b/mods/ENTITIES/mobs_mc/description.txt index ac5a6406..c57195fe 100644 --- a/mods/ENTITIES/mobs_mc/description.txt +++ b/mods/ENTITIES/mobs_mc/description.txt @@ -1 +1 @@ -Adds MC like monsters and animals. \ No newline at end of file +Adds Minecraft-like monsters and animals. diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 790ec19b..c9da0c49 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -2,41 +2,11 @@ --################### ENDERDRAGON --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---[[ -mobs:register_mob("mobs_mc:12enderdragon", { - type = "animal", - passive = true, - runaway = true, - stepheight = 1.2, - hp_min = 30, - hp_max = 60, - armor = 150, - collisionbox = {-0.35, -0.01, -0.35, 0.35, 2, 0.35}, - visual = "mesh", - mesh = "enderdragon.b3d", - textures = { - {"enderdragon.png"}, - }, - visual_size = {x=1, y=1}, - walk_velocity = 0.6, - run_velocity = 2, - jump = true, - animation = { - speed_normal = 25, speed_run = 50, - stand_start = 0, stand_end = 20, - walk_start = 0, walk_end = 20, - run_start = 0, run_end = 20, - }, -}) - -mobs:register_egg("mobs_mc:12enderdragon", "Enderdragon", "enderdragon_inv.png", 0) -]] mobs:register_mob("mobs_mc:enderdragon", { type = "monster", + spawn_class = "hostile", pathfinding = 1, attacks_animals = true, walk_chance = 100, @@ -54,6 +24,7 @@ mobs:register_mob("mobs_mc:enderdragon", { walk_velocity = 6, run_velocity = 6, sounds = { + -- TODO: more sounds shoot_attack = "mobs_mc_ender_dragon_shoot", attack = "mobs_mc_ender_dragon_attack", distance = 60, @@ -62,11 +33,7 @@ mobs:register_mob("mobs_mc:enderdragon", { damage = 10, jump = true, jump_height = 14, - stepheight = 1.2, - jump_chance = 100, - fear_height = 120, fly = true, - fly_in = {"air"}, dogshoot_switch = 1, dogshoot_count_max =5, dogshoot_count2_max = 5, @@ -78,104 +45,53 @@ mobs:register_mob("mobs_mc:enderdragon", { min = 1, max = 1}, }, - water_damage = 0, lava_damage = 0, - light_damage = 0, + fire_damage = 0, on_rightclick = nil, attack_type = "dogshoot", - arrow = "mobs_mc:fireball2", + arrow = "mobs_mc:dragon_fireball", shoot_interval = 0.5, - shoot_offset = -1, + shoot_offset = -1.0, animation = { fly_speed = 8, stand_speed = 8, stand_start = 0, stand_end = 20, walk_start = 0, walk_end = 20, run_start = 0, run_end = 20, }, - blood_amount = 0, + + ignores_nametag = true, }) +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false -mobs:register_arrow("mobs_mc:roar_of_the_dragon2", { +-- dragon fireball (projectile) +mobs:register_arrow("mobs_mc:dragon_fireball", { visual = "sprite", - visual_size = {x = 1, y = 1}, - --textures = {"transparent.png"}, - textures = {"mese_egg.png"}, - velocity = 10, - - on_step = function(self, dtime) - - local pos = self.object:getpos() - - local n = minetest.get_node(pos).name - - if self.timer == 0 then - self.timer = os.time() - end - - if os.time() - self.timer > 8 or minetest.is_protected(pos, "") then - self.object:remove() - end - - local objects = minetest.get_objects_inside_radius(pos, 1) - for _,obj in ipairs(objects) do - local name = obj:get_entity_name() - if name~="mobs_mc:roar_of_the_dragon2" and name ~= "mobs_mc:enderdragon" then - obj:set_hp(obj:get_hp()-0.05) - if (obj:get_hp() <= 0) then - if (not obj:is_player()) and name ~= self.object:get_luaentity().name then - obj:remove() - end - end - end - end - - minetest.set_node(pos, {name="air"}) - if math.random(1,2)==1 then - local dx = math.random(-1,1) - local dy = math.random(-1,1) - local dz = math.random(-1,1) - local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} - minetest.set_node(p, {name="air"}) - end - end -}) ---GOOD LUCK LOL! --- fireball (weapon) -mobs:register_arrow(":mobs_mc:fireball2", { - visual = "sprite", - visual_size = {x = 1.5, y = 1.5}, + visual_size = {x = 1.25, y = 1.25}, textures = {"mobs_mc_dragon_fireball.png"}, - --textures = {"mobs_skeleton2_front.png^[makealpha:255,255,255 "}, velocity = 6, -- direct hit, no fire... just plenty of pain hit_player = function(self, player) - minetest.sound_play("tnt_explode", {pos = player:getpos(), gain = 1.5, max_hear_distance = 2*64}) player:punch(self.object, 1.0, { full_punch_interval = 0.5, - damage_groups = {fleshy = 6}, + damage_groups = {fleshy = 12}, }, nil) - end, hit_mob = function(self, mob) - minetest.sound_play("tnt_explode", {pos = mob:getpos(), gain = 1.5, max_hear_distance = 2*64}) + minetest.sound_play("tnt_explode", {pos = mob:get_pos(), gain = 1.5, max_hear_distance = 2*64}, true) mob:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 12}, }, nil) - end, - -- node hit, bursts into flame + -- node hit, explode hit_node = function(self, pos, node) - mobs:explosion(pos, 3, 0, 1) - --from tnt - minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64}) - + mobs:boom(self, pos, 2) end }) -mobs:register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "mobs_mc_spawn_icon_dragon.png", 0) +mobs:register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "mobs_mc_spawn_icon_dragon.png", 0, true) diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 1161cb00..c159c92f 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -3,40 +3,186 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +-- ENDERMAN BEHAVIOUR: +-- In this game, endermen attack the player on sight, like other monsters do. +-- However, they have a reduced viewing range to make them less dangerous. +-- This differs from MC, in which endermen only become hostile when provoked, +-- and they are provoked by looking directly at them. +-- TODO: Implement MC behaviour. +local S = minetest.get_translator("mobs_mc") --################### --################### ENDERMAN --################### local pr = PseudoRandom(os.time()*(-334)) -local take_frequency = 10 -local place_frequency = 10 + +-- How freqeuntly to take and place blocks, in seconds +local take_frequency_min = 25 +local take_frequency_max = 90 +local place_frequency_min = 10 +local place_frequency_max = 30 + +-- Create the textures table for the enderman, depending on which kind of block +-- the enderman holds (if any). +local create_enderman_textures = function(block_type, itemstring) + local base = "mobs_mc_enderman.png^mobs_mc_enderman_eyes.png" + + --[[ Order of the textures in the texture table: + Flower, 90 degrees + Flower, 45 degrees + Held block, backside + Held block, bottom + Held block, front + Held block, left + Held block, right + Held block, top + Enderman texture (base) + ]] + -- Regular cube + if block_type == "cube" then + local tiles = minetest.registered_nodes[itemstring].tiles + local textures = {} + local last + if mobs_mc.enderman_block_texture_overrides[itemstring] then + -- Texture override available? Use these instead! + textures = mobs_mc.enderman_block_texture_overrides[itemstring] + else + -- Extract the texture names + for i = 1, 6 do + if type(tiles[i]) == "string" then + last = tiles[i] + elseif type(tiles[i]) == "table" then + if tiles[i].name then + last = tiles[i].name + end + end + table.insert(textures, last) + end + end + return { + "blank.png", + "blank.png", + textures[5], + textures[2], + textures[6], + textures[3], + textures[4], + textures[1], + base, -- Enderman texture + } + -- Node of plantlike drawtype, 45° (recommended) + elseif block_type == "plantlike45" then + local textures = minetest.registered_nodes[itemstring].tiles + return { + "blank.png", + textures[1], + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + base, + } + -- Node of plantlike drawtype, 90° + elseif block_type == "plantlike90" then + local textures = minetest.registered_nodes[itemstring].tiles + return { + textures[1], + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + base, + } + elseif block_type == "unknown" then + return { + "blank.png", + "blank.png", + "unknown_node.png", + "unknown_node.png", + "unknown_node.png", + "unknown_node.png", + "unknown_node.png", + "unknown_node.png", + base, -- Enderman texture + } + -- No block held (for initial texture) + elseif block_type == "nothing" or block_type == nil then + return { + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + base, -- Enderman texture + } + end +end + +-- Select a new animation definition. +local select_enderman_animation = function(animation_type) + -- Enderman holds a block + if animation_type == "block" then + return { + walk_speed = 25, + run_speed = 50, + stand_speed = 25, + stand_start = 200, + stand_end = 200, + walk_start = 161, + walk_end = 200, + run_start = 161, + run_end = 200, + punch_start = 121, + punch_end = 160, + } + -- Enderman doesn't hold a block + elseif animation_type == "normal" or animation_type == nil then + return { + walk_speed = 25, + run_speed = 50, + stand_speed = 25, + stand_start = 40, + stand_end = 80, + walk_start = 0, + walk_end = 40, + run_start = 0, + run_end = 40, + punch_start = 81, + punch_end = 120, + } + end +end + +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false mobs:register_mob("mobs_mc:enderman", { + -- TODO: Endermen should be classified as passive type = "monster", - runaway = true, + spawn_class = "passive", + passive = false, pathfinding = 1, - stepheight = 1.2, hp_min = 40, hp_max = 40, collisionbox = {-0.3, -0.01, -0.3, 0.3, 2.89, 0.3}, visual = "mesh", mesh = "mobs_mc_enderman.b3d", - textures = { - {"mobs_mc_enderman.png^(mobs_mc_enderman_eyes.png^[makealpha:0,0,0)"}, - }, + textures = create_enderman_textures(), visual_size = {x=3, y=3}, makes_footstep_sound = true, sounds = { war_cry = "mobs_sandmonster", death = "green_slime_death", - damage = "Creeperdeath", + -- TODO: damage, random distance = 16, }, walk_velocity = 0.2, @@ -49,24 +195,24 @@ mobs:register_mob("mobs_mc:enderman", { min = 0, max = 1,}, }, - animation = { - speed_normal = 25, speed_run = 50, - stand_start = 40, stand_end = 80, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - }, + animation = select_enderman_animation("normal"), _taken_node = "", do_custom = function(self, dtime) + if not mobs_griefing then + return + end -- Take and put nodes - if not self._take_place_timer then + if not self._take_place_timer or not self._next_take_place_time then self._take_place_timer = 0 + self._next_take_place_time = math.random(take_frequency_min, take_frequency_max) return end self._take_place_timer = self._take_place_timer + dtime - if (self._taken_node == nil or self._taken_node == "") and self._take_place_timer >= take_frequency then + if (self._taken_node == nil or self._taken_node == "") and self._take_place_timer >= self._next_take_place_time then -- Take random node self._take_place_timer = 0 - local pos = self.object:getpos() + self._next_take_place_time = math.random(place_frequency_min, place_frequency_max) + local pos = self.object:get_pos() local takable_nodes = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y-1, z=pos.z-2}, {x=pos.x+2, y=pos.y+1, z=pos.z+2}, mobs_mc.enderman_takable) if #takable_nodes >= 1 then local r = pr:next(1, #takable_nodes) @@ -74,36 +220,73 @@ mobs:register_mob("mobs_mc:enderman", { local node = minetest.get_node(take_pos) local dug = minetest.dig_node(take_pos) if dug then - self._taken_node = node.name - -- TODO: Update enderman model (enderman holding block) + if mobs_mc.enderman_replace_on_take[node.name] then + self._taken_node = mobs_mc.enderman_replace_on_take[node.name] + else + self._taken_node = node.name + end local def = minetest.registered_nodes[self._taken_node] + -- Update animation and texture accordingly (adds visibly carried block) + local block_type + -- Cube-shaped + if def.drawtype == "normal" or + def.drawtype == "nodebox" or + def.drawtype == "liquid" or + def.drawtype == "flowingliquid" or + def.drawtype == "glasslike" or + def.drawtype == "glasslike_framed" or + def.drawtype == "glasslike_framed_optional" or + def.drawtype == "allfaces" or + def.drawtype == "allfaces_optional" or + def.drawtype == nil then + block_type = "cube" + elseif def.drawtype == "plantlike" then + -- Flowers and stuff + block_type = "plantlike45" + elseif def.drawtype == "airlike" then + -- Just air + block_type = nil + else + -- Fallback for complex drawtypes + block_type = "unknown" + end + self.base_texture = create_enderman_textures(block_type, self._taken_node) + self.object:set_properties({ textures = self.base_texture }) + self.animation = select_enderman_animation("block") + mobs:set_animation(self, self.animation.current) if def.sounds and def.sounds.dug then - minetest.sound_play(def.sounds.dug, {pos = place_pos, max_hear_distance = 16}) + minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}, true) end end end - elseif self._taken_node ~= nil and self._taken_node ~= "" and self._take_place_timer >= place_frequency then + elseif self._taken_node ~= nil and self._taken_node ~= "" and self._take_place_timer >= self._next_take_place_time then -- Place taken node self._take_place_timer = 0 - local pos = self.object:getpos() + self._next_take_place_time = math.random(take_frequency_min, take_frequency_max) + local pos = self.object:get_pos() local yaw = self.object:get_yaw() -- Place node at looking direction local place_pos = vector.subtract(pos, minetest.facedir_to_dir(minetest.dir_to_facedir(minetest.yaw_to_dir(yaw)))) if minetest.get_node(place_pos).name == "air" then -- ... but only if there's a free space - minetest.place_node(place_pos, {name = self._taken_node}) - local def = minetest.registered_nodes[self._taken_node] - if def.sounds and def.sounds.place then - minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}) + local success = minetest.place_node(place_pos, {name = self._taken_node}) + if success then + local def = minetest.registered_nodes[self._taken_node] + -- Update animation accordingly (removes visible block) + self.animation = select_enderman_animation("normal") + mobs:set_animation(self, self.animation.current) + if def.sounds and def.sounds.place then + minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}, true) + end + self._taken_node = "" end - self._taken_node = "" end end end, -- TODO: Teleport enderman on damage, etc. _do_teleport = function(self) -- Attempt to randomly teleport enderman - local pos = self.object:getpos() + local pos = self.object:get_pos() -- Find all solid nodes below air in a 65×65×65 cuboid centered on the enderman local nodes = minetest.find_nodes_in_area_under_air(vector.subtract(pos, 32), vector.add(pos, 32), {"group:solid", "group:cracky", "group:crumbly"}) local telepos @@ -126,7 +309,7 @@ mobs:register_mob("mobs_mc:enderman", { end end if telepos then - self.object:setpos(telepos) + self.object:set_pos(telepos) end end end, @@ -137,27 +320,20 @@ mobs:register_mob("mobs_mc:enderman", { end end, water_damage = 8, - lava_damage = 4, - light_damage = 0, - view_range = 16, + -- TODO: Increase view range when it detects being seen + -- Low view range to emulate that behaviour somehow + view_range = 4, fear_height = 4, attack_type = "dogfight", - blood_amount = 0, }) -- End spawn -mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 3000, 4, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) +mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 3000, 12, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) -- Overworld spawn -mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 9000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) +mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 19000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- Nether spawn (rare) mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 27500, 4, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) -- spawn eggs mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0) - -if minetest.settings:get_bool("log_mods") then - - minetest.log("action", "MC Enderman loaded") -end - diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index 6c40f8c2..3fb0c1eb 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -2,12 +2,11 @@ --################### ENDERMITE --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:endermite", { type = "monster", + spawn_class = "hostile", passive = false, hp_min = 8, hp_max = 8, @@ -23,18 +22,16 @@ mobs:register_mob("mobs_mc:endermite", { makes_footstep_sound = false, sounds = { random = "mobs_rat", + distance = 16, + -- TODO: more sounds }, walk_velocity = 1, run_velocity = 2, jump = true, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fear_height = 4, view_range = 16, damage = 2, reach = 1, - blood_amount = 0, }) mobs:register_egg("mobs_mc:endermite", S("Endermite"), "mobs_mc_spawn_icon_endermite.png", 0) diff --git a/mods/ENTITIES/mobs_mc/gameconfig.md b/mods/ENTITIES/mobs_mc/gameconfig.md index dabfb935..8394a053 100644 --- a/mods/ENTITIES/mobs_mc/gameconfig.md +++ b/mods/ENTITIES/mobs_mc/gameconfig.md @@ -1,8 +1,8 @@ -# Subgame integration help +# Game integration help -This mod has been designed to make subgame integration rather easy. Ideally, it should be possible to include this mod verbatim in your subgame, with modifications only done by an external mod. +This mod has been designed to make game integration rather easy. Ideally, it should be possible to include this mod verbatim in your game, with modifications only done by an external mod. -To integrate this mod in a subgame, you have to do 2 things: Adding the mod, and adding another mod which tells `mobs_mc` which items to use. The idea is that `mobs_mc` should work with any items. Specifically, these are the steps you need to follow: +To integrate this mod in a game, you have to do 2 things: Adding the mod, and adding another mod which tells `mobs_mc` which items to use. The idea is that `mobs_mc` should work with any items. Specifically, these are the steps you need to follow: * Add the `mobs_mc` mod and its dependencies * Add a mod with name “`mobs_mc_gameconfig`” @@ -21,7 +21,7 @@ Some things to note: * Every override is optional, but explicitly setting all the item overrides is strongly recommended * `mobs_mc` ships many (but not all) items on its own. If not item name override is set, the `mobs_mc` item is used - * You decide whether your subgame defines its own items, outside of `mobs_mc` or if you let `mobs_mc` do the work. + * You decide whether your game defines its own items, outside of `mobs_mc` or if you let `mobs_mc` do the work. * Make sure to avoid duplicate items! * After finishing this, throughly test this * Without `mobs_mc_gameconfig`, the mod assumes Minetest Game items diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index f1200647..2efe56af 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -3,11 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### GHAST @@ -16,6 +12,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:ghast", { type = "monster", + spawn_class = "hostile", pathfinding = 1, group_attack = true, hp_min = 10, @@ -28,11 +25,13 @@ mobs:register_mob("mobs_mc:ghast", { }, visual_size = {x=12, y=12}, sounds = { - shoot = "mobs_fireball", - death = "zombiedeath", - damage = "ghast_damage", + shoot_attack = "mobs_fireball", + death = "mobs_mc_zombie_death", attack = "mobs_fireball", random = "mobs_eerie", + distance = 16, + -- TODO: damage + -- TODO: better death }, walk_velocity = 1.6, run_velocity = 3.2, @@ -41,7 +40,10 @@ mobs:register_mob("mobs_mc:ghast", { chance = 1, min = 0, max = 2,}, - {name = mobs_mc.items.ghast_tear, + -- TODO: drop tear when it's useful + -- ghast tear replaced with gunpowder + --{name = mobs_mc.items.ghast_tear, + {name = mobs_mc.items.gunpowder, chance = 1, min = 0, max = 1,}, @@ -52,17 +54,12 @@ mobs:register_mob("mobs_mc:ghast", { walk_start = 0, walk_end = 40, run_start = 0, run_end = 40, }, - lava_damage = 4, - light_damage = 0, fall_damage = 0, view_range = 100, - --attack_type = "dogshoot", attack_type = "dogshoot", - arrow = "mobs_monster:fireball", + arrow = "mobs_mc:fireball", shoot_interval = 3.5, - shoot_offset = 1, - --'dogshoot_switch' allows switching between shoot and dogfight modes inside dogshoot using timer (1 = shoot, 2 = dogfight) - --'dogshoot_count_max' number of seconds before switching above modes. + shoot_offset = -5, dogshoot_switch = 1, dogshoot_count_max =1, passive = false, @@ -70,40 +67,36 @@ mobs:register_mob("mobs_mc:ghast", { jump_height = 4, floats=1, fly = true, - fly_in = {"air"}, - jump_chance = 98, - fear_height = 120, - blood_amount = 0, }) mobs:spawn_specific("mobs_mc:ghast", mobs_mc.spawn.nether, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 18000, 2, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) --- fireball (weapon) -mobs:register_arrow(":mobs_monster:fireball", { +-- fireball (projectile) +mobs:register_arrow("mobs_mc:fireball", { visual = "sprite", - visual_size = {x = 0.5, y = 0.5}, + visual_size = {x = 1, y = 1}, textures = {"mcl_fire_fire_charge.png"}, - velocity = 6, + velocity = 15, - -- direct hit, no fire... just plenty of pain hit_player = function(self, player) player:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = 8}, + damage_groups = {fleshy = 6}, }, nil) + mobs:boom(self, self.object:get_pos(), 1, true) end, - hit_mob = function(self, player) - player:punch(self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = 8}, + damage_groups = {fleshy = 6}, }, nil) + mobs:boom(self, self.object:get_pos(), 1, true) end, - -- node hit, bursts into flame hit_node = function(self, pos, node) - mobs:explosion(pos, 1, 1, 0) + mobs:boom(self, pos, 1, true) end }) @@ -112,7 +105,3 @@ mobs:register_arrow(":mobs_monster:fireball", { -- spawn eggs mobs:register_egg("mobs_mc:ghast", S("Ghast"), "mobs_mc_spawn_icon_ghast.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Ghast loaded") -end diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index de9cac1d..b5c736c2 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -4,14 +4,14 @@ --################### GUARDIAN --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:guardian", { type = "monster", + spawn_class = "hostile", hp_min = 30, hp_max = 30, + breath_max = -1, passive = false, attack_type = "dogfight", pathfinding = 1, @@ -29,6 +29,7 @@ mobs:register_mob("mobs_mc:guardian", { visual_size = {x=3, y=3}, sounds = { damage = "mobs_mc_squid_hurt", + -- TODO: more and better sounds distance = 16, }, animation = { @@ -38,10 +39,12 @@ mobs:register_mob("mobs_mc:guardian", { run_start = 0, run_end = 20, }, drops = { + -- Greatly increased amounts of prismarine {name = mobs_mc.items.prismarine_shard, chance = 1, min = 0, - max = 2,}, + max = 32,}, + -- TODO: Reduce of drops when ocean monument is ready. -- The following drops are approximations -- Fish / prismarine crystal @@ -52,7 +55,7 @@ mobs:register_mob("mobs_mc:guardian", { {name = mobs_mc.items.prismarine_crystals, chance = 4, min = 1, - max = 1,}, + max = 2,}, -- Rare drop: fish {name = mobs_mc.items.fish_raw, @@ -73,15 +76,14 @@ mobs:register_mob("mobs_mc:guardian", { max = 1,}, }, fly = true, - fly_in = mobs_mc.items.water_source, + fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, + jump = false, view_range = 16, - water_damage = 0, - lava_damage = 4, - light_damage = 0, - blood_amount = 0, }) -mobs:spawn_specific("mobs_mc:guardian", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water - 10) +-- Spawning disabled due to size issues +-- TODO: Re-enable spawning +--mobs:spawn_specific("mobs_mc:guardian", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water - 10) -- spawn eggs mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0) diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index 27e21c45..84f9ddb8 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -4,14 +4,14 @@ --################### GUARDIAN --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:guardian_elder", { type = "monster", + spawn_class = "hostile", hp_min = 80, hp_max = 80, + breath_max = -1, passive = false, attack_type = "dogfight", pathfinding = 1, @@ -29,6 +29,7 @@ mobs:register_mob("mobs_mc:guardian_elder", { visual_size = {x=7, y=7}, sounds = { damage = "mobs_mc_squid_hurt", + -- TODO: more and better sounds distance = 16, }, animation = { @@ -38,10 +39,14 @@ mobs:register_mob("mobs_mc:guardian_elder", { run_start = 0, run_end = 20, }, drops = { + -- TODO: Reduce # of drops when ocean monument is ready. + + -- Greatly increased amounts of prismarine {name = mobs_mc.items.prismarine_shard, chance = 1, - min = 0, - max = 2,}, + min = 1, + max = 64,}, + -- TODO: Only drop if killed by player {name = mobs_mc.items.wet_sponge, chance = 1, @@ -55,9 +60,9 @@ mobs:register_mob("mobs_mc:guardian_elder", { min = 1, max = 1,}, {name = mobs_mc.items.prismarine_crystals, - chance = 4, + chance = 1, min = 1, - max = 1,}, + max = 10,}, -- Rare drop: fish {name = mobs_mc.items.fish_raw, @@ -78,15 +83,14 @@ mobs:register_mob("mobs_mc:guardian_elder", { max = 1,}, }, fly = true, - fly_in = mobs_mc.items.water_source, - water_damage = 0, - lava_damage = 4, - light_damage = 0, + fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, + jump = false, view_range = 16, - blood_amount = 0, }) -mobs:spawn_specific("mobs_mc:guardian_elder", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-18) +-- Spawning disabled due to size issues +-- TODO: Re-enable spawning +-- mobs:spawn_specific("mobs_mc:guardian_elder", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-18) -- spawn eggs mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 7672eb66..664a1ca8 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -3,11 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### HORSE @@ -19,18 +15,23 @@ local horse_extra_texture = function(horse) local saddle = horse._saddle local chest = horse._chest local armor = horse._horse_armor - if armor then - if minetest.get_item_group(armor, "horse_armor") > 0 then - base = base .. "^" .. minetest.registered_items[armor]._horse_overlay_image - end + local textures = {} + if armor and minetest.get_item_group(armor, "horse_armor") > 0 then + textures[2] = base .. "^" .. minetest.registered_items[armor]._horse_overlay_image + else + textures[2] = base end if saddle then - base = base .. "^mobs_mc_horse_saddle.png" + textures[3] = base + else + textures[3] = "blank.png" end if chest then - base = base .. "^mobs_mc_horse_chest.png" + textures[1] = base + else + textures[1] = "blank.png" end - return base + return textures end -- Helper functions to determine equipment rules @@ -46,7 +47,7 @@ end --[[ Generate all possible horse textures. Horse textures are a combination of a base texture and an optional marking overlay. ]] --- The base horse textures +-- The base horse textures (fur) (fur) local horse_base = { "mobs_mc_horse_brown.png", "mobs_mc_horse_darkbrown.png", @@ -54,37 +55,59 @@ local horse_base = { "mobs_mc_horse_gray.png", "mobs_mc_horse_black.png", "mobs_mc_horse_chestnut.png", + "mobs_mc_horse_creamy.png", } -- Horse marking texture overlay, to be appended to the base texture string local horse_markings = { "", -- no markings - "^mobs_mc_horse_markings_whitedots.png", -- snowflake appaloosa - "^mobs_mc_horse_markings_blackdots.png", -- sooty - "^mobs_mc_horse_markings_whitefield.png", -- paint - "^mobs_mc_horse_markings_white.png", -- stockings and blaze + "mobs_mc_horse_markings_whitedots.png", -- snowflake appaloosa + "mobs_mc_horse_markings_blackdots.png", -- sooty + "mobs_mc_horse_markings_whitefield.png", -- paint + "mobs_mc_horse_markings_white.png", -- stockings and blaze } local horse_textures = {} for b=1, #horse_base do for m=1, #horse_markings do - table.insert(horse_textures, { horse_base[b] .. horse_markings[m] }) + local fur = horse_base[b] + if horse_markings[m] ~= "" then + fur = fur .. "^" .. horse_markings[m] + end + table.insert(horse_textures, { + "blank.png", -- chest + fur, -- base texture + markings and optional armor + "blank.png", -- saddle + }) end end -- Horse local horse = { type = "animal", + spawn_class = "passive", visual = "mesh", mesh = "mobs_mc_horse.b3d", visual_size = {x=3.0, y=3.0}, collisionbox = {-0.69825, -0.01, -0.69825, 0.69825, 1.59, 0.69825}, animation = { - stand_speed = 25, walk_speed = 25, run_speed = 50, - stand_start = 0, stand_end = 0, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, + stand_speed = 25, + stand_start = 0, + stand_end = 0, + walk_speed = 25, + walk_start = 0, + walk_end = 40, + run_speed = 50, + run_start = 0, + run_end = 40, }, textures = horse_textures, + sounds = { + random = "mobs_mc_horse_random", + -- TODO: Separate damage sound + damage = "mobs_mc_horse_death", + death = "mobs_mc_horse_death", + distance = 16, + }, fear_height = 4, fly = false, walk_chance = 60, @@ -94,8 +117,6 @@ local horse = { hp_min = 15, hp_max = 30, floats = 1, - lava_damage = 4, - water_damage = 1, makes_footstep_sound = true, jump = true, jump_height = 5.75, -- can clear 2.5 blocks @@ -118,7 +139,7 @@ local horse = { self.max_speed_reverse = 2 self.accel = 6 self.terrain_type = 3 - self.driver_attach_at = {x = 0, y = 7.5, z = -1.75} + self.driver_attach_at = {x = 0, y = 4.17, z = -1.75} self.driver_eye_offset = {x = 0, y = 3, z = 0} self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} end @@ -164,14 +185,36 @@ local horse = { end local item = clicker:get_wielded_item() - if can_breed(self.name) and (item:get_name() == mobs_mc.items.golden_apple or item:get_name() == mobs_mc.items.golden_carrot) then + local iname = item:get_name() + local heal = 0 + if can_breed(self.name) then -- Breed horse with golden apple or golden carrot - if mobs:feed_tame(self, clicker, 1, true, false) then return end + if (iname == mobs_mc.items.golden_apple) then + heal = 10 + elseif (iname == mobs_mc.items.golden_carrot) then + heal = 4 + end + if heal > 0 and mobs:feed_tame(self, clicker, heal, true, false) then + return + end end -- Feed/tame with anything else - -- TODO: Different health bonus for feeding - if mobs:feed_tame(self, clicker, 1, false, true) then return end - if mobs:protect(self, clicker) then return end + if (iname == mobs_mc.items.sugar) then + heal = 1 + elseif (iname == mobs_mc.items.wheat) then + heal = 2 + elseif (iname == mobs_mc.items.apple) then + heal = 3 + elseif (iname == mobs_mc.items.hay_bale) then + heal = 20 + end + if heal > 0 and mobs:feed_tame(self, clicker, heal, false, true) then + return + end + + if mobs:protect(self, clicker) then + return + end -- Make sure tamed horse is mature and being clicked by owner only if self.tamed and not self.child and self.owner == clicker:get_player_name() then @@ -185,7 +228,7 @@ local horse = { -- Put on saddle if tamed elseif not self.driver and not self._saddle - and clicker:get_wielded_item():get_name() == mobs_mc.items.saddle then + and iname == mobs_mc.items.saddle then -- Put on saddle and take saddle from player's inventory local w = clicker:get_wielded_item() @@ -198,31 +241,28 @@ local horse = { -- Update texture if not self._naked_texture then -- Base horse texture without chest or saddle - self._naked_texture = self.base_texture[1] + self._naked_texture = self.base_texture[2] end local tex = horse_extra_texture(self) - self.base_texture = { tex } + self.base_texture = tex self.object:set_properties({textures = self.base_texture}) + minetest.sound_play({name = "mcl_armor_equip_leather"}, {gain=0.5, max_hear_distance=12, pos=self.object:get_pos()}, true) -- Put on horse armor if tamed elseif can_equip_horse_armor(self.name) and not self.driver and not self._horse_armor - and minetest.get_item_group(clicker:get_wielded_item():get_name(), "horse_armor") > 0 then + and minetest.get_item_group(iname, "horse_armor") > 0 then -- Put on armor and take armor from player's inventory + local armor = minetest.get_item_group(iname, "horse_armor") + self._horse_armor = iname local w = clicker:get_wielded_item() - local armor = minetest.get_item_group(w:get_name(), "horse_armor") - self._horse_armor = w:get_name() if not minetest.settings:get_bool("creative_mode") then w:take_item() clicker:set_wielded_item(w) end -- Set horse armor strength - --[[ WARNING: This goes deep into the entity data structure and depends on - how Mobs Redo works internally. This code assumes that Mobs Redo uses - the fleshy group for armor. ]] - -- TODO: Change this code as soon Mobs Redo officially allows to change armor afterwards self.armor = armor local agroups = self.object:get_armor_groups() agroups.fleshy = self.armor @@ -231,12 +271,15 @@ local horse = { -- Update texture if not self._naked_texture then -- Base horse texture without chest or saddle - self._naked_texture = self.base_texture[1] + self._naked_texture = self.base_texture[2] end local tex = horse_extra_texture(self) - self.base_texture = { tex } + self.base_texture = tex self.object:set_properties({textures = self.base_texture}) - + local def = w:get_definition() + if def.sounds and def.sounds._mcl_armor_equip then + minetest.sound_play({name = def.sounds._mcl_armor_equip}, {gain=0.5, max_hear_distance=12, pos=self.object:get_pos()}, true) + end -- Mount horse elseif not self.driver and self._saddle then @@ -245,18 +288,69 @@ local horse = { mobs.attach(self, clicker) -- Used to capture horse - elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then + elseif not self.driver and iname ~= "" then mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end - end + end, + + on_breed = function(parent1, parent2) + local pos = parent1.object:get_pos() + local child = mobs:spawn_child(pos, parent1.name) + if child then + local ent_c = child:get_luaentity() + local p = math.random(1, 2) + local child_texture + -- Randomly pick one of the parents for the child texture + if p == 1 then + if parent1._naked_texture then + child_texture = parent1._naked_texture + else + child_texture = parent1.base_texture[2] + end + else + if parent2._naked_texture then + child_texture = parent2._naked_texture + else + child_texture = parent2.base_texture[2] + end + end + local splt = string.split(child_texture, "^") + if #splt >= 2 then + -- Randomly mutate base texture (fur) and markings + -- with chance of 1/9 each + local base = splt[1] + local markings = splt[2] + local mutate_base = math.random(1, 9) + local mutate_markings = math.random(1, 9) + if mutate_base == 1 then + local b = math.random(1, #horse_base) + base = horse_base[b] + end + if mutate_markings == 1 then + local m = math.random(1, #horse_markings) + markings = horse_markings[m] + end + child_texture = base + if markings ~= "" then + child_texture = child_texture .. "^" .. markings + end + end + ent_c.base_texture = { "blank.png", child_texture, "blank.png" } + ent_c._naked_texture = child_texture + + child:set_properties({textures = ent_c.base_texture}) + return false + end + end, } mobs:register_mob("mobs_mc:horse", horse) -- Skeleton horse local skeleton_horse = table.copy(horse) -skeleton_horse.textures = {{"mobs_mc_horse_skeleton.png"}} +skeleton_horse.breath_max = -1 +skeleton_horse.textures = {{"blank.png", "mobs_mc_horse_skeleton.png", "blank.png"}} skeleton_horse.drops = { {name = mobs_mc.items.bone, chance = 1, @@ -264,17 +358,17 @@ skeleton_horse.drops = { max = 2,}, } skeleton_horse.sounds = { - random = "skeleton1", - death = "skeletondeath", - damage = "skeletonhurt1", + random = "mobs_mc_skeleton_random", + death = "mobs_mc_skeleton_death", + damage = "mobs_mc_skeleton_hurt", distance = 16, } -skeleton_horse.blood_amount = 0 mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse) -- Zombie horse local zombie_horse = table.copy(horse) -zombie_horse.textures = {{"mobs_mc_horse_zombie.png"}} +zombie_horse.breath_max = -1 +zombie_horse.textures = {{"blank.png", "mobs_mc_horse_zombie.png", "blank.png"}} zombie_horse.drops = { {name = mobs_mc.items.rotten_flesh, chance = 1, @@ -282,8 +376,7 @@ zombie_horse.drops = { max = 2,}, } zombie_horse.sounds = { - random = "mobs_mc_zombie_idle", - war_cry = "mobs_mc_zombie_idle", + random = "mobs_mc_zombie_growl", death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, @@ -293,12 +386,14 @@ mobs:register_mob("mobs_mc:zombie_horse", zombie_horse) -- Donkey local d = 0.86 -- donkey scale local donkey = table.copy(horse) -donkey.textures = {{"mobs_mc_donkey.png"}} +donkey.textures = {{"blank.png", "mobs_mc_donkey.png", "blank.png"}} donkey.animation = { speed_normal = 25, stand_start = 0, stand_end = 0, walk_start = 0, walk_end = 40, } +-- TODO: donkey sounds +donkey.sounds = nil donkey.visual_size = { x=horse.visual_size.x*d, y=horse.visual_size.y*d } donkey.collisionbox = { horse.collisionbox[1] * d, @@ -316,8 +411,9 @@ mobs:register_mob("mobs_mc:donkey", donkey) -- Mule local m = 0.94 local mule = table.copy(donkey) -mule.textures = {{"mobs_mc_mule.png"}} +mule.textures = {{"blank.png", "mobs_mc_mule.png", "blank.png"}} mule.visual_size = { x=horse.visual_size.x*m, y=horse.visual_size.y*m } +mule.sounds = horse.sounds mule.collisionbox = { horse.collisionbox[1] * m, horse.collisionbox[2] * m, @@ -330,11 +426,8 @@ mobs:register_mob("mobs_mc:mule", mule) --=========================== --Spawn Function -mobs:spawn_specific("mobs_mc:horse", mobs_mc.spawn.grassland_savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 12, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) -mobs:spawn_specific("mobs_mc:donkey", mobs_mc.spawn.grassland_savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 12, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) - --- compatibility -mobs:alias_mob("mobs:horse", "mobs_mc:horse") +mobs:spawn_specific("mobs_mc:horse", mobs_mc.spawn.grassland_savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 4, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) +mobs:spawn_specific("mobs_mc:donkey", mobs_mc.spawn.grassland_savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 4, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) -- spawn eggs mobs:register_egg("mobs_mc:horse", S("Horse"), "mobs_mc_spawn_icon_horse.png", 0) @@ -342,8 +435,3 @@ mobs:register_egg("mobs_mc:skeleton_horse", S("Skeleton Horse"), "mobs_mc_spawn_ mobs:register_egg("mobs_mc:zombie_horse", S("Zombie Horse"), "mobs_mc_spawn_icon_horse_zombie.png", 0) mobs:register_egg("mobs_mc:donkey", S("Donkey"), "mobs_mc_spawn_icon_donkey.png", 0) mobs:register_egg("mobs_mc:mule", S("Mule"), "mobs_mc_spawn_icon_mule.png", 0) - - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Horse loaded") -end diff --git a/mods/ENTITIES/mobs_mc/init.lua b/mods/ENTITIES/mobs_mc/init.lua index 22d9848e..58006fe9 100644 --- a/mods/ENTITIES/mobs_mc/init.lua +++ b/mods/ENTITIES/mobs_mc/init.lua @@ -38,6 +38,8 @@ dofile(path .. "/3_shared.lua") --Mob heads dofile(path .. "/4_heads.lua") +dofile(path .. "/5_spawn_abm_check.lua") + -- Animals dofile(path .. "/bat.lua") -- Mesh and animation by toby109tt / https://github.com/22i dofile(path .. "/rabbit.lua") -- Mesh and animation byExeterDad @@ -53,12 +55,16 @@ dofile(path .. "/sheep.lua") -- Mesh and animation by Pavel_S dofile(path .. "/wolf.lua") -- KrupnoPavel dofile(path .. "/squid.lua") -- Animation, sound and egg texture by daufinsyd --- NPC +-- NPCs dofile(path .. "/villager.lua") -- KrupnoPavel Mesh and animation by toby109tt / https://github.com/22i ---dofile(path .. "/villager_agent.lua") -- Mesh and animation by toby109tt / https://github.com/22i +-- Agent texture missing +--dofile(path .. "/agent.lua") -- Mesh and animation by toby109tt / https://github.com/22i + +-- Illagers and witch dofile(path .. "/villager_evoker.lua") -- Mesh and animation by toby109tt / https://github.com/22i dofile(path .. "/villager_vindicator.lua") -- Mesh and animation by toby109tt / https://github.com/22i dofile(path .. "/villager_zombie.lua") -- Mesh and animation by toby109tt / https://github.com/22i + dofile(path .. "/witch.lua") -- Mesh and animation by toby109tt / https://github.com/22i --Monsters @@ -80,7 +86,6 @@ dofile(path .. "/skeleton_wither.lua") -- Mesh by Morn76 Animation by Pavel_S dofile(path .. "/zombie.lua") -- Mesh by Morn76 Animation by Pavel_S dofile(path .. "/zombiepig.lua") -- Mesh by Morn76 Animation by Pavel_S dofile(path .. "/slime+magma_cube.lua") -- Wuzzy ---dofile(path .. "/snowman.lua") -- maikerumine Mesh and animation by toby109tt / https://github.com/22i dofile(path .. "/spider.lua") -- Spider by AspireMint (fishyWET (CC-BY-SA 3.0 license for texture) dofile(path .. "/vex.lua") -- KrupnoPavel dofile(path .. "/wither.lua") -- Mesh and animation by toby109tt / https://github.com/22i @@ -93,7 +98,3 @@ COLISIONBOX in minetest press f5 to see where you are looking at then put these --]] -- -- - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "[MOD] Mobs Redo 'MC' loaded") -end diff --git a/mods/ENTITIES/mobs_mc/intllib.lua b/mods/ENTITIES/mobs_mc/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/ENTITIES/mobs_mc/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 0c30e6d6..2ccee2d0 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -3,11 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### IRON GOLEM --################### @@ -16,9 +13,11 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:iron_golem", { type = "npc", + spawn_class = "passive", passive = true, hp_min = 100, hp_max = 100, + breath_max = -1, collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.69, 0.7}, visual = "mesh", mesh = "mobs_mc_iron_golem.b3d", @@ -27,10 +26,7 @@ mobs:register_mob("mobs_mc:iron_golem", { }, visual_size = {x=3, y=3}, makes_footstep_sound = true, - sounds = { - -- TODO - distance = 16, - }, + -- TODO: sounds view_range = 16, stepheight = 1.1, owner = "", @@ -54,9 +50,6 @@ mobs:register_mob("mobs_mc:iron_golem", { min = 0, max = 2,}, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fall_damage = 0, animation = { stand_speed = 15, walk_speed = 15, run_speed = 25, punch_speed = 15, @@ -66,7 +59,6 @@ mobs:register_mob("mobs_mc:iron_golem", { punch_start = 40, punch_end = 50, }, jump = true, - blood_amount = 0, }) @@ -181,7 +173,3 @@ mobs_mc.tools.check_iron_golem_summon = function(pos) end end end - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Iron Golem loaded") -end diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index d689993d..fcb9df73 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -1,29 +1,46 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### LLAMA --################### +local carpets = { + -- group = { carpet , short_texture_name } + unicolor_white = { "mcl_wool:white_carpet", "white" }, + unicolor_dark_orange = { "mcl_wool:brown_carpet", "brown" }, + unicolor_grey = { "mcl_wool:silver_carpet", "light_gray" }, + unicolor_darkgrey = { "mcl_wool:grey_carpet", "gray" }, + unicolor_blue = { "mcl_wool:blue_carpet", "blue" }, + unicolor_dark_green = { "mcl_wool:green_carpet", "green" }, + unicolor_green = { "mcl_wool:lime_carpet", "lime" }, + unicolor_violet = { "mcl_wool:purple_carpet", "purple" }, + unicolor_light_red = { "mcl_wool:pink_carpet", "pink" }, + unicolor_yellow = { "mcl_wool:yellow_carpet", "yellow" }, + unicolor_orange = { "mcl_wool:orange_carpet", "orange" }, + unicolor_red = { "mcl_wool:red_carpet", "red" }, + unicolor_cyan = { "mcl_wool:cyan_carpet", "cyan" }, + unicolor_red_violet = { "mcl_wool:magenta_carpet", "magenta" }, + unicolor_black = { "mcl_wool:black_carpet", "black" }, + unicolor_light_blue = { "mcl_wool:light_blue_carpet", "light_blue" }, +} mobs:register_mob("mobs_mc:llama", { type = "animal", + spawn_class = "passive", hp_min = 15, hp_max = 30, passive = false, collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.86, 0.45}, visual = "mesh", mesh = "mobs_mc_llama.b3d", - textures = {{"mobs_mc_llama.png"},{"mobs_mc_llama_brown.png"},{"mobs_mc_llama_creamy.png"},{"mobs_mc_llama_white.png"},{"mobs_mc_llama_gray.png"}}, + textures = { -- 1: chest -- 2: decor (carpet) -- 3: llama base texture + {"blank.png", "blank.png", "mobs_mc_llama_brown.png"}, + {"blank.png", "blank.png", "mobs_mc_llama_creamy.png"}, + {"blank.png", "blank.png", "mobs_mc_llama_gray.png"}, + {"blank.png", "blank.png", "mobs_mc_llama_white.png"}, + {"blank.png", "blank.png", "mobs_mc_llama.png"}, + -- TODO: Add llama carpet textures (Pixel Perfection seems to use verbatim copy from Minecraft :-( ) + }, visual_size = {x=3, y=3}, makes_footstep_sound = true, runaway = true, @@ -36,9 +53,6 @@ mobs:register_mob("mobs_mc:llama", { min = 0, max = 2,}, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fear_height = 4, sounds = { random = "mobs_mc_llama", @@ -60,7 +74,7 @@ mobs:register_mob("mobs_mc:llama", { look_start = 78, look_end = 108, }, - follow = mobs_mc.items.horse, + follow = mobs_mc.follow.llama, view_range = 16, do_custom = function(self, dtime) @@ -71,7 +85,7 @@ mobs:register_mob("mobs_mc:llama", { self.max_speed_reverse = 2 self.accel = 4 self.terrain_type = 3 - self.driver_attach_at = {x = 0, y = 7.5, z = -1.5} + self.driver_attach_at = {x = 0, y = 4.17, z = -1.5} self.driver_eye_offset = {x = 0, y = 3, z = 0} self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} end @@ -116,7 +130,36 @@ mobs:register_mob("mobs_mc:llama", { -- Make sure tamed llama is mature and being clicked by owner only if self.tamed and not self.child and self.owner == clicker:get_player_name() then - local inv = clicker:get_inventory() + -- Place carpet + if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then + for group, carpetdata in pairs(carpets) do + if minetest.get_item_group(item:get_name(), group) == 1 then + if not minetest.settings:get_bool("creative_mode") then + item:take_item() + clicker:set_wielded_item(item) + end + local substr = carpetdata[2] + local tex_carpet = "mobs_mc_llama_decor_"..substr..".png" + self.base_texture = table.copy(self.base_texture) + self.base_texture[2] = tex_carpet + self.object:set_properties({ + textures = self.base_texture, + }) + self.carpet = item:get_name() + self.drops = { + {name = mobs_mc.items.leather, + chance = 1, + min = 0, + max = 2,}, + {name = item:get_name(), + chance = 1, + min = 1, + max = 1,}, + } + return + end + end + end -- detatch player already riding llama if self.driver and clicker == self.driver then @@ -134,7 +177,29 @@ mobs:register_mob("mobs_mc:llama", { elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end - end + end, + + on_breed = function(parent1, parent2) + -- When breeding, make sure the child has no carpet + local pos = parent1.object:get_pos() + local child, parent + if math.random(1,2) == 1 then + parent = parent1 + else + parent = parent2 + end + child = mobs:spawn_child(pos, parent.name) + if child then + local ent_c = child:get_luaentity() + ent_c.base_texture = table.copy(ent_c.base_texture) + ent_c.base_texture[2] = "blank.png" + child:set_properties({textures = ent_c.base_texture}) + ent_c.tamed = true + ent_c.carpet = nil + ent_c.owner = parent.owner + return false + end + end, }) @@ -143,7 +208,3 @@ mobs:spawn_specific("mobs_mc:llama", mobs_mc.spawn.savanna, {"air"}, 0, minetest -- spawn eggs mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Llama loaded") -end diff --git a/mods/ENTITIES/mobs_mc/locale/de_DE.po b/mods/ENTITIES/mobs_mc/locale/de_DE.po deleted file mode 100644 index 19f346f8..00000000 --- a/mods/ENTITIES/mobs_mc/locale/de_DE.po +++ /dev/null @@ -1,450 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 20:52+0200\n" -"PO-Revision-Date: 2017-07-02 16:20+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: de_DE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: 1_items_default.lua -msgid "Blaze Rod" -msgstr "Lohenrute" - -#: 1_items_default.lua -msgid "This is a crafting component dropped from dead blazes." -msgstr "Dies ist eine Fertigungskomponente, welche von toten Lohen abfällt." - -#: 1_items_default.lua -msgid "Blaze Powder" -msgstr "Lohenstaub" - -#: 1_items_default.lua -msgid "This item is mainly used for brewing potions and crafting." -msgstr "" -"Dieser Gegenstand wird hauptsächlich für die Trankzubereitung und die " -"Fertigung benutzt." - -#: 1_items_default.lua -msgid "Raw Chicken" -msgstr "Rohes Hühnchen" - -#: 1_items_default.lua -msgid "Cooked Chicken" -msgstr "Gebratenes Hühnchen" - -#: 1_items_default.lua -msgid "Feather" -msgstr "Feder" - -#: 1_items_default.lua -msgid "Raw Beef" -msgstr "Rohes Rindfleisch" - -#: 1_items_default.lua -msgid "Steak" -msgstr "Steak" - -#: 1_items_default.lua -msgid "Milk" -msgstr "Milch" - -#: 1_items_default.lua -msgid "Bowl" -msgstr "Schale" - -#: 1_items_default.lua -msgid "Mushroom Stew" -msgstr "Pilzsuppe" - -#: 1_items_default.lua -msgid "Dragon Egg" -msgstr "Drachenei" - -#: 1_items_default.lua -msgid "Eye of Ender" -msgstr "Enderauge" - -#: 1_items_default.lua -msgid "Ghast Tear" -msgstr "Ghastträne" - -#: 1_items_default.lua -msgid "" -"A ghast tear is an item used in potion brewing. It is dropped from dead " -"ghasts." -msgstr "" -"Eine Ghastträne kann für die Trankzubereitung benutzt werden. Sie wird von " -"toten Ghasts abgeworfen." - -#: 1_items_default.lua -msgid "Saddle" -msgstr "Sattel" - -#: 1_items_default.lua -msgid "Iron Horse Armor" -msgstr "Eiserne Pferderüstung" - -#: 1_items_default.lua -msgid "Golden Horse Armor" -msgstr "Goldene Pferderüstung" - -#: 1_items_default.lua -msgid "Diamond Horse Armor" -msgstr "Diamantene Pferderüstung" - -#: 1_items_default.lua -msgid "Raw Porkchop" -msgstr "Rohes Schweinefleisch" - -#: 1_items_default.lua -msgid "Cooked Porkchop" -msgstr "Gebratenes Schweinefleisch" - -#: 1_items_default.lua -msgid "Carrot on a Stick" -msgstr "Karottenrute" - -#: 1_items_default.lua -msgid "Raw Rabbit" -msgstr "Rohes Kaninchen" - -#: 1_items_default.lua -msgid "Cooked Rabbit" -msgstr "Gebratenes Kaninchen" - -#: 1_items_default.lua -msgid "Rabbit Hide" -msgstr "Kaninchenfell" - -#: 1_items_default.lua -msgid "Rabbit's Foot" -msgstr "Hasenpfote" - -#: 1_items_default.lua -msgid "Raw Mutton" -msgstr "Rohes Hammelfleisch" - -#: 1_items_default.lua -msgid "Cooked Mutton" -msgstr "Gebratenes Hammelfleisch" - -#: 1_items_default.lua -msgid "Shulker Shell" -msgstr "Shulkerschale" - -#: 1_items_default.lua -msgid "Magma Cream" -msgstr "Magmacreme" - -#: 1_items_default.lua -msgid "Magma cream is a crafting component." -msgstr "Magmacreme wird zum Fertigen benutzt." - -#: 1_items_default.lua -msgid "Spider Eye" -msgstr "Spinnenauge" - -#: 1_items_default.lua -msgid "" -"Spider eyes are used mainly in crafting and brewing. Spider eyes can be " -"eaten, but they poison you and reduce your health by 2 hit points." -msgstr "" -"Spinnenaugen werden hauptsächlich für die Fertigung und die Trankzubereitung " -"benutzt. Spinnenaugen können gegessen werden, aber sie vergiften Sie und Sie " -"verlieren 2 Trefferpunkte." - -#: 1_items_default.lua -msgid "Totem of Undying" -msgstr "Totem der Unsterblichkeit" - -#: 1_items_default.lua -msgid "Rotten Flesh" -msgstr "Verrottetes Fleisch" - -#: 1_items_default.lua -msgid "Nether Star" -msgstr "Netherstern" - -#: 2_throwing.lua -msgid "Arrow" -msgstr "Pfeil" - -#: 2_throwing.lua -msgid "Bow" -msgstr "Bogen" - -#: 2_throwing.lua -msgid "Egg" -msgstr "Ei" - -#: 2_throwing.lua -msgid "Snowball" -msgstr "Schneeball" - -#: 2_throwing.lua -msgid "" -"Snowballs can be thrown at your enemies. A snowball deals 3 damage to " -"blazes, but is harmless to anything else." -msgstr "" -"Werfen Sie Schnebälle auf Ihre Feinde. Ein Schneeball richtet gegenüber " -"Lohen 3 Schaden an, ist aber harmlos für alles andere." - -#: bat.lua -msgid "Bat" -msgstr "Fledermaus" - -#: blaze.lua -msgid "Blaze" -msgstr "Lohe" - -#: chicken.lua -msgid "Chicken" -msgstr "Huhn" - -#: cow+mooshroom.lua -msgid "Cow" -msgstr "Kuh" - -#: cow+mooshroom.lua -msgid "Mooshroom" -msgstr "Mooshroom" - -#: creeper.lua -msgid "Creeper" -msgstr "Creeper" - -#: ender_dragon.lua -msgid "Ender Dragon" -msgstr "Enderdrache" - -#: enderman.lua -msgid "Enderman" -msgstr "Enderman" - -#: endermite.lua -msgid "Endermite" -msgstr "Endermite" - -#: ghast.lua -msgid "Ghast" -msgstr "Ghast" - -#: guardian_elder.lua -msgid "Elder Guardian" -msgstr "Großer Wächter" - -#: guardian.lua -msgid "Guardian" -msgstr "Wächter" - -#: heads.lua -msgid "Creeper Head (WIP)" -msgstr "Creeperkopf (unfertig)" - -#: heads.lua -msgid "Enderman Head (WIP)" -msgstr "Endermankopf (unfertig)" - -#: heads.lua -msgid "Ghast Head (WIP)" -msgstr "Ghastkopf (unfertig)" - -#: heads.lua -msgid "Skeleton Skull (WIP)" -msgstr "Skelettschädel (unfertig)" - -#: heads.lua -msgid "Wither Skeleton Skull (WIP)" -msgstr "Witherskelettschädel (unfertig)" - -#: heads.lua -msgid "Spider Head (WIP)" -msgstr "Spinnenkopf (unfertig)" - -#: heads.lua -msgid "Zombie Head (WIP)" -msgstr "Zombiekopf (unfertig)" - -#: heads.lua -msgid "Zombie Pigman Head (WIP)" -msgstr "Schweinezombiekopf (unfertig)" - -#: horse.lua -msgid "Horse" -msgstr "Pferd" - -#: horse.lua -msgid "Skeleton Horse" -msgstr "Skelettpferd" - -#: horse.lua -msgid "Zombie Horse" -msgstr "Zombiepferd" - -#: horse.lua -msgid "Donkey" -msgstr "Esel" - -#: horse.lua -msgid "Mule" -msgstr "Maultier" - -#: iron_golem.lua -msgid "Iron Golem" -msgstr "Eisengolem" - -#: llama.lua -msgid "Llama" -msgstr "Lama" - -#: ocelot.lua -msgid "Ocelot" -msgstr "Ozelot" - -#: parrot.lua -msgid "Parrot" -msgstr "Papagei" - -#: pig.lua -msgid "Pig" -msgstr "Schwein" - -#: polar_bear.lua -msgid "Polar Bear" -msgstr "Eisbär" - -#: rabbit.lua -msgid "Rabbit" -msgstr "Kaninchen" - -#: rabbit.lua -msgid "Killer Bunny" -msgstr "Killer-Kaninchen" - -#: sheep.lua -msgid "Sheep" -msgstr "Schaf" - -#: shulker.lua -msgid "Shulker" -msgstr "Shulker" - -#: silverfish.lua -msgid "Silverfish" -msgstr "Silberfischchen" - -#: silverfish.lua -msgid "Stone Monster Egg" -msgstr "Silberfischchen-Stein" - -#: silverfish.lua -msgid "Cobblestone Monster Egg" -msgstr "Silberfischchen-Bruchstein" - -#: silverfish.lua -msgid "Mossy Cobblestone Monster Egg" -msgstr "Bemooster Silberfischchen-Bruchstein" - -#: silverfish.lua -msgid "Stone Brick Monster Egg" -msgstr "Silberfischchen-Steinziegel" - -#: silverfish.lua -msgid "Stone Block Monster Egg" -msgstr "Silberfischchen-Steinblock" - -#: skeleton.lua -msgid "Skeleton" -msgstr "Skelett" - -#: skeleton_stray.lua -msgid "Stray" -msgstr "Eiswanderer" - -#: skeleton_wither.lua -msgid "Wither Skeleton" -msgstr "Witherskelett" - -#: slime+magma_cube.lua -msgid "Magma Cube" -msgstr "Magmawürfel" - -#: slime+magma_cube.lua -msgid "Slime" -msgstr "Schleim" - -#: snowman.lua -msgid "Snow Golem" -msgstr "Schneegolem" - -#: spider.lua -msgid "Spider" -msgstr "Spinne" - -#: spider.lua -msgid "Cave Spider" -msgstr "Höhlenspinne" - -#: squid.lua -msgid "Squid" -msgstr "Tintenfisch" - -#: vex.lua -msgid "Vex" -msgstr "Plagegeist" - -#: villager_evoker.lua -msgid "Evoker" -msgstr "Magier" - -#: villager_illusioner.lua -msgid "Illusioner" -msgstr "Illusionist" - -#: villager.lua -msgid "Villager" -msgstr "Dorfbewohner" - -#: villager_vindicator.lua -msgid "Vindicator" -msgstr "Diener" - -#: villager_zombie.lua -msgid "Zombie Villager" -msgstr "Dorfbewohnerzombie" - -#: witch.lua -msgid "Witch" -msgstr "Hexe" - -#: wither.lua -msgid "Wither" -msgstr "Wither" - -#: wolf.lua -msgid "Wolf" -msgstr "Wolf" - -#: zombie.lua -msgid "Husk" -msgstr "Wüstenzombie" - -#: zombie.lua -msgid "Zombie" -msgstr "Zombie" - -#: zombiepig.lua -msgid "Zombie Pigman" -msgstr "Schweinezombie" diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr new file mode 100644 index 00000000..24d3fa32 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr @@ -0,0 +1,75 @@ +# textdomain: mobs_mc +Totem of Undying=Totem der Unsterblichkeit +A totem of undying is a rare artifact which may safe you from certain death.=Ein Totem der Unsterblichkeit ist ein seltenes Artefakt, dass Sie vor dem sicheren Tod bewahren kann. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Der Totem funktioniert nur, während Sie ihn halten. Wenn Sie normalerweise tödlich hohen Schaden erhalten, werden Sie vor dem Tod bewahrt und Sie erhalten eine zweite Chance mit 1 TP. Der Totem wird dabei zerstört. +Agent=Akteur +Bat=Fledermaus +Blaze=Lohe +Chicken=Huhn +Cow=Kuh +Mooshroom=Pilzkuh +Creeper=Creeper +Ender Dragon=Enderdrache +Enderman=Enderman +Endermite=Endermilbe +Ghast=Ghast +Elder Guardian=Großer Wächter +Guardian=Wächter +Horse=Pferd +Skeleton Horse=Skelettpferd +Zombie Horse=Zombiepferd +Donkey=Esel +Mule=Maultier +Iron Golem=Eisengolem +Llama=Lama +Ocelot=Ozelot +Parrot=Papagei +Pig=Schwein +Polar Bear=Eisbär +Rabbit=Kaninchen +Killer Bunny=Killerkaninchen +Sheep=Schaf +Shulker=Shulker +Silverfish=Silberfischchen +Skeleton=Skelett +Stray=Eiswanderer +Wither Skeleton=Witherskelett +Magma Cube=Magmakubus +Slime=Schleim +Snow Golem=Schneegolem +Spider=Spinne +Cave Spider=Höhlenspinne +Squid=Tintenfisch +Vex=Plagegeist +Evoker=Magier +Illusioner=Illusionist +Villager=Dorfbewohner +Vindicator=Diener +Zombie Villager=Dorfbewohnerzombie +Witch=Hexe +Wither=Wither +Wolf=Wolf +Husk=Wüstenzombie +Zombie=Zombie +Zombie Pigman=Schweinezombie +Iron Horse Armor=Eisenpferderüstung +Iron horse armor can be worn by horses to increase their protection from harm a bit.=Eine Eisenpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden etwas zu erhöhen. +Golden Horse Armor=Goldpferderüstung +Golden horse armor can be worn by horses to increase their protection from harm.=Eine Goldpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden zu erhöhen. +Diamond Horse Armor=Diamantpferderüstung +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Eine Diamantpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden beträchtlich zu erhöhen. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Platzieren Sie es auf einem Pferd, um die Pferderüstung aufzusetzen. Esel und Maultiere können keine Pferderüstung tragen. +Farmer=Bauer +Fisherman=Fischer +Fletcher=Pfeilmacher +Shepherd=Schäfer +Librarian=Bibliothekar +Cartographer=Kartograph +Armorer=Rüstungsschmied +Leatherworker=Lederarbeiter +Butcher=Metzger +Weapon Smith=Waffenschmied +Tool Smith=Werkzeugschmied +Cleric=Priester +Nitwit=Dorftrottel +Protects you from death while wielding it=Schützt vor dem Tod, wenn es gehalten wird diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr new file mode 100644 index 00000000..240e7759 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr @@ -0,0 +1,74 @@ +# textdomain: mobs_mc +Totem of Undying=Tótem de la inmortalidad +A totem of undying is a rare artifact which may safe you from certain death.=Un tótem de la inmortalidad es un artefacto raro que puede salvarte de una muerte segura. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=El tótem solo funciona mientras lo sostienes en tu mano. Si recibes un daño crítico, no mueres y obtienes una segunda oportunidad con 1 HP. Sin embargo, el tótem se destruye en el proceso. +Agent=Agente +Bat=Murciélago +Blaze=Blaze +Chicken=Pollo +Cow=Vaca +Mooshroom=Champiñaca +Creeper=Creeper +Ender Dragon=Enderdragón +Enderman=Enderman +Endermite=Endermite +Ghast=Ghast +Elder Guardian=Gran guardián +Guardian=Guardián +Horse=Caballo +Skeleton Horse=Caballo esquelético +Zombie Horse=Caballo zombie +Donkey=Burro +Mule=Mula +Iron Golem=Golem de hierro +Llama=Llama +Ocelot=Ocelote +Parrot=Loro +Pig=Cerdo +Polar Bear=Oso polar +Rabbit=Conejo +Killer Bunny=Conejo asesino +Sheep=Oveja +Shulker=Shulker +Silverfish=Lepisma +Skeleton=Esqueleto +Stray=Esqueleto +Wither Skeleton=Esqueleto wither +Magma Cube=Cubo de Magma +Slime=Slime +Snow Golem=Golem de nieve +Spider=Araña +Cave Spider=Araña de las cuevas +Squid=Calamar +Vex=Ánima +Evoker=Invocador +Illusioner=Illusionista +Villager=Aldeano +Vindicator=Vindicador +Zombie Villager=Aldeano zombie +Witch=Bruja +Wither=Wither +Wolf=Lobo +Husk=Husk +Zombie=Zombie +Zombie Pigman=Cerdo Zombie +Iron Horse Armor=Armadura de hierro para caballo +Iron horse armor can be worn by horses to increase their protection from harm a bit.=Los caballos pueden usar armadura de caballo de hierro para aumentar un poco su protección contra el daño. +Golden Horse Armor=Armadura de oro para caballo +Golden horse armor can be worn by horses to increase their protection from harm.=Los caballos pueden usar armadura de caballo de oro para aumentar su protección contra el daño. +Diamond Horse Armor=Armadura de diamante para caballo +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Los caballos pueden usar armadura de caballo de diamante para aumentar en gran medida su protección contra el daño. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Colóquelo en un caballo para ponerle la armadura de caballo. Los burros y las mulas no pueden usar armadura de caballo. +Farmer=Granjero +Fisherman=Pescador +Fletcher=Flechador +Shepherd=Sacerdote +Librarian=Bibliotecario +Cartographer=Cartógrafo +Armorer=Armero +Leatherworker=Peletero +Butcher=Carnicero +Weapon Smith=Herrero de Armas +Tool Smith=Herrero de Herramientas +Cleric=Sacerdote +Nitwit=Simple diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr new file mode 100644 index 00000000..ff1e2b9c --- /dev/null +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr @@ -0,0 +1,75 @@ +# textdomain: mobs_mc +Totem of Undying=Totem d'immortalité +A totem of undying is a rare artifact which may safe you from certain death.=Un totem d'immortalité est un artefact rare qui peut vous protéger d'une mort certaine. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Le totem ne fonctionne que lorsque vous le tenez dans votre main. Si vous recevez des dégâts mortels, vous êtes sauvé de la mort et vous obtenez une seconde chance avec 1 HP. Cependant, le totem est détruit. +Agent=Agent +Bat=Chauve-souris +Blaze=Blaze +Chicken=Poulet +Cow=Vache +Mooshroom=Champimeuh +Creeper=Creeper +Ender Dragon=Ender Dragon +Enderman=Enderman +Endermite=Endermite +Ghast=Ghast +Elder Guardian=Gardien de l'Elder +Guardian=Gardien +Horse=Cheval +Skeleton Horse=Cheval-squelette +Zombie Horse=Cheval-zombie +Donkey=Âne +Mule=Mule +Iron Golem=Golem de fer +Llama=Lama +Ocelot=Ocelot +Parrot=Perroquet +Pig=Cochon +Polar Bear=Ours blanc +Rabbit=Lapin +Killer Bunny=Lapin tueur +Sheep=Mouton +Shulker=Shulker +Silverfish=Poisson d'argent +Skeleton=Squelette +Stray=Vagabond +Wither Skeleton=Wither squelette +Magma Cube=Cube de magma +Slime=Slime +Snow Golem=Golem de neige +Spider=Araignée +Cave Spider=Araignée venimeuse +Squid=Poulpe +Vex=Vex +Evoker=Invocateur +Illusioner=Illusionniste +Villager=Villageois +Vindicator=Vindicateur +Zombie Villager=Zombie Villageois +Witch=Sorcière +Wither=Wither +Wolf=Loup +Husk=Zombie Momifié +Zombie=Zombie +Zombie Pigman=Zombie Cochon +Iron Horse Armor=Armure de cheval en fer +Iron horse armor can be worn by horses to increase their protection from harm a bit.=L'armure de cheval en fer peut être portée par les chevaux pour augmenter un peu leur protection contre les dommages. +Golden Horse Armor=Armure de cheval en or +Golden horse armor can be worn by horses to increase their protection from harm.=Une armure de cheval en or peut être portée par les chevaux pour augmenter leur protection contre les dommages. +Diamond Horse Armor=Armure de cheval en diamant +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Une armure de cheval en diament peut être portée par les chevaux pour augmenter fortement leur protection contre les dommages. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Placez-la sur un cheval pour mettre l'armure de cheval. Les ânes et les mules ne peuvent pas porter d'armure de cheval. +Farmer=Fermier +Fisherman=Pêcheur +Fletcher=Archer +Shepherd=Berger +Librarian=Bibliothécaire +Cartographer=Cartographe +Armorer=Armurier +Leatherworker=Tanneur +Butcher=Boucher +Weapon Smith=Fabriquant d'arme +Tool Smith=Fabriquant d'outil +Cleric=Clerc +Nitwit=Crétin +Protects you from death while wielding it=Vous protège de la mort en la maniant diff --git a/mods/ENTITIES/mobs_mc/locale/template.pot b/mods/ENTITIES/mobs_mc/locale/template.pot deleted file mode 100644 index 3b9f2cc5..00000000 --- a/mods/ENTITIES/mobs_mc/locale/template.pot +++ /dev/null @@ -1,440 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 20:52+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=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: 1_items_default.lua -msgid "Blaze Rod" -msgstr "" - -#: 1_items_default.lua -msgid "This is a crafting component dropped from dead blazes." -msgstr "" - -#: 1_items_default.lua -msgid "Blaze Powder" -msgstr "" - -#: 1_items_default.lua -msgid "This item is mainly used for brewing potions and crafting." -msgstr "" - -#: 1_items_default.lua -msgid "Raw Chicken" -msgstr "" - -#: 1_items_default.lua -msgid "Cooked Chicken" -msgstr "" - -#: 1_items_default.lua -msgid "Feather" -msgstr "" - -#: 1_items_default.lua -msgid "Raw Beef" -msgstr "" - -#: 1_items_default.lua -msgid "Steak" -msgstr "" - -#: 1_items_default.lua -msgid "Milk" -msgstr "" - -#: 1_items_default.lua -msgid "Bowl" -msgstr "" - -#: 1_items_default.lua -msgid "Mushroom Stew" -msgstr "" - -#: 1_items_default.lua -msgid "Dragon Egg" -msgstr "" - -#: 1_items_default.lua -msgid "Eye of Ender" -msgstr "" - -#: 1_items_default.lua -msgid "Ghast Tear" -msgstr "" - -#: 1_items_default.lua -msgid "" -"A ghast tear is an item used in potion brewing. It is dropped from dead " -"ghasts." -msgstr "" - -#: 1_items_default.lua -msgid "Saddle" -msgstr "" - -#: 1_items_default.lua -msgid "Iron Horse Armor" -msgstr "" - -#: 1_items_default.lua -msgid "Golden Horse Armor" -msgstr "" - -#: 1_items_default.lua -msgid "Diamond Horse Armor" -msgstr "" - -#: 1_items_default.lua -msgid "Raw Porkchop" -msgstr "" - -#: 1_items_default.lua -msgid "Cooked Porkchop" -msgstr "" - -#: 1_items_default.lua -msgid "Carrot on a Stick" -msgstr "" - -#: 1_items_default.lua -msgid "Raw Rabbit" -msgstr "" - -#: 1_items_default.lua -msgid "Cooked Rabbit" -msgstr "" - -#: 1_items_default.lua -msgid "Rabbit Hide" -msgstr "" - -#: 1_items_default.lua -msgid "Rabbit's Foot" -msgstr "" - -#: 1_items_default.lua -msgid "Raw Mutton" -msgstr "" - -#: 1_items_default.lua -msgid "Cooked Mutton" -msgstr "" - -#: 1_items_default.lua -msgid "Shulker Shell" -msgstr "" - -#: 1_items_default.lua -msgid "Magma Cream" -msgstr "" - -#: 1_items_default.lua -msgid "Magma cream is a crafting component." -msgstr "" - -#: 1_items_default.lua -msgid "Spider Eye" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Spider eyes are used mainly in crafting and brewing. Spider eyes can be " -"eaten, but they poison you and reduce your health by 2 hit points." -msgstr "" - -#: 1_items_default.lua -msgid "Totem of Undying" -msgstr "" - -#: 1_items_default.lua -msgid "Rotten Flesh" -msgstr "" - -#: 1_items_default.lua -msgid "Nether Star" -msgstr "" - -#: 2_throwing.lua -msgid "Arrow" -msgstr "" - -#: 2_throwing.lua -msgid "Bow" -msgstr "" - -#: 2_throwing.lua -msgid "Egg" -msgstr "" - -#: 2_throwing.lua -msgid "Snowball" -msgstr "" - -#: 2_throwing.lua -msgid "" -"Snowballs can be thrown at your enemies. A snowball deals 3 damage to " -"blazes, but is harmless to anything else." -msgstr "" - -#: bat.lua -msgid "Bat" -msgstr "" - -#: blaze.lua -msgid "Blaze" -msgstr "" - -#: chicken.lua -msgid "Chicken" -msgstr "" - -#: cow+mooshroom.lua -msgid "Cow" -msgstr "" - -#: cow+mooshroom.lua -msgid "Mooshroom" -msgstr "" - -#: creeper.lua -msgid "Creeper" -msgstr "" - -#: ender_dragon.lua -msgid "Ender Dragon" -msgstr "" - -#: enderman.lua -msgid "Enderman" -msgstr "" - -#: endermite.lua -msgid "Endermite" -msgstr "" - -#: ghast.lua -msgid "Ghast" -msgstr "" - -#: guardian_elder.lua -msgid "Elder Guardian" -msgstr "" - -#: guardian.lua -msgid "Guardian" -msgstr "" - -#: heads.lua -msgid "Creeper Head (WIP)" -msgstr "" - -#: heads.lua -msgid "Enderman Head (WIP)" -msgstr "" - -#: heads.lua -msgid "Ghast Head (WIP)" -msgstr "" - -#: heads.lua -msgid "Skeleton Skull (WIP)" -msgstr "" - -#: heads.lua -msgid "Wither Skeleton Skull (WIP)" -msgstr "" - -#: heads.lua -msgid "Spider Head (WIP)" -msgstr "" - -#: heads.lua -msgid "Zombie Head (WIP)" -msgstr "" - -#: heads.lua -msgid "Zombie Pigman Head (WIP)" -msgstr "" - -#: horse.lua -msgid "Horse" -msgstr "" - -#: horse.lua -msgid "Skeleton Horse" -msgstr "" - -#: horse.lua -msgid "Zombie Horse" -msgstr "" - -#: horse.lua -msgid "Donkey" -msgstr "" - -#: horse.lua -msgid "Mule" -msgstr "" - -#: iron_golem.lua -msgid "Iron Golem" -msgstr "" - -#: llama.lua -msgid "Llama" -msgstr "" - -#: ocelot.lua -msgid "Ocelot" -msgstr "" - -#: parrot.lua -msgid "Parrot" -msgstr "" - -#: pig.lua -msgid "Pig" -msgstr "" - -#: polar_bear.lua -msgid "Polar Bear" -msgstr "" - -#: rabbit.lua -msgid "Rabbit" -msgstr "" - -#: rabbit.lua -msgid "Killer Bunny" -msgstr "" - -#: sheep.lua -msgid "Sheep" -msgstr "" - -#: shulker.lua -msgid "Shulker" -msgstr "" - -#: silverfish.lua -msgid "Silverfish" -msgstr "" - -#: silverfish.lua -msgid "Stone Monster Egg" -msgstr "" - -#: silverfish.lua -msgid "Cobblestone Monster Egg" -msgstr "" - -#: silverfish.lua -msgid "Mossy Cobblestone Monster Egg" -msgstr "" - -#: silverfish.lua -msgid "Stone Brick Monster Egg" -msgstr "" - -#: silverfish.lua -msgid "Stone Block Monster Egg" -msgstr "" - -#: skeleton.lua -msgid "Skeleton" -msgstr "" - -#: skeleton_stray.lua -msgid "Stray" -msgstr "" - -#: skeleton_wither.lua -msgid "Wither Skeleton" -msgstr "" - -#: slime+magma_cube.lua -msgid "Magma Cube" -msgstr "" - -#: slime+magma_cube.lua -msgid "Slime" -msgstr "" - -#: snowman.lua -msgid "Snow Golem" -msgstr "" - -#: spider.lua -msgid "Spider" -msgstr "" - -#: spider.lua -msgid "Cave Spider" -msgstr "" - -#: squid.lua -msgid "Squid" -msgstr "" - -#: vex.lua -msgid "Vex" -msgstr "" - -#: villager_evoker.lua -msgid "Evoker" -msgstr "" - -#: villager_illusioner.lua -msgid "Illusioner" -msgstr "" - -#: villager.lua -msgid "Villager" -msgstr "" - -#: villager_vindicator.lua -msgid "Vindicator" -msgstr "" - -#: villager_zombie.lua -msgid "Zombie Villager" -msgstr "" - -#: witch.lua -msgid "Witch" -msgstr "" - -#: wither.lua -msgid "Wither" -msgstr "" - -#: wolf.lua -msgid "Wolf" -msgstr "" - -#: zombie.lua -msgid "Husk" -msgstr "" - -#: zombie.lua -msgid "Zombie" -msgstr "" - -#: zombiepig.lua -msgid "Zombie Pigman" -msgstr "" diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt new file mode 100644 index 00000000..04ba9e46 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/locale/template.txt @@ -0,0 +1,75 @@ +# textdomain: mobs_mc +Totem of Undying= +A totem of undying is a rare artifact which may safe you from certain death.= +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.= +Agent= +Bat= +Blaze= +Chicken= +Cow= +Mooshroom= +Creeper= +Ender Dragon= +Enderman= +Endermite= +Ghast= +Elder Guardian= +Guardian= +Horse= +Skeleton Horse= +Zombie Horse= +Donkey= +Mule= +Iron Golem= +Llama= +Ocelot= +Parrot= +Pig= +Polar Bear= +Rabbit= +Killer Bunny= +Sheep= +Shulker= +Silverfish= +Skeleton= +Stray= +Wither Skeleton= +Magma Cube= +Slime= +Snow Golem= +Spider= +Cave Spider= +Squid= +Vex= +Evoker= +Illusioner= +Villager= +Vindicator= +Zombie Villager= +Witch= +Wither= +Wolf= +Husk= +Zombie= +Zombie Pigman= +Iron Horse Armor= +Iron horse armor can be worn by horses to increase their protection from harm a bit.= +Golden Horse Armor= +Golden horse armor can be worn by horses to increase their protection from harm.= +Diamond Horse Armor= +Diamond horse armor can be worn by horses to greatly increase their protection from harm.= +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.= +Farmer= +Fisherman= +Fletcher= +Shepherd= +Librarian= +Cartographer= +Armorer= +Leatherworker= +Butcher= +Weapon Smith= +Tool Smith= +Cleric= +Nitwit= +Protects you from death while wielding it= diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d index 5d481aee..9ab4fc10 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d index 641b7e4a..2f13ba9c 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d index 47f19fbd..bfeb5a6b 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d index ac922599..30f42632 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_guardian.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_guardian.b3d index 853b41e0..d1fed68b 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_guardian.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_guardian.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d index 1154298e..613cb5ed 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_illusioner.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_illusioner.b3d index ed0ae9d2..7bb719ff 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_illusioner.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_illusioner.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_iron_golem.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_iron_golem.b3d index dd1a9860..a7fbd352 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_iron_golem.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_iron_golem.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_llama.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_llama.b3d index cbcf1a6d..5d6dd6b3 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_llama.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_llama.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_pig.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_pig.b3d index 0742cd5a..8ba5b6a8 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_pig.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_pig.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_polarbear.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_polarbear.b3d index bd8c734f..bb64b2b7 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_polarbear.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_polarbear.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_rabbit.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_rabbit.b3d index 3a9acff5..ad2067d7 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_rabbit.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_rabbit.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheep.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_sheep.b3d deleted file mode 100644 index 34dd9d53..00000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheep.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d index 34dd9d53..1db15ddb 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepnaked.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepnaked.b3d deleted file mode 100644 index 78c9ea24..00000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepnaked.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_silverfish.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_silverfish.b3d index b3d76147..b550d563 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_silverfish.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_silverfish.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d index a5f007cf..be4094c1 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d index 4cc5a590..d399ff72 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_spider.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_spider.b3d index fb55e49e..aec461a6 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_spider.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_spider.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_squid.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_squid.b3d index fe126553..887576b2 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_squid.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_squid.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_stray.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_stray.b3d index aab6342f..c8eefe03 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_stray.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_stray.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d index b6f79b45..f52772dd 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d index 0d974d55..1b92adfa 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_zvillager.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_villager_zombie.b3d similarity index 52% rename from mods/ENTITIES/mobs_mc/models/mobs_mc_zvillager.b3d rename to mods/ENTITIES/mobs_mc/models/mobs_mc_villager_zombie.b3d index 76391dc7..9958b281 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_zvillager.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_villager_zombie.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_vindicator.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_vindicator.b3d index 17e779b7..ae14e8ed 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_vindicator.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_vindicator.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_wither.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_wither.b3d index 32a24248..4669f3eb 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_wither.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_wither.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d index 2ca3646d..6f78392f 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_wolf.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_wolf.b3d index 9abd31a0..63db5e09 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_wolf.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_wolf.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie.b3d index 369722dc..f357f68b 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie.b3d differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d index 7ddfa2c7..0b9f4f7c 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d differ diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index e1c11e8c..5a9525a0 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -3,9 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### OCELOT AND CAT @@ -30,6 +28,8 @@ end -- Ocelot local ocelot = { type = "animal", + spawn_class = "passive", + can_despawn = true, hp_min = 10, hp_max = 10, collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.69, 0.3}, @@ -43,24 +43,26 @@ local ocelot = { run_velocity = 3, floats = 1, runaway = true, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fall_damage = 0, fear_height = 4, sounds = { - random = "mobs_kitten", + damage = "mobs_mc_ocelot_hurt", + death = "mobs_mc_ocelot_hurt", distance = 16, }, animation = { - speed_normal = 25, speed_run = 50, - stand_start = 0, stand_end = 0, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, + speed_normal = 25, + speed_run = 50, + stand_start = 0, + stand_end = 0, + walk_start = 0, + walk_end = 40, + run_start = 0, + run_end = 40, }, follow = mobs_mc.follow.ocelot, view_range = 12, - passive = false, + passive = true, attack_type = "dogfight", pathfinding = 1, damage = 2, @@ -79,7 +81,7 @@ local ocelot = { -- 1/3 chance of getting tamed if pr:next(1, 3) == 1 then local yaw = self.object:get_yaw() - local cat = minetest.add_entity(self.object:getpos(), "mobs_mc:cat") + local cat = minetest.add_entity(self.object:get_pos(), "mobs_mc:cat") cat:set_yaw(yaw) local ent = cat:get_luaentity() ent.owner = clicker:get_player_name() @@ -97,6 +99,7 @@ mobs:register_mob("mobs_mc:ocelot", ocelot) -- Cat local cat = table.copy(ocelot) cat.textures = {{"mobs_mc_cat_black.png"}, {"mobs_mc_cat_red.png"}, {"mobs_mc_cat_siamese.png"}} +cat.can_despawn = false cat.owner = "" cat.order = "roam" -- "sit" or "roam" cat.owner_loyal = true @@ -104,6 +107,12 @@ cat.tamed = true cat.runaway = false -- Automatically teleport cat to owner cat.do_custom = mobs_mc.make_owner_teleport_function(12) +cat.sounds = { + random = "mobs_mc_cat_idle", + damage = "mobs_mc_cat_hiss", + death = "mobs_mc_ocelot_hurt", + distance = 16, +} cat.on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, false) then return end if mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end @@ -193,13 +202,6 @@ mobs:spawn({ end, }) --- compatibility -mobs:alias_mob("mobs:kitten", "mobs_mc:ocelot") - -- spawn eggs -- FIXME: The spawn icon shows a cat texture, not an ocelot texture mobs:register_egg("mobs_mc:ocelot", S("Ocelot"), "mobs_mc_spawn_icon_cat.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Ocelot loaded") -end diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index e030d16f..080bddd4 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -3,12 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### PARROT @@ -18,6 +13,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:parrot", { type = "npc", + spawn_class = "passive", pathfinding = 1, hp_min = 6, hp_max = 6, @@ -29,6 +25,7 @@ mobs:register_mob("mobs_mc:parrot", { makes_footstep_sound = true, walk_velocity = 3, run_velocity = 5, + -- TODO: sounds drops = { {name = mobs_mc.items.feather, chance = 1, @@ -48,9 +45,6 @@ mobs:register_mob("mobs_mc:parrot", { --fly_end = 45, }, walk_chance = 100, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fall_damage = 0, fall_speed = -2.25, attack_type = "dogfight", @@ -59,7 +53,6 @@ mobs:register_mob("mobs_mc:parrot", { floats = 1, physical = true, fly = true, - fly_in = {"air"}, fear_height = 4, view_range = 16, follow = mobs_mc.follow.parrot, @@ -87,13 +80,9 @@ mobs:register_mob("mobs_mc:parrot", { }) ---spawn --- TODO: Increase spawn chance if polished +-- Spawn disabled because parrots are not very smart. +-- TODO: Re-enable when parrots are finished --mobs:spawn_specific("mobs_mc:parrot", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 30000, 1, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Parrot loaded") -end +mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0, true) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 05481544..05e6a085 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -1,20 +1,21 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:pig", { type = "animal", + spawn_class = "passive", runaway = true, hp_min = 10, hp_max = 10, collisionbox = {-0.45, -0.01, -0.45, 0.45, 0.865, 0.45}, visual = "mesh", mesh = "mobs_mc_pig.b3d", - textures = { - {"mobs_mc_pig.png"}, - }, + textures = {{ + "blank.png", -- baby + "mobs_mc_pig.png", -- base + "blank.png", -- saddle + }}, visual_size = {x=2.5, y=2.5}, makes_footstep_sound = true, walk_velocity = 1, @@ -25,9 +26,6 @@ mobs:register_mob("mobs_mc:pig", { min = 1, max = 3,}, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fear_height = 4, sounds = { random = "mobs_pig", @@ -36,19 +34,15 @@ mobs:register_mob("mobs_mc:pig", { distance = 16, }, animation = { - speed_normal = 40, + stand_speed = 40, + walk_speed = 40, + run_speed = 50, stand_start = 0, stand_end = 0, walk_start = 0, walk_end = 40, - hurt_start = 118, - hurt_end = 154, - death_start = 154, - death_end = 179, - eat_start = 49, - eat_end = 78, - look_start = 78, - look_end = 108, + run_start = 0, + run_end = 40, }, follow = mobs_mc.follow.pig, view_range = 5, @@ -61,7 +55,7 @@ mobs:register_mob("mobs_mc:pig", { self.max_speed_reverse = 2 self.accel = 4 self.terrain_type = 3 - self.driver_attach_at = {x = 0.0, y = 6.75, z = -1.5} + self.driver_attach_at = {x = 0.0, y = 2.75, z = -1.5} self.driver_eye_offset = {x = 0, y = 3, z = 0} self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} end @@ -106,7 +100,11 @@ mobs:register_mob("mobs_mc:pig", { -- Put saddle on pig local item = clicker:get_wielded_item() if item:get_name() == mobs_mc.items.saddle and self.saddle ~= "yes" then - self.base_texture = {"mobs_mc_pig.png^mobs_mc_pig_saddle.png"} + self.base_texture = { + "blank.png", -- baby + "mobs_mc_pig.png", -- base + "mobs_mc_pig_saddle.png", -- saddle + } self.object:set_properties({ textures = self.base_texture }) @@ -128,6 +126,7 @@ mobs:register_mob("mobs_mc:pig", { stack:take_item() inv:set_stack("main", clicker:get_wield_index(), stack) end + minetest.sound_play({name = "mcl_armor_equip_leather"}, {gain=0.5, max_hear_distance=8, pos=self.object:get_pos()}, true) return end @@ -151,7 +150,7 @@ mobs:register_mob("mobs_mc:pig", { -- Break carrot on a stick local def = wielditem:get_definition() if def.sounds and def.sounds.breaks then - minetest.sound_play(def.sounds.breaks, {pos = clicker:getpos(), max_hear_distance = 8, gain = 0.5}) + minetest.sound_play(def.sounds.breaks, {pos = clicker:get_pos(), max_hear_distance = 8, gain = 0.5}, true) end wielditem = {name = mobs_mc.items.fishing_rod, count = 1} else @@ -166,17 +165,20 @@ mobs:register_mob("mobs_mc:pig", { mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end, + + on_breed = function(parent1, parent2) + local pos = parent1.object:get_pos() + local child = mobs:spawn_child(pos, parent1.name) + if child then + local ent_c = child:get_luaentity() + ent_c.tamed = true + ent_c.owner = parent1.owner + return false + end + end, }) -mobs:spawn_specific("mobs_mc:pig", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 15000, 30, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) - --- compatibility -mobs:alias_mob("mobs:pig", "mobs_mc:pig") +mobs:spawn_specific("mobs_mc:pig", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 15000, 8, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn eggs mobs:register_egg("mobs_mc:pig", S("Pig"), "mobs_mc_spawn_icon_pig.png", 0) - - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Pig loaded") -end diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 8028655a..fd1eaa1c 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -1,10 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### POLARBEAR @@ -13,11 +9,12 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:polar_bear", { type = "animal", + spawn_class = "passive", runaway = false, passive = false, - stepheight = 1.2, hp_min = 30, hp_max = 30, + breath_max = -1, collisionbox = {-0.7, -0.01, -0.7, 0.7, 1.39, 0.7}, visual = "mesh", mesh = "mobs_mc_polarbear.b3d", @@ -45,15 +42,9 @@ mobs:register_mob("mobs_mc:polar_bear", { max = 2,}, }, - water_damage = 0, floats = 1, - lava_damage = 5, - light_damage = 0, fear_height = 4, - sounds = { - random = "Cowhurt1", -- TODO: Replace - distance = 16, - }, + -- TODO: sounds animation = { speed_normal = 25, speed_run = 50, stand_start = 0, stand_end = 0, @@ -65,16 +56,7 @@ mobs:register_mob("mobs_mc:polar_bear", { }) --- compatibility -mobs:alias_mob("mobs_mc:polarbear", "mobs_mc:polar_bear") - - mobs:spawn_specific("mobs_mc:polar_bear", mobs_mc.spawn.snow, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 7000, 3, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn egg mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "mobs_mc_spawn_icon_polarbear.png", 0) - - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Polar Bear loaded") -end diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 5e1b2b52..ef7b702b 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -1,11 +1,10 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") local rabbit = { type = "animal", + spawn_class = "passive", passive = true, reach = 1, @@ -24,7 +23,7 @@ local rabbit = { {"mobs_mc_rabbit_black.png"}, }, visual_size = {x=1.5, y=1.5}, - sounds = {}, + -- TODO: sounds: random, damage, death makes_footstep_sound = false, walk_velocity = 1, run_velocity = 3.7, @@ -34,11 +33,9 @@ local rabbit = { drops = { {name = mobs_mc.items.rabbit_raw, chance = 1, min = 0, max = 1}, {name = mobs_mc.items.rabbit_hide, chance = 1, min = 0, max = 1}, - {name = mobs_mc.items.rabbit_foot, chance = 10, min = 1, max = 1}, + -- TODO: Drop rabbit's foot when it's useful + --{name = mobs_mc.items.rabbit_foot, chance = 10, min = 1, max = 1}, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fear_height = 4, animation = { speed_normal = 25, speed_run = 50, @@ -78,6 +75,7 @@ mobs:register_mob("mobs_mc:rabbit", rabbit) -- The killer bunny (Only with spawn egg) local killer_bunny = table.copy(rabbit) killer_bunny.type = "monster" +killer_bunny.spawn_class = "hostile" killer_bunny.attack_type = "dogfight" killer_bunny.specific_attack = { "player", "mobs_mc:wolf", "mobs_mc:dog" } killer_bunny.damage = 8 @@ -106,7 +104,7 @@ local spawn = { name = "mobs_mc:rabbit", neighbors = {"air"}, chance = 15000, - active_object_count = 99, + active_object_count = 10, min_light = 0, max_light = minetest.LIGHT_MAX+1, min_height = mobs_mc.spawn_height.overworld_min, @@ -115,18 +113,16 @@ local spawn = { local spawn_desert = table.copy(spawn) spawn_desert.nodes = mobs_mc.spawn.desert -local on_spawn = function(self, pos) - local ent = self:get_luaentity() +spawn_desert.on_spawn = function(self, pos) local texture = "mobs_mc_rabbit_gold.png" - ent.base_texture = { "mobs_mc_rabbit_gold.png" } - self:set_properties({textures = ent.base_texture}) + self.base_texture = { "mobs_mc_rabbit_gold.png" } + self.object:set_properties({textures = self.base_texture}) end mobs:spawn(spawn_desert) local spawn_snow = table.copy(spawn) spawn_snow.nodes = mobs_mc.spawn.snow spawn_snow.on_spawn = function(self, pos) - local ent = self:get_luaentity() local texture local r = math.random(1, 100) -- 80% white fur @@ -136,15 +132,14 @@ spawn_snow.on_spawn = function(self, pos) else texture = "mobs_mc_rabbit_white_splotched.png" end - ent.base_texture = { texture } - self:set_properties({textures = ent.base_texture}) + self.base_texture = { texture } + self.object:set_properties({textures = self.base_texture}) end mobs:spawn(spawn_snow) local spawn_grass = table.copy(spawn) spawn_grass.nodes = mobs_mc.spawn.grassland spawn_grass.on_spawn = function(self, pos) - local ent = self:get_luaentity() local texture local r = math.random(1, 100) -- 50% brown fur @@ -157,8 +152,8 @@ spawn_grass.on_spawn = function(self, pos) else texture = "mobs_mc_rabbit_black.png" end - ent.base_texture = { texture } - self:set_properties({textures = ent.base_texture}) + self.base_texture = { texture } + self.object:set_properties({textures = self.base_texture}) end mobs:spawn(spawn_grass) @@ -167,11 +162,3 @@ mobs:register_egg("mobs_mc:rabbit", S("Rabbit"), "mobs_mc_spawn_icon_rabbit.png" -- Note: This spawn egg does not exist in Minecraft mobs:register_egg("mobs_mc:killer_bunny", S("Killer Bunny"), "mobs_mc_spawn_icon_rabbit.png^[colorize:#FF0000:192", 0) -- TODO: Update inventory image - - --- compatibility -mobs:alias_mob("mobs:bunny", "mobs_mc:rabbit") - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Bunny loaded") -end diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index bfc8ac0f..94c2d48c 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -1,8 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### SHEEP @@ -32,12 +30,21 @@ if minetest.get_modpath("mcl_wool") ~= nil then end local sheep_texture = function(color_group) - return {"mobs_mc_sheep.png^(mobs_mc_sheep_fur.png^[colorize:"..colors[color_group][2]..")"} + if not color_group then + color_group = "unicolor_white" + end + return { + "mobs_mc_sheep_fur.png^[colorize:"..colors[color_group][2], + "mobs_mc_sheep.png", + } end +local gotten_texture = { "blank.png", "mobs_mc_sheep.png" } + --mcsheep mobs:register_mob("mobs_mc:sheep", { type = "animal", + spawn_class = "passive", hp_min = 8, hp_max = 8, @@ -46,8 +53,8 @@ mobs:register_mob("mobs_mc:sheep", { visual = "mesh", visual_size = {x=3, y=3}, mesh = "mobs_mc_sheepfur.b3d", - gotten_mesh = "mobs_mc_sheepnaked.b3d", textures = { sheep_texture("unicolor_white") }, + gotten_texture = gotten_texture, color = "unicolor_white", makes_footstep_sound = true, walk_velocity = 1, @@ -61,9 +68,6 @@ mobs:register_mob("mobs_mc:sheep", { min = 1, max = 1,}, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fear_height = 4, sounds = { random = "mobs_sheep", @@ -89,19 +93,18 @@ mobs:register_mob("mobs_mc:sheep", { self.color = "unicolor_white" end self.gotten = false + self.base_texture = sheep_texture(self.color) + self.object:set_properties({ textures = self.base_texture }) self.drops = { - {name = mobs_mc.items.mutton_raw, - chance = 1, - min = 1, - max = 2,}, - {name = colors[self.color][1], - chance = 1, - min = 1, - max = 1,}, + {name = mobs_mc.items.mutton_raw, + chance = 1, + min = 1, + max = 2,}, + {name = colors[self.color][1], + chance = 1, + min = 1, + max = 1,}, } - self.object:set_properties({ - mesh = "mobs_mc_sheepfur.b3d", - }) end, -- Set random color on spawn @@ -150,17 +153,18 @@ mobs:register_mob("mobs_mc:sheep", { if mobs:feed_tame(self, clicker, 1, true, true) then return end if mobs:protect(self, clicker) then return end - if item:get_name() == mobs_mc.items.shears and not self.gotten then + if item:get_name() == mobs_mc.items.shears and not self.gotten and not self.child then self.gotten = true - local pos = self.object:getpos() - minetest.sound_play("shears", {pos = pos}) + local pos = self.object:get_pos() + minetest.sound_play("shears", {pos = pos}, true) pos.y = pos.y + 0.5 if not self.color then self.color = "unicolor_white" end minetest.add_item(pos, ItemStack(colors[self.color][1].." "..math.random(1,3))) + self.base_texture = gotten_texture self.object:set_properties({ - mesh = "mobs_mc_sheepnaked.b3d", + textures = self.base_texture, }) if not minetest.settings:get_bool("creative_mode") then item:add_wear(mobs_mc.misc.shears_wear) @@ -179,6 +183,10 @@ mobs:register_mob("mobs_mc:sheep", { minetest.log("verbose", "[mobs_mc] " ..item:get_name() .. " " .. minetest.get_item_group(item:get_name(), "dye")) for group, colordata in pairs(colors) do if minetest.get_item_group(item:get_name(), group) == 1 then + if not minetest.settings:get_bool("creative_mode") then + item:take_item() + clicker:set_wielded_item(item) + end self.base_texture = sheep_texture(group) self.object:set_properties({ textures = self.base_texture, @@ -201,14 +209,57 @@ mobs:register_mob("mobs_mc:sheep", { end if mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end end, + on_breed = function(parent1, parent2) + -- Breed sheep and choose a fur color for the child. + local pos = parent1.object:get_pos() + local child = mobs:spawn_child(pos, parent1.name) + if child then + local ent_c = child:get_luaentity() + local color1 = parent1.color + local color2 = parent2.color + + local dye1 = mcl_dye.unicolor_to_dye(color1) + local dye2 = mcl_dye.unicolor_to_dye(color2) + local output + -- Check if parent colors could be mixed as dyes + if dye1 and dye2 then + output = minetest.get_craft_result({items = {dye1, dye2}, method="normal"}) + end + local mixed = false + if output and not output.item:is_empty() then + -- Try to mix dyes and use that as new fur color + local new_dye = output.item:get_name() + local groups = minetest.registered_items[new_dye].groups + for k, v in pairs(groups) do + if string.sub(k, 1, 9) == "unicolor_" then + ent_c.color = k + ent_c.base_texture = sheep_texture(k) + mixed = true + break + end + end + end + + -- Colors not mixable + if not mixed then + -- Choose color randomly from one of the parents + local p = math.random(1, 2) + if p == 1 and color1 then + ent_c.color = color1 + else + ent_c.color = color2 + end + ent_c.base_texture = sheep_texture(ent_c.color) + end + child:set_properties({textures = ent_c.base_texture}) + ent_c.initial_color_set = true + ent_c.tamed = true + ent_c.owner = parent1.owner + return false + end + end, }) mobs:spawn_specific("mobs_mc:sheep", mobs_mc.spawn.grassland, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 3, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) --- compatibility -mobs:alias_mob("mobs_animal:sheep", "mobs_mc:sheep") -- spawn eggs mobs:register_egg("mobs_mc:sheep", S("Sheep"), "mobs_mc_spawn_icon_sheep.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Sheep loaded") -end diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 8c779293..4304ef06 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -3,11 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### SHULKER @@ -17,6 +13,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:shulker", { type = "monster", + spawn_class = "hostile", attack_type = "shoot", shoot_interval = 0.5, arrow = "mobs_mc:shulkerbullet", @@ -29,6 +26,7 @@ mobs:register_mob("mobs_mc:shulker", { visual = "mesh", mesh = "mobs_mc_shulker.b3d", textures = { "mobs_mc_endergolem.png", }, + -- TODO: sounds -- TODO: Make shulker dye-able visual_size = {x=3, y=3}, walk_chance = 0, @@ -47,12 +45,8 @@ mobs:register_mob("mobs_mc:shulker", { run_start = 0, run_end = 45, punch_start = 80, punch_end = 100, }, - blood_amount = 0, view_range = 16, fear_height = 4, - water_damage = 1, - lava_damage = 4, - light_damage = 0, }) -- bullet arrow (weapon) @@ -69,8 +63,8 @@ mobs:register_arrow("mobs_mc:shulkerbullet", { }, nil) end, - hit_mob = function(self, player) - player:punch(self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 4}, }, nil) @@ -81,10 +75,6 @@ mobs:register_arrow("mobs_mc:shulkerbullet", { }) -mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0) +mobs:register_egg("mobs_mc:shulker", S("Schulker"), "mobs_mc_spawn_icon_shulker.png", 0) -mobs:spawn_specific("mobs_mc:shulker", "mcl_end:purpur_block", {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 2, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Shulkers loaded") -end +mobs:spawn_specific("mobs_mc:shulker", mobs_mc.spawn.end_city, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 2, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index b7f51829..a6baf1e4 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -2,12 +2,11 @@ --################### SILVERFISH --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:silverfish", { type = "monster", + spawn_class = "hostile", passive = false, group_attack = true, reach = 1, @@ -21,14 +20,16 @@ mobs:register_mob("mobs_mc:silverfish", { }, pathfinding = 1, visual_size = {x=3, y=3}, - sounds = {}, + sounds = { + random = "mobs_mc_silverfish_idle", + death = "mobs_mc_silverfish_death", + damage = "mobs_mc_silverfish_hurt", + distance = 16, + }, makes_footstep_sound = false, walk_velocity = 0.6, run_velocity = 2, jump = true, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fear_height = 4, replace_what = mobs_mc.replace.silverfish, replace_rate = 2, @@ -42,7 +43,6 @@ mobs:register_mob("mobs_mc:silverfish", { attack_type = "dogfight", damage = 1, reach = 1, - blood_amount = 0, }) mobs:register_egg("mobs_mc:silverfish", S("Silverfish"), "mobs_mc_spawn_icon_silverfish.png", 0) @@ -55,7 +55,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then end end minetest.register_node("mobs_mc:monster_egg_stone", { - description = S("Stone Monster Egg"), + description = "Stone Monster Egg", tiles = {"default_stone.png"}, groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, drop = '', @@ -65,7 +65,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then }) minetest.register_node("mobs_mc:monster_egg_cobble", { - description = S("Cobblestone Monster Egg"), + description = "Cobblestone Monster Egg", tiles = {"default_cobble.png"}, is_ground_content = false, groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, @@ -75,7 +75,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then }) minetest.register_node("mobs_mc:monster_egg_mossycobble", { - description = S("Mossy Cobblestone Monster Egg"), + description = "Mossy Cobblestone Monster Egg", tiles = {"default_mossycobble.png"}, is_ground_content = false, groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, @@ -85,7 +85,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then }) minetest.register_node("mobs_mc:monster_egg_stonebrick", { - description = S("Stone Brick Monster Egg"), + description = "Stone Brick Monster Egg", paramtype2 = "facedir", place_param2 = 0, tiles = {"default_stone_brick.png"}, @@ -97,7 +97,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then }) minetest.register_node("mobs_mc:monster_egg_stone_block", { - description = S("Stone Block Monster Egg"), + description = "Stone Block Monster Egg", tiles = {"default_stone_block.png"}, is_ground_content = false, groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 7632adcd..5d0c8ae8 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -3,12 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") +local mod_bows = minetest.get_modpath("mcl_bows") ~= nil --################### --################### SKELETON @@ -18,22 +14,25 @@ local S, NS = dofile(MP.."/intllib.lua") local skeleton = { type = "monster", + spawn_class = "hostile", hp_min = 20, hp_max = 20, + breath_max = -1, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.98, 0.3}, pathfinding = 1, group_attack = true, visual = "mesh", mesh = "mobs_mc_skeleton.b3d", - textures = { - {"mobs_mc_skeleton.png^mobs_mc_skeleton_bow.png"}, - }, + textures = { { + "mcl_bows_bow_0.png", -- bow + "mobs_mc_skeleton.png", -- skeleton + } }, visual_size = {x=3, y=3}, makes_footstep_sound = true, sounds = { - random = "skeleton1", - death = "skeletondeath", - damage = "skeletonhurt1", + random = "mobs_mc_skeleton_random", + death = "mobs_mc_skeleton_death", + damage = "mobs_mc_skeleton_hurt", distance = 16, }, walk_velocity = 1.2, @@ -62,36 +61,36 @@ local skeleton = { max = 1,}, }, animation = { + stand_speed = 15, stand_start = 0, stand_end = 40, - stand_speed = 5, + walk_speed = 15, walk_start = 40, walk_end = 60, - walk_speed = 15, - run_start = 40, - run_end = 60, run_speed = 30, - shoot_start = 70, - shoot_end = 90, - punch_start = 70, - punch_end = 90, - -- TODO: Implement and fix death animation - --die_start = 120, - --die_end = 130, - --die_loop = false, + shoot_start = 70, + shoot_end = 90, + die_start = 160, + die_end = 170, + die_speed = 15, + die_loop = false, }, - water_damage = 1, - lava_damage = 4, - light_damage = 1, + sunlight_damage = 1, view_range = 16, fear_height = 4, attack_type = "dogshoot", - arrow = "mobs_mc:arrow_entity", - shoot_interval = 2.5, - shoot_offset = 1, + arrow = "mcl_bows:arrow_entity", + shoot_arrow = function(self, pos, dir) + if mod_bows then + -- 2-4 damage per arrow + local dmg = math.max(4, math.random(2, 8)) + mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + end + end, + shoot_interval = 2, + shoot_offset = 1.5, dogshoot_switch = 1, dogshoot_count_max =1.8, - blood_amount = 0, } mobs:register_mob("mobs_mc:skeleton", skeleton) @@ -104,7 +103,11 @@ mobs:register_mob("mobs_mc:skeleton", skeleton) local stray = table.copy(skeleton) stray.mesh = "mobs_mc_stray.b3d" stray.textures = { - {"mobs_mc_stray.png"}, + { + "mcl_bows_bow_0.png", + "mobs_mc_stray.png", + "mobs_mc_stray_overlay.png", + }, } -- TODO: different sound (w/ echo) -- TODO: stray's arrow inflicts slowness status @@ -119,9 +122,6 @@ table.insert(stray.drops, { mobs:register_mob("mobs_mc:stray", stray) --- compatibility -mobs:alias_mob("mobs:skeleton", "mobs_mc:skeleton") - -- Overworld spawn mobs:spawn_specific("mobs_mc:skeleton", mobs_mc.spawn.solid, {"air"}, 0, 7, 20, 17000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- Nether spawn @@ -135,7 +135,3 @@ mobs:spawn_specific("mobs_mc:stray", mobs_mc.spawn.snow, {"air"}, 0, 7, 20, 1900 -- spawn eggs mobs:register_egg("mobs_mc:skeleton", S("Skeleton"), "mobs_mc_spawn_icon_skeleton.png", 0) mobs:register_egg("mobs_mc:stray", S("Stray"), "mobs_mc_spawn_icon_stray.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Skeleton loaded") -end diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 400fa509..c202228c 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -3,37 +3,35 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### WITHER SKELETON --################### - - mobs:register_mob("mobs_mc:witherskeleton", { type = "monster", + spawn_class = "hostile", hp_min = 20, hp_max = 20, + breath_max = -1, pathfinding = 1, group_attack = true, collisionbox = {-0.35, -0.01, -0.35, 0.35, 2.39, 0.35}, visual = "mesh", mesh = "mobs_mc_witherskeleton.b3d", textures = { - {"mobs_mc_wither_skeleton.png^mobs_mc_wither_skeleton_sword.png"}, + { + "default_tool_stonesword.png", -- sword + "mobs_mc_wither_skeleton.png", -- wither skeleton + } }, visual_size = {x=3.6, y=3.6}, makes_footstep_sound = true, sounds = { - random = "skeleton1", - death = "skeletondeath", - damage = "skeletonhurt1", + random = "mobs_mc_skeleton_random", + death = "mobs_mc_skeleton_death", + damage = "mobs_mc_skeleton_hurt", distance = 16, }, walk_velocity = 1.2, @@ -59,7 +57,7 @@ mobs:register_mob("mobs_mc:witherskeleton", { animation = { stand_start = 0, stand_end = 40, - stand_speed = 5, + stand_speed = 15, walk_start = 40, walk_end = 60, walk_speed = 15, @@ -68,28 +66,22 @@ mobs:register_mob("mobs_mc:witherskeleton", { run_speed = 30, shoot_start = 70, shoot_end = 90, - punch_start = 70, - punch_end = 90, - -- TODO: Implement and fix death animation - --die_start = 120, - --die_end = 130, - --die_loop = false, - - -- Not supported yet - hurt_start = 100, - hurt_end = 120, + punch_start = 110, + punch_end = 130, + punch_speed = 25, + die_start = 160, + die_end = 170, + die_speed = 15, + die_loop = false, }, water_damage = 0, lava_damage = 0, + fire_damage = 0, light_damage = 0, view_range = 16, attack_type = "dogfight", - arrow = "mobs_mc:arrow_entity", - shoot_interval = 2.5, - shoot_offset = 1, dogshoot_switch = 1, dogshoot_count_max =0.5, - blood_amount = 0, fear_height = 4, }) @@ -98,7 +90,3 @@ mobs:spawn_specific("mobs_mc:witherskeleton", mobs_mc.spawn.nether_fortress, {"a -- spawn eggs mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "mobs_mc_spawn_icon_witherskeleton.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Wither Skeleton loaded") -end diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index e0c9d58a..d361b89b 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -1,14 +1,65 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") + +-- Returns a function that spawns children in a circle around pos. +-- To be used as on_die callback. +-- self: mob reference +-- pos: position of "mother" mob +-- child_mod: Mob to spawn +-- children_count: Number of children to spawn +-- spawn_distance: Spawn distance from "mother" mob +-- eject_speed: Initial speed of child mob away from "mother" mob +local spawn_children_on_die = function(child_mob, children_count, spawn_distance, eject_speed) + return function(self, pos) + local angle, posadd, newpos, dir + if not eject_speed then + eject_speed = 1 + end + local mother_stuck = minetest.registered_nodes[minetest.get_node(pos).name].walkable + angle = math.random(0, math.pi*2) + local children = {} + for i=1,children_count do + dir = {x=math.cos(angle),y=0,z=math.sin(angle)} + posadd = vector.multiply(vector.normalize(dir), spawn_distance) + newpos = vector.add(pos, posadd) + -- If child would end up in a wall, use position of the "mother", unless + -- the "mother" was stuck as well + local speed_penalty = 1 + if (not mother_stuck) and minetest.registered_nodes[minetest.get_node(newpos).name].walkable then + newpos = pos + speed_penalty = 0.5 + end + local mob = minetest.add_entity(newpos, child_mob) + if (not mother_stuck) then + mob:set_velocity(vector.multiply(dir, eject_speed * speed_penalty)) + end + mob:set_yaw(angle - math.pi/2) + table.insert(children, mob) + angle = angle + (math.pi*2)/children_count + end + -- If mother was murdered, children attack the killer after 1 second + if self.state == "attack" then + minetest.after(1.0, function(children, enemy) + for c=1, #children do + local child = children[c] + local le = child:get_luaentity() + if le ~= nil then + le.state = "attack" + le.attack = enemy + end + end + end, children, self.attack) + end + end +end -- Slime local slime_big = { type = "monster", + spawn_class = "hostile", pathfinding = 1, - group_attack = true, + group_attack = { "mobs_mc:slime_big", "mobs_mc:slime_small", "mobs_mc:slime_tiny" }, hp_min = 16, hp_max = 16, collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, @@ -16,7 +67,6 @@ local slime_big = { textures = {{"mobs_mc_slime.png"}}, visual = "mesh", mesh = "mobs_mc_slime.b3d", - blood_texture ="mobs_mc_slime_blood.png", makes_footstep_sound = true, sounds = { jump = "green_slime_jump", @@ -44,9 +94,6 @@ local slime_big = { death_start = 88, death_end = 118, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fall_damage = 0, view_range = 16, attack_type = "dogfight", @@ -56,24 +103,14 @@ local slime_big = { run_velocity = 2.5, walk_chance = 0, jump_height = 5.2, - jump_chance = 100, - fear_height = 60, - on_die = function(self, pos) - local angle, posadd - angle = math.random(0, math.pi*2) - for i=1,4 do - posadd = {x=math.cos(angle),y=0,z=math.sin(angle)} - posadd = vector.normalize(posadd) - local slime = minetest.add_entity(vector.add(pos, posadd), "mobs_mc:slime_small") - slime:setvelocity(vector.multiply(posadd, 1.5)) - slime:setyaw(angle-math.pi/2) - angle = angle + math.pi/2 - end - end, + fear_height = 0, + spawn_small_alternative = "mobs_mc:slime_small", + on_die = spawn_children_on_die("mobs_mc:slime_small", 4, 1.0, 1.5) } mobs:register_mob("mobs_mc:slime_big", slime_big) local slime_small = table.copy(slime_big) +slime_small.sounds.base_pitch = 1.15 slime_small.hp_min = 4 slime_small.hp_max = 4 slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} @@ -83,21 +120,12 @@ slime_small.reach = 2.75 slime_small.walk_velocity = 1.3 slime_small.run_velocity = 1.3 slime_small.jump_height = 4.3 -slime_small.on_die = function(self, pos) - local angle, posadd, dir - angle = math.random(0, math.pi*2) - for i=1,4 do - dir = {x=math.cos(angle),y=0,z=math.sin(angle)} - posadd = vector.multiply(vector.normalize(dir), 0.6) - local slime = minetest.add_entity(vector.add(pos, posadd), "mobs_mc:slime_tiny") - slime:setvelocity(dir) - slime:setyaw(angle-math.pi/2) - angle = angle + math.pi/2 - end -end +slime_small.spawn_small_alternative = "mobs_mc:slime_tiny" +slime_small.on_die = spawn_children_on_die("mobs_mc:slime_tiny", 4, 0.6, 1.0) mobs:register_mob("mobs_mc:slime_small", slime_small) local slime_tiny = table.copy(slime_big) +slime_tiny.sounds.base_pitch = 1.3 slime_tiny.hp_min = 1 slime_tiny.hp_max = 1 slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} @@ -114,6 +142,7 @@ slime_tiny.drops = { slime_tiny.walk_velocity = 0.7 slime_tiny.run_velocity = 0.7 slime_tiny.jump_height = 3 +slime_tiny.spawn_small_alternative = nil slime_tiny.on_die = nil mobs:register_mob("mobs_mc:slime_tiny", slime_tiny) @@ -128,6 +157,7 @@ mobs:spawn_specific("mobs_mc:slime_big", mobs_mc.spawn.solid, {"air"}, 0, minete -- Magma cube local magma_cube_big = { type = "monster", + spawn_class = "hostile", hp_min = 16, hp_max = 16, collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, @@ -135,13 +165,11 @@ local magma_cube_big = { textures = {{ "mobs_mc_magmacube.png" }}, visual = "mesh", mesh = "mobs_mc_magmacube.b3d", - blood_texture = "mobs_mc_magmacube_blood.png", makes_footstep_sound = true, sounds = { - jump = "green_slime_jump", - death = "green_slime_death", - damage = "green_slime_damage", - attack = "green_slime_attack", + jump = "mobs_mc_magma_cube_big", + death = "mobs_mc_magma_cube_big", + attack = "mobs_mc_magma_cube_attack", distance = 16, }, walk_velocity = 4, @@ -172,6 +200,7 @@ local magma_cube_big = { }, water_damage = 0, lava_damage = 0, + fire_damage = 0, light_damage = 0, fall_damage = 0, view_range = 16, @@ -180,24 +209,15 @@ local magma_cube_big = { jump = true, jump_height = 8, walk_chance = 0, - jump_chance = 100, - fear_height = 100000, - on_die = function(self, pos) - local angle, posadd - angle = math.random(0, math.pi*2) - for i=1,3 do - posadd = {x=math.cos(angle),y=0,z=math.sin(angle)} - posadd = vector.normalize(posadd) - local mob = minetest.add_entity(vector.add(pos, posadd), "mobs_mc:magma_cube_small") - mob:setvelocity(vector.multiply(posadd, 1.5)) - mob:setyaw(angle-math.pi/2) - angle = angle + (math.pi*2) / 3 - end - end, + fear_height = 0, + spawn_small_alternative = "mobs_mc:magma_cube_small", + on_die = spawn_children_on_die("mobs_mc:magma_cube_small", 3, 0.8, 1.5) } mobs:register_mob("mobs_mc:magma_cube_big", magma_cube_big) local magma_cube_small = table.copy(magma_cube_big) +magma_cube_small.sounds.jump = "mobs_mc_magma_cube_small" +magma_cube_small.sounds.death = "mobs_mc_magma_cube_small" magma_cube_small.hp_min = 4 magma_cube_small.hp_max = 4 magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} @@ -210,21 +230,14 @@ magma_cube_small.jump_height = 6 magma_cube_small.damage = 4 magma_cube_small.reach = 2.75 magma_cube_small.armor = 70 -magma_cube_small.on_die = function(self, pos) - local angle, posadd, dir - angle = math.random(0, math.pi*2) - for i=1,4 do - dir = vector.normalize({x=math.cos(angle),y=0,z=math.sin(angle)}) - posadd = vector.multiply(dir, 0.6) - local mob = minetest.add_entity(vector.add(pos, posadd), "mobs_mc:magma_cube_tiny") - mob:setvelocity(dir) - mob:setyaw(angle-math.pi/2) - angle = angle + math.pi/2 - end -end +magma_cube_small.spawn_small_alternative = "mobs_mc:magma_cube_tiny" +magma_cube_small.on_die = spawn_children_on_die("mobs_mc:magma_cube_tiny", 4, 0.6, 1.0) mobs:register_mob("mobs_mc:magma_cube_small", magma_cube_small) local magma_cube_tiny = table.copy(magma_cube_big) +magma_cube_tiny.sounds.jump = "mobs_mc_magma_cube_small" +magma_cube_tiny.sounds.death = "mobs_mc_magma_cube_small" +magma_cube_tiny.sounds.base_pitch = 1.25 magma_cube_tiny.hp_min = 1 magma_cube_tiny.hp_max = 1 magma_cube_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} @@ -236,6 +249,7 @@ magma_cube_tiny.damage = 3 magma_cube_tiny.reach = 2.5 magma_cube_tiny.armor = 85 magma_cube_tiny.drops = {} +magma_cube_tiny.spawn_small_alternative = nil magma_cube_tiny.on_die = nil mobs:register_mob("mobs_mc:magma_cube_tiny", magma_cube_tiny) @@ -253,19 +267,6 @@ mobs:spawn_specific("mobs_mc:magma_cube_small", mobs_mc.spawn.nether_fortress, { mobs:spawn_specific("mobs_mc:magma_cube_big", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11200, 4, mmin, mmax) --- Compability -mobs:alias_mob("mobs_mc:greensmall", "mobs_mc:slime_tiny") -mobs:alias_mob("mobs_mc:greenmedium", "mobs_mc:slime_small") -mobs:alias_mob("mobs_mc:greenbig", "mobs_mc:slime_big") -mobs:alias_mob("mobs_mc:lavasmall", "mobs_mc:magma_cube_tiny") -mobs:alias_mob("mobs_mc:lavamedium", "mobs_mc:magma_cube_small") -mobs:alias_mob("mobs_mc:lavabig", "mobs_mc:magma_cube_big") - -- spawn eggs mobs:register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "mobs_mc_spawn_icon_magmacube.png") mobs:register_egg("mobs_mc:slime_big", S("Slime"), "mobs_mc_spawn_icon_slime.png") - - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Slimes loaded") -end diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index 8756f5dc..fd3947d7 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -3,13 +3,26 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") + local snow_trail_frequency = 0.5 -- Time in seconds for checking to add a new snow trail +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +local mod_throwing = minetest.get_modpath("mcl_throwing") ~= nil + +local gotten_texture = { + "mobs_mc_snowman.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", +} + mobs:register_mob("mobs_mc:snowman", { type = "npc", + spawn_class = "passive", passive = true, hp_min = 4, hp_max = 4, @@ -17,15 +30,22 @@ mobs:register_mob("mobs_mc:snowman", { view_range = 10, fall_damage = 0, water_damage = 4, - lava_damage = 20, + rain_damage = 4, attacks_monsters = true, collisionbox = {-0.35, -0.01, -0.35, 0.35, 1.89, 0.35}, visual = "mesh", mesh = "mobs_mc_snowman.b3d", + -- TODO: sounds: damage, death textures = { - {"mobs_mc_snowman.png^mobs_mc_snowman_pumpkin.png"}, + "mobs_mc_snowman.png", --snowman texture + "farming_pumpkin_side.png", --top + "farming_pumpkin_top.png", --down + "farming_pumpkin_face.png", --front + "farming_pumpkin_side.png", --left + "farming_pumpkin_side.png", --right + "farming_pumpkin_top.png", --left }, - gotten_texture = { "mobs_mc_snowman.png" }, + gotten_texture = gotten_texture, drops = {{ name = mobs_mc.items.snowball, chance = 1, min = 0, max = 15 }}, visual_size = {x=3, y=3}, walk_velocity = 0.6, @@ -33,12 +53,18 @@ mobs:register_mob("mobs_mc:snowman", { jump = true, makes_footstep_sound = true, attack_type = "shoot", - arrow = "mobs_mc:snowball_entity", + arrow = "mcl_throwing:snowball_entity", + shoot_arrow = function(self, pos, dir) + if mod_throwing then + mcl_throwing.throw("mcl_throwing:snowball", pos, dir, nil, self.object) + end + end, shoot_interval = 1, shoot_offset = 1, animation = { - speed_normal = 25, - speed_run = 50, + stand_speed = 25, + walk_speed = 25, + run_speed = 50, stand_start = 20, stand_end = 40, walk_start = 0, @@ -47,10 +73,13 @@ mobs:register_mob("mobs_mc:snowman", { run_end = 20, die_start = 40, die_end = 50, - die_loop = false, + die_speed = 25, + die_loop = false, }, - blood_amount = 0, do_custom = function(self, dtime) + if not mobs_griefing then + return + end -- Leave a trail of top snow behind. -- This is done in do_custom instead of just using replace_what because with replace_what, -- the top snop may end up floating in the air. @@ -61,7 +90,7 @@ mobs:register_mob("mobs_mc:snowman", { self._snowtimer = self._snowtimer + dtime if self.health > 0 and self._snowtimer > snow_trail_frequency then self._snowtimer = 0 - local pos = self.object:getpos() + local pos = self.object:get_pos() local below = {x=pos.x, y=pos.y-1, z=pos.z} local def = minetest.registered_nodes[minetest.get_node(pos).name] -- Node at snow golem's position must be replacable @@ -83,11 +112,11 @@ mobs:register_mob("mobs_mc:snowman", { -- Remove pumpkin self.gotten = true self.object:set_properties({ - textures = {"mobs_mc_snowman.png"}, + textures = gotten_texture, }) - local pos = self.object:getpos() - minetest.sound_play("shears", {pos = pos}) + local pos = self.object:get_pos() + minetest.sound_play("shears", {pos = pos}, true) -- Wear out if not minetest.settings:get_bool("creative_mode") then @@ -135,7 +164,3 @@ end -- Spawn egg mobs:register_egg("mobs_mc:snowman", S("Snow Golem"), "mobs_mc_spawn_icon_snowman.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Snow Golem loaded") -end diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_attack.ogg b/mods/ENTITIES/mobs_mc/sounds/green_slime_attack.ogg index 7afa4cbb..a8ca4939 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/green_slime_attack.ogg and b/mods/ENTITIES/mobs_mc/sounds/green_slime_attack.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mcl_totems_totem.ogg b/mods/ENTITIES/mobs_mc/sounds/mcl_totems_totem.ogg new file mode 100644 index 00000000..f7669b2a Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mcl_totems_totem.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_fireball.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_fireball.ogg index bdc4ac21..119818f1 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_fireball.ogg and b/mods/ENTITIES/mobs_mc/sounds/mobs_fireball.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_kitten.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_kitten.ogg deleted file mode 100644 index 021d3dc7..00000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_kitten.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg new file mode 100644 index 00000000..e56b9080 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_breath.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_breath.ogg index 10f39553..d756a79f 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_breath.ogg and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_breath.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_died.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_died.ogg index 39ba86cd..591bffe7 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_died.ogg and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_died.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg new file mode 100644 index 00000000..a51db0fe Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.1.ogg new file mode 100644 index 00000000..48e9977e Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.1.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.2.ogg new file mode 100644 index 00000000..7e732483 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.2.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg new file mode 100644 index 00000000..5ea33fc0 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg index dc7ffd68..6a7781aa 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow.ogg index 198375c3..87e57e44 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow.ogg and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg new file mode 100644 index 00000000..b07a7828 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg new file mode 100644 index 00000000..ba43206a Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg new file mode 100644 index 00000000..9aed7a2e Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg new file mode 100644 index 00000000..b4fd749c Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg new file mode 100644 index 00000000..b6d7efd9 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.1.ogg new file mode 100644 index 00000000..b5569a7e Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.1.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.2.ogg new file mode 100644 index 00000000..784d6993 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.2.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg new file mode 100644 index 00000000..380ea612 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_big.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_big.ogg new file mode 100644 index 00000000..cd166daf Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_big.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_small.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_small.ogg new file mode 100644 index 00000000..1dec6141 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_small.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg new file mode 100644 index 00000000..d2c6d97a Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg new file mode 100644 index 00000000..1930b4e4 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg new file mode 100644 index 00000000..bc6279a6 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg new file mode 100644 index 00000000..dbfc41b4 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg new file mode 100644 index 00000000..c11402b1 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg new file mode 100644 index 00000000..2289183d Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg new file mode 100644 index 00000000..e81c45a4 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg new file mode 100644 index 00000000..1d495b87 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.ogg index 03a18958..58c02297 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.ogg and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg new file mode 100644 index 00000000..56189372 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_hurt.ogg new file mode 100644 index 00000000..26ecfad4 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_hurt.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_death.ogg index 9a54d357..62405cb4 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_death.ogg and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_death.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_growl.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_growl.ogg index 5e8132ee..82b1416f 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_growl.ogg and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_growl.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_hurt.ogg index 845a71cc..1ebfa37a 100644 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_hurt.ogg and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_hurt.ogg differ diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index 73f37cc6..f9d58407 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -3,11 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### SPIDER @@ -18,6 +14,7 @@ local S, NS = dofile(MP.."/intllib.lua") local spider = { type = "monster", + spawn_class = "hostile", passive = false, docile_by_day = true, attack_type = "dogfight", @@ -37,11 +34,12 @@ local spider = { sounds = { random = "mobs_spider", attack = "mobs_spider", + -- TODO: sounds: walk, death distance = 16, }, walk_velocity = 3.9, jump = true, - jump_height = 2, + jump_height = 4, view_range = 16, floats = 1, drops = { @@ -49,17 +47,18 @@ local spider = { {name = mobs_mc.items.spider_eye, chance = 3, min = 1, max = 1,}, }, specific_attack = { "player", "mobs_mc:iron_golem" }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fear_height = 4, animation = { - speed_normal = 25, speed_run = 50, - stand_start = 40, stand_end = 80, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, + stand_speed = 10, + walk_speed = 25, + run_speed = 50, + stand_start = 20, + stand_end = 40, + walk_start = 0, + walk_end = 20, + run_start = 0, + run_end = 20, }, - blood_amount = 0, } mobs:register_mob("mobs_mc:spider", spider) @@ -79,14 +78,6 @@ mobs:register_mob("mobs_mc:cave_spider", cave_spider) mobs:spawn_specific("mobs_mc:spider", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 17000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) --- compatibility -mobs:alias_mob("mobs:spider", "mobs_mc:spider") -mobs:alias_mob("esmobs:spider", "mobs_mc:spider") - -- spawn eggs mobs:register_egg("mobs_mc:spider", S("Spider"), "mobs_mc_spawn_icon_spider.png", 0) mobs:register_egg("mobs_mc:cave_spider", S("Cave Spider"), "mobs_mc_spawn_icon_cave_spider.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Spiders loaded") -end diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index 2ab401d1..a43bade3 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -4,18 +4,18 @@ --################### SQUID --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:squid", { type = "animal", + spawn_class = "water", + can_despawn = true, passive = true, hp_min = 10, hp_max = 10, armor = 100, -- FIXME: If the squid is near the floor, it turns black - collisionbox = {-0.4, 0.1, -0.4, 0.4, 0.9, 0.4}, + collisionbox = {-0.4, 0.0, -0.4, 0.4, 0.9, 0.4}, visual = "mesh", mesh = "mobs_mc_squid.b3d", textures = { @@ -23,6 +23,8 @@ mobs:register_mob("mobs_mc:squid", { }, sounds = { damage = "mobs_mc_squid_hurt", + death = "mobs_mc_squid_hurt", + -- TODO: sounds: random, damage, death distance = 16, }, animation = { @@ -39,33 +41,25 @@ mobs:register_mob("mobs_mc:squid", { min = 1, max = 3,}, }, - visual_size = {x=1.75, y=1.75}, + visual_size = {x=3, y=3}, makes_footstep_sound = false, - stepheight = 1.1, fly = true, - -- fly_in = mobs_mc.items.water_source, fuck this - fly_in = {"mcl_core:water_source", "default:water_source"}, - jump = true, - jump_height = 1.25, - jump_chance = 98, + fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, + breathes_in_water = true, + jump = false, fall_speed = 0.5, view_range = 16, - water_damage = 0, - lava_damage = 4, - light_damage = 0, runaway = true, fear_height = 4, - blood_texture = "mobs_mc_squid_blood.png", }) +-- TODO: Behaviour: squirt + -- Spawn near the water surface local water = mobs_mc.spawn_height.water --name, nodes, neighbours, minlight, maxlight, interval, chance, active_object_count, min_height, max_height mobs:spawn_specific("mobs_mc:squid", mobs_mc.spawn.water, {mobs_mc.items.water_source}, 0, minetest.LIGHT_MAX+1, 30, 5500, 3, water-16, water) --- compatibility -mobs:alias_mob("mobs:squid", "mobs_mc:squid") - -- spawn eggs mobs:register_egg("mobs_mc:squid", S("Squid"), "mobs_mc_spawn_icon_squid.png", 0) diff --git a/mods/ENTITIES/mobs_mc/textures/mcl_mobitems_totem.png b/mods/ENTITIES/mobs_mc/textures/mcl_mobitems_totem.png deleted file mode 100644 index 603a8676..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mcl_mobitems_totem.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mcl_totems_totem.png b/mods/ENTITIES/mobs_mc/textures/mcl_totems_totem.png new file mode 100644 index 00000000..96243d5b Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mcl_totems_totem.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_chicken_egg.png b/mods/ENTITIES/mobs_mc/textures/mobs_chicken_egg.png index 9c654545..65dd01de 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_chicken_egg.png and b/mods/ENTITIES/mobs_mc/textures/mobs_chicken_egg.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png index dfd13dfa..b4c007a7 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png index 1d0cd9b1..40af172b 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_chicken.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_chicken.png index edd0d996..b9d69278 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_chicken.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_chicken.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_donkey.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_donkey.png index 8588e6aa..c2ef07b7 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_donkey.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_donkey.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon_fireball.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon_fireball.png index 69e643b1..cee41904 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon_fireball.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon_fireball.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png index 082901fd..59fb9169 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker_base.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker_base.png deleted file mode 100644 index eec707c5..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker_base.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast.png index dc2addc1..a2321c0a 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png index a2b0bde5..45752c27 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png index 052df745..ca978f6d 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chest.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chest.png deleted file mode 100644 index 400d8a1e..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chest.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png index 4c646d86..a6556245 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png new file mode 100644 index 00000000..a4e6ce8f Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png index f1377f3f..048f68df 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png index c2e0450f..851aafe8 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_saddle.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_saddle.png deleted file mode 100644 index 873df178..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_saddle.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_skeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_skeleton.png index 5b76d7b3..5d460ad8 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_skeleton.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_skeleton.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png index 8d67a79f..c9478abf 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_zombie.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_zombie.png index 3ab56a0f..846769e2 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_zombie.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_zombie.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist.png index f595dad9..3a67a687 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist_bow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist_bow.png deleted file mode 100644 index 27e67031..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist_bow.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_golem.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_golem.png index 439ddbd1..99d2c565 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_golem.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_golem.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama.png index 4eda8ab4..d465e1ff 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_brown.png index 3ee823af..442f90d6 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_brown.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_brown.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_chest.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_chest.png deleted file mode 100644 index 85e321cd..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_chest.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_creamy.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_creamy.png index 87901b46..cb6851f5 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_creamy.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_creamy.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png new file mode 100644 index 00000000..f48562d8 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png new file mode 100644 index 00000000..edc969da Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png new file mode 100644 index 00000000..934b4024 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png new file mode 100644 index 00000000..a8dfd197 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png new file mode 100644 index 00000000..bb6404a8 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png new file mode 100644 index 00000000..1848956b Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png new file mode 100644 index 00000000..0932b5fe Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png new file mode 100644 index 00000000..b1a0d908 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png new file mode 100644 index 00000000..25658cfc Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png new file mode 100644 index 00000000..1c9fb479 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png new file mode 100644 index 00000000..50262140 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png new file mode 100644 index 00000000..7d5a5816 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png new file mode 100644 index 00000000..32d9e0e6 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png new file mode 100644 index 00000000..b043cb1f Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_silver.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_silver.png new file mode 100644 index 00000000..b1a0d908 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_silver.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_trader.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_trader.png new file mode 100644 index 00000000..edf1840a Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_trader.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png new file mode 100644 index 00000000..dcd26338 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png new file mode 100644 index 00000000..542c4660 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_gray.png index 43f9d59b..7c75583d 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_gray.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_gray.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png index 8cf55f82..4fdfbb2c 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube.png index 6bd6cfc2..ec562ec0 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube_blood.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube_blood.png deleted file mode 100644 index 46b699be..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube_blood.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png new file mode 100644 index 00000000..85b15e0e Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_mooshroom.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_mooshroom.png deleted file mode 100644 index eada719a..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_mooshroom.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png index 7b33b535..8e0895bb 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png new file mode 100644 index 00000000..c3d33fcd Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_red.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_red.png new file mode 100644 index 00000000..d4e4e653 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_red.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png index b21c4f25..1c2cc079 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png index 448444e3..d2f220f9 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png index 03eefc74..c683f5cd 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png index 1979d907..f8ebe470 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig_saddle.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig_saddle.png index a42e77dc..8126f31e 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig_saddle.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig_saddle.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png index 50b0e18a..b7b66a48 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png index 0c25e272..0f3d9785 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulkerbullet.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulkerbullet.png index 5e654618..52449189 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulkerbullet.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulkerbullet.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton_bow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton_bow.png deleted file mode 100644 index 1dfcc18d..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton_bow.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime.png index 82ed0871..5d82943d 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime_blood.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime_blood.png deleted file mode 100644 index 29e94a0e..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime_blood.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman_pumpkin.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman_pumpkin.png deleted file mode 100644 index e9db35ad..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman_pumpkin.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_agent.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_agent.png deleted file mode 100644 index 08e06889..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_agent.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cat.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cat.png index 123ffc33..1b904e5f 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cat.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cat.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png index 20fec90d..a7f1354d 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_chicken.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_chicken.png index 3b72ad7d..70717aed 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_chicken.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_chicken.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_dragon.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_dragon.png index 7f755824..228461b8 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_dragon.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_dragon.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_enderman.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_enderman.png index e8b4227c..79eaa871 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_enderman.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_enderman.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_endermite.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_endermite.png index 436f93ee..df5a1b28 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_endermite.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_endermite.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_evoker.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_evoker.png index 08724e99..b6a4353f 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_evoker.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_evoker.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_ghast.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_ghast.png index 0934eef0..d139df50 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_ghast.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_ghast.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png index a524502b..0b9ce9d7 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png index 51288c55..266c8520 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png index 20f7729e..959a1fb7 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png index 8e8bb029..4e798121 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png index f1a3151d..37d2bb6d 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_parrot.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_parrot.png index 988b8b18..b70b6143 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_parrot.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_parrot.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png index 351c2f9c..45073760 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_slime.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_slime.png index 5069e6fa..2a5a24e8 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_slime.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_slime.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_spider.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_spider.png index 1b9d6dff..9ce57ce9 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_spider.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_spider.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_squid.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_squid.png index 0e304ccc..43a1d4e1 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_squid.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_squid.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vex.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vex.png index 631a2fc1..3d3488eb 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vex.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vex.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_villager.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_villager.png index 08c3d106..21e7994f 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_villager.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_villager.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png index dcc34566..d7926703 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wither.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wither.png index fb851769..c1f01c3d 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wither.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wither.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png index 8fd54fc6..75694303 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie.png index f8b7b621..224f898b 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_squid_blood.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_squid_blood.png deleted file mode 100644 index a991d65d..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_squid_blood.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png index d97b8065..4e98d526 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_bow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_bow.png deleted file mode 100644 index 6116fe2a..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_bow.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png new file mode 100644 index 00000000..5434e2b1 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_bg.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_bg.png index a95b0978..16cc72a1 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_bg.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_bg.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_disabled.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_disabled.png new file mode 100644 index 00000000..3516b8bd Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_disabled.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_sword.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_sword.png deleted file mode 100644 index 340ca52a..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_sword.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png index 62c98bcd..7220aa15 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png new file mode 100644 index 00000000..21ab622c Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator_axe.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator_axe.png deleted file mode 100644 index e8bf0611..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator_axe.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator_base.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator_base.png deleted file mode 100644 index e92d810e..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator_base.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_witch.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_witch.png index 7595a5fc..30fb7f8f 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_witch.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_witch.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither.png index 4da3d2fc..4422fcfd 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton.png index 42c091ca..ebde0d96 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton_sword.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton_sword.png deleted file mode 100644 index 43bbec99..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton_sword.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman_sword.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman_sword.png deleted file mode 100644 index 976d3abf..00000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman_sword.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index 74136c09..4c648577 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -3,20 +3,15 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") - ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### VEX --################### - - mobs:register_mob("mobs_mc:vex", { type = "monster", + spawn_class = "hostile", pathfinding = 1, passive = false, attack_type = "dogfight", @@ -27,7 +22,10 @@ mobs:register_mob("mobs_mc:vex", { visual = "mesh", mesh = "mobs_mc_vex.b3d", textures = { - {"mobs_mc_vex.png^mobs_mc_vex_sword.png"}, + { + "default_tool_steelsword.png", + "mobs_mc_vex.png", + }, }, visual_size = {x=1.25, y=1.25}, damage = 9, @@ -37,26 +35,33 @@ mobs:register_mob("mobs_mc:vex", { run_velocity = 5.9, attack_type = "dogfight", sounds = { - random = "mobs_rat", - death = "green_slime_death", + -- TODO: random + death = "mobs_mc_vex_death", + damage = "mobs_mc_vex_hurt", distance = 16, }, animation = { - stand_speed = 25, walk_speed = 25, run_speed = 50, - stand_start = 40, stand_end = 80, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, + stand_speed = 25, + walk_speed = 25, + run_speed = 50, + stand_start = 40, + stand_end = 80, + walk_start = 0, + walk_end = 40, + run_start = 0, + run_end = 40, }, do_custom = function(self, dtime) -- Glow red while attacking + -- TODO: Charge sound if self.state == "attack" then - if self.base_texture[1] ~= "mobs_mc_vex_charging.png^mobs_mc_vex_sword.png" then - self.base_texture = {"mobs_mc_vex_charging.png^mobs_mc_vex_sword.png"} + if self.base_texture[2] ~= "mobs_mc_vex_charging.png" then + self.base_texture[2] = "mobs_mc_vex_charging.png" self.object:set_properties({textures=self.base_texture}) end else - if self.base_texture[1] ~= "mobs_mc_vex.png^mobs_mc_vex_sword.png" then - self.base_texture = {"mobs_mc_vex.png^mobs_mc_vex_sword.png"} + if self.base_texture[1] ~= "default_tool_steelsword.png" then + self.base_texture[1] = "default_tool_steelsword.png" self.object:set_properties({textures=self.base_texture}) end end @@ -80,18 +85,9 @@ mobs:register_mob("mobs_mc:vex", { end end end, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fly = true, - fly_in = {"air"}, }) -- spawn eggs mobs:register_egg("mobs_mc:vex", S("Vex"), "mobs_mc_spawn_icon_vex.png", 0) - - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Vex loaded") -end diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 76a728e2..9788d58c 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -3,179 +3,1062 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### VILLAGER --################### +-- Summary: Villagers are complex NPCs, their main feature allows players to trade with them. +-- TODO: Particles +-- TODO: 4s Regeneration I after trade unlock +-- TODO: Breeding +-- TODO: Baby villagers +-- TODO: Spawning in villages +-- TODO: Behaviour: +-- TODO: Walk around village, but do not leave it intentionally +-- TODO: Run into house on rain or danger, open doors +-- TODO: Internal inventory, pick up items, trade with other villagers +-- TODO: Farm stuff +local S = minetest.get_translator("mobs_mc") +local N = function(s) return s end +local F = minetest.formspec_escape + +-- playername-indexed table containing the previously used tradenum +local player_tradenum = {} +-- playername-indexed table containing the objectref of trader, if trading formspec is open +local player_trading_with = {} + +local DEFAULT_WALK_CHANCE = 33 -- chance to walk in percent, if no player nearby +local PLAYER_SCAN_INTERVAL = 5 -- every X seconds, villager looks for players nearby +local PLAYER_SCAN_RADIUS = 4 -- scan radius for looking for nearby players + +--[=======[ TRADING ]=======] + +-- LIST OF VILLAGER PROFESSIONS AND TRADES + +-- TECHNICAL RESTRICTIONS (FIXME): +-- * You can't use a clock as requested item +-- * You can't use a compass as requested item if its stack size > 1 +-- * You can't use a compass in the second requested slot +-- This is a problem in the mcl_compass and mcl_clock mods, +-- these items should be implemented as single items, then everything +-- will be much easier. + +local COMPASS = "mcl_compass:compass" +if minetest.registered_aliases[COMPASS] then + COMPASS = minetest.registered_aliases[COMPASS] +end + +local E1 = { "mcl_core:emerald", 1, 1 } -- one emerald + +-- Special trades for v6 only +-- NOTE: These symbols MUST only be added at the end of a tier +local TRADE_V6_RED_SANDSTONE, TRADE_V6_DARK_OAK_SAPLING, TRADE_V6_ACACIA_SAPLING, TRADE_V6_BIRCH_SAPLING +if minetest.get_mapgen_setting("mg_name") == "v6" then + TRADE_V6_RED_SANDSTONE = { E1, { "mcl_core:redsandstone", 12, 16 } } + TRADE_V6_DARK_OAK_SAPLING = { { "mcl_core:emerald", 6, 9 }, { "mcl_core:darksapling", 1, 1 } } + TRADE_V6_ACACIA_SAPLING = { { "mcl_core:emerald", 14, 17 }, { "mcl_core:acaciasapling", 1, 1 } } + TRADE_V6_BIRCH_SAPLING = { { "mcl_core:emerald", 8, 11 }, { "mcl_core:birchsapling", 1, 1 } } +end + +local professions = { + farmer = { + name = N("Farmer"), + texture = "mobs_mc_villager_farmer.png", + trades = { + { + { { "mcl_farming:wheat_item", 18, 22, }, E1 }, + { { "mcl_farming:potato_item", 15, 19, }, E1 }, + { { "mcl_farming:carrot_item", 15, 19, }, E1 }, + { E1, { "mcl_farming:bread", 2, 4 } }, + }, + + { + { { "mcl_farming:pumpkin_face", 8, 13 }, E1 }, + { E1, { "mcl_farming:pumpkin_pie", 2, 3} }, + }, + + { + { { "mcl_farming:melon", 7, 12 }, E1 }, + { E1, { "mcl_core:apple", 5, 7 }, }, + }, + + { + { E1, { "mcl_farming:cookie", 6, 10 } }, + { E1, { "mcl_cake:cake", 1, 1 } }, + TRADE_V6_BIRCH_SAPLING, + TRADE_V6_DARK_OAK_SAPLING, + TRADE_V6_ACACIA_SAPLING, + }, + } + }, + fisherman = { + name = N("Fisherman"), + texture = "mobs_mc_villager_farmer.png", + trades = { + { + { { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 }, { "mcl_fishing:fish_cooked", 6, 6 } }, + { { "mcl_mobitems:string", 15, 20 }, E1 }, + -- TODO: replace with enchanted fishing rod + { { "mcl_core:emerald", 3, 11 }, { "mcl_fishing:fishing_rod", 1, 1} }, + }, + }, + }, + fletcher = { + name = N("Fletcher"), + texture = "mobs_mc_villager_farmer.png", + trades = { + { + { { "mcl_mobitems:string", 15, 20 }, E1 }, + { E1, { "mcl_bows:arrow", 8, 12 } }, + }, + + { + { { "mcl_core:gravel", 10, 10, "mcl_core:emerald", 1, 1 }, { "mcl_core:flint", 6, 10 } }, + { { "mcl_core:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } }, + }, + } + }, + shepherd ={ + name = N("Shepherd"), + texture = "mobs_mc_villager_farmer.png", + trades = { + { + { { "mcl_wool:white", 16, 22 }, E1 }, + { { "mcl_core:emerald", 3, 4 }, { "mcl_tools:shears", 1, 1 } }, + }, + + { + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:white", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:grey", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:silver", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:black", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:yellow", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:orange", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:red", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:magenta", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:purple", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:blue", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:cyan", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:lime", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:green", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:pink", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:light_blue", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:brown", 1, 1 } }, + }, + }, + }, + librarian = { + name = N("Librarian"), + texture = "mobs_mc_villager_librarian.png", + trades = { + { + { { "mcl_core:paper", 24, 36 }, E1 }, + -- TODO: enchanted book + { { "mcl_books:book", 8, 10 }, E1 }, + { { "mcl_core:emerald", 10, 12 }, { "mcl_compass:compass", 1 ,1 }}, + { { "mcl_core:emerald", 3, 4 }, { "mcl_books:bookshelf", 1 ,1 }}, + }, + + { + { { "mcl_books:written_book", 2, 2 }, E1 }, + { { "mcl_core:emerald", 10, 12 }, { "mcl_clock:clock", 1, 1 } }, + { E1, { "mcl_core:glass", 3, 5 } }, + }, + + { + { E1, { "mcl_core:glass", 3, 5 } }, + }, + + -- TODO: 2 enchanted book tiers + + { + { { "mcl_core:emerald", 20, 22 }, { "mcl_mobs:nametag", 1, 1 } }, + } + }, + }, + cartographer = { + name = N("Cartographer"), + texture = "mobs_mc_villager_librarian.png", + trades = { + { + { { "mcl_core:paper", 24, 36 }, E1 }, + }, + + { + -- subject to special checks + { { "mcl_compass:compass", 1, 1 }, E1 }, + }, + + { + -- TODO: replace with empty map + { { "mcl_core:emerald", 7, 11}, { "mcl_maps:filled_map", 1, 1 } }, + }, + + -- TODO: special maps + }, + }, + armorer = { + name = N("Armorer"), + texture = "mobs_mc_villager_smith.png", + trades = { + { + { { "mcl_core:coal_lump", 16, 24 }, E1 }, + { { "mcl_core:emerald", 4, 6 }, { "mcl_armor:helmet_iron", 1, 1 } }, + }, + + { + { { "mcl_core:iron_ingot", 7, 9 }, E1 }, + { { "mcl_core:emerald", 10, 14 }, { "mcl_armor:chestplate_iron", 1, 1 } }, + }, + + { + { { "mcl_core:diamond", 3, 4 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 16, 19 }, { "mcl_armor:chestplate_diamond", 1, 1 } }, + }, + + { + { { "mcl_core:emerald", 5, 7 }, { "mcl_armor:boots_chain", 1, 1 } }, + { { "mcl_core:emerald", 9, 11 }, { "mcl_armor:leggings_chain", 1, 1 } }, + { { "mcl_core:emerald", 5, 7 }, { "mcl_armor:helmet_chain", 1, 1 } }, + { { "mcl_core:emerald", 11, 15 }, { "mcl_armor:chestplate_chain", 1, 1 } }, + }, + }, + }, + leatherworker = { + name = N("Leatherworker"), + texture = "mobs_mc_villager_butcher.png", + trades = { + { + { { "mcl_mobitems:leather", 9, 12 }, E1 }, + { { "mcl_core:emerald", 2, 4 }, { "mcl_armor:leggings_leather", 2, 4 } }, + }, + + { + -- TODO: enchant + { { "mcl_core:emerald", 7, 12 }, { "mcl_armor:chestplate_leather", 1, 1 } }, + }, + + { + { { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } }, + }, + }, + }, + butcher = { + name = N("Butcher"), + texture = "mobs_mc_villager_butcher.png", + trades = { + { + { { "mcl_mobitems:beef", 14, 18 }, E1 }, + { { "mcl_mobitems:chicken", 14, 18 }, E1 }, + }, + + { + { { "mcl_core:coal_lump", 16, 24 }, E1 }, + { E1, { "mcl_mobitems:cooked_beef", 5, 7 } }, + { E1, { "mcl_mobitems:cooked_chicken", 6, 8 } }, + }, + }, + }, + weapon_smith = { + name = N("Weapon Smith"), + texture = "mobs_mc_villager_smith.png", + trades = { + { + { { "mcl_core:coal_lump", 16, 24 }, E1 }, + { { "mcl_core:emerald", 6, 8 }, { "mcl_tools:axe_iron", 1, 1 } }, + }, + + { + { { "mcl_core:iron_ingot", 7, 9 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 9, 10 }, { "mcl_tools:sword_iron", 1, 1 } }, + }, + + { + { { "mcl_core:diamond", 3, 4 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 12, 15 }, { "mcl_tools:sword_diamond", 1, 1 } }, + -- TODO: enchant + { { "mcl_core:emerald", 9, 12 }, { "mcl_tools:axe_diamond", 1, 1 } }, + }, + }, + }, + tool_smith = { + name = N("Tool Smith"), + texture = "mobs_mc_villager_smith.png", + trades = { + { + { { "mcl_core:coal_lump", 16, 24 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 5, 7 }, { "mcl_tools:shovel_iron", 1, 1 } }, + }, + + { + { { "mcl_core:iron_ingot", 7, 9 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 9, 11 }, { "mcl_tools:pick_iron", 1, 1 } }, + }, + + { + { { "mcl_core:diamond", 3, 4 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 12, 15 }, { "mcl_tools:pick_diamond", 1, 1 } }, + }, + }, + }, + cleric = { + name = N("Cleric"), + texture = "mobs_mc_villager_priest.png", + trades = { + { + { { "mcl_mobitems:rotten_flesh", 36, 40 }, E1 }, + { { "mcl_core:gold_ingot", 8, 10 }, E1 }, + }, + + { + { E1, { "mesecons:redstone", 1, 4 } }, + { E1, { "mcl_dye:blue", 1, 2 } }, + }, + + { + { E1, { "mcl_nether:glowstone", 1, 3 } }, + { { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } }, + TRADE_V6_RED_SANDSTONE, + }, + + -- TODO: Bottle 'o enchanting + }, + }, + nitwit = { + name = N("Nitwit"), + texture = "mobs_mc_villager.png", + -- No trades for nitwit + trades = nil, + } +} + +local profession_names = {} +for id, _ in pairs(professions) do + table.insert(profession_names, id) +end + +local stand_still = function(self) + self.walk_chance = 0 + self.jump = false +end + +local update_max_tradenum = function(self) + if not self._trades then + return + end + local trades = minetest.deserialize(self._trades) + for t=1, #trades do + local trade = trades[t] + if trade.tier > self._max_trade_tier then + self._max_tradenum = t - 1 + return + end + end + self._max_tradenum = #trades +end + +local init_trader_vars = function(self) + if not self._profession then + -- Select random profession from all professions with matching clothing + local texture = self.base_texture[1] + local matches = {} + for prof_id, prof in pairs(professions) do + if texture == prof.texture then + table.insert(matches, prof_id) + end + end + local p = math.random(1, #matches) + self._profession = matches[p] + end + if not self._max_trade_tier then + self._max_trade_tier = 1 + end + if not self._locked_trades then + self._locked_trades = 0 + end + if not self._trading_players then + self._trading_players = {} + end +end + +local init_trades = function(self, inv) + local profession = professions[self._profession] + local trade_tiers = profession.trades + if trade_tiers == nil then + -- Empty trades + self._trades = false + return + end + + local max_tier = #trade_tiers + local trades = {} + for tiernum=1, max_tier do + local tier = trade_tiers[tiernum] + for tradenum=1, #tier do + local trade = tier[tradenum] + local wanted1_item = trade[1][1] + local wanted1_count = math.random(trade[1][2], trade[1][3]) + local offered_item = trade[2][1] + local offered_count = math.random(trade[2][2], trade[2][3]) + + local wanted = { wanted1_item .. " " ..wanted1_count } + if trade[1][4] then + local wanted2_item = trade[1][4] + local wanted2_count = math.random(trade[1][5], trade[1][6]) + table.insert(wanted, wanted2_item .. " " ..wanted2_count) + end + + table.insert(trades, { + wanted = wanted, + offered = offered_item .. " " .. offered_count, + tier = tiernum, -- tier of this trade + traded_once = false, -- true if trade was traded at least once + trade_counter = 0, -- how often the this trade was mate after the last time it got unlocked + locked = false, -- if this trade is locked. Locked trades can't be used + }) + end + end + self._trades = minetest.serialize(trades) +end + +local set_trade = function(trader, player, inv, concrete_tradenum) + local trades = minetest.deserialize(trader._trades) + if not trades then + init_trades(trader) + trades = minetest.deserialize(trader._trades) + if not trades then + minetest.log("error", "[mobs_mc] Failed to select villager trade!") + return + end + end + local name = player:get_player_name() + + -- Stop tradenum from advancing into locked tiers or out-of-range areas + if concrete_tradenum > trader._max_tradenum then + concrete_tradenum = trader._max_tradenum + elseif concrete_tradenum < 1 then + concrete_tradenum = 1 + end + player_tradenum[name] = concrete_tradenum + local trade = trades[concrete_tradenum] + inv:set_stack("wanted", 1, ItemStack(trade.wanted[1])) + inv:set_stack("offered", 1, ItemStack(trade.offered)) + if trade.wanted[2] then + local wanted2 = ItemStack(trade.wanted[2]) + inv:set_stack("wanted", 2, wanted2) + else + inv:set_stack("wanted", 2, "") + end + +end + +local function show_trade_formspec(playername, trader, tradenum) + if not trader._trades then + return + end + if not tradenum then + tradenum = 1 + end + local trades = minetest.deserialize(trader._trades) + local trade = trades[tradenum] + local profession = professions[trader._profession].name + local disabled_img = "" + if trade.locked then + disabled_img = "image[4.3,2.52;1,1;mobs_mc_trading_formspec_disabled.png]".. + "image[4.3,1.1;1,1;mobs_mc_trading_formspec_disabled.png]" + end + local tradeinv_name = "mobs_mc:trade_"..playername + local tradeinv = F("detached:"..tradeinv_name) + + local b_prev, b_next = "", "" + if #trades > 1 then + if tradenum > 1 then + b_prev = "button[1,1;0.5,1;prev_trade;<]" + end + if tradenum < trader._max_tradenum then + b_next = "button[7.26,1;0.5,1;next_trade;>]" + end + end + + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..playername}) + if not inv then + return + end + local wanted1 = inv:get_stack("wanted", 1) + local wanted2 = inv:get_stack("wanted", 2) + local offered = inv:get_stack("offered", 1) + + local w2_formspec = "" + if not wanted2:is_empty() then + w2_formspec = "item_image[3,1;1,1;"..wanted2:to_string().."]" + .."tooltip[3,1;0.8,0.8;"..F(wanted2:get_description()).."]" + end + + local formspec = + "size[9,8.75]" + .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" + ..disabled_img + .."label[4,0;"..F(minetest.colorize("#313131", S(profession))).."]" + .."list[current_player;main;0,4.5;9,3;9]" + .."list[current_player;main;0,7.74;9,1;]" + ..b_prev..b_next + .."["..tradeinv..";wanted;2,1;2,1;]" + .."item_image[2,1;1,1;"..wanted1:to_string().."]" + .."tooltip[2,1;0.8,0.8;"..F(wanted1:get_description()).."]" + ..w2_formspec + .."item_image[5.76,1;1,1;"..offered:to_string().."]" + .."tooltip[5.76,1;0.8,0.8;"..F(offered:get_description()).."]" + .."list["..tradeinv..";input;2,2.5;2,1;]" + .."list["..tradeinv..";output;5.76,2.55;1,1;]" + .."listring["..tradeinv..";output]" + .."listring[current_player;main]" + .."listring["..tradeinv..";input]" + .."listring[current_player;main]" + minetest.sound_play("mobs_mc_villager_trade", {to_player = playername}, true) + minetest.show_formspec(playername, tradeinv_name, formspec) +end + +local update_offer = function(inv, player, sound) + local name = player:get_player_name() + local trader = player_trading_with[name] + local tradenum = player_tradenum[name] + if not trader or not tradenum then + return false + end + local trades = minetest.deserialize(trader._trades) + if not trades then + return false + end + local trade = trades[tradenum] + if not trade then + return false + end + local wanted1, wanted2 = inv:get_stack("wanted", 1), inv:get_stack("wanted", 2) + local input1, input2 = inv:get_stack("input", 1), inv:get_stack("input", 2) + + -- BEGIN OF SPECIAL HANDLING OF COMPASS + -- These 2 functions are a complicated check to check if the input contains a + -- special item which we cannot check directly against their name, like + -- compass. + -- TODO: Remove these check functions when compass and clock are implemented + -- as single items. + local check_special = function(special_item, group, wanted1, wanted2, input1, input2) + if minetest.registered_aliases[special_item] then + special_item = minetest.registered_aliases[special_item] + end + if wanted1:get_name() == special_item then + local check_input = function(input, wanted, group) + return minetest.get_item_group(input:get_name(), group) ~= 0 and input:get_count() >= wanted:get_count() + end + if check_input(input1, wanted1, group) then + return true + elseif check_input(input2, wanted1, group) then + return true + else + return false + end + end + return false + end + -- Apply above function to all items which we consider special. + -- This function succeeds if ANY item check succeeds. + local check_specials = function(wanted1, wanted2, input1, input2) + return check_special(COMPASS, "compass", wanted1, wanted2, input1, input2) + end + -- END OF SPECIAL HANDLING OF COMPASS + + if ( + ((inv:contains_item("input", wanted1) and + (wanted2:is_empty() or inv:contains_item("input", wanted2))) or + -- BEGIN OF SPECIAL HANDLING OF COMPASS + check_specials(wanted1, wanted2, input1, input2)) and + -- END OF SPECIAL HANDLING OF COMPASS + (trade.locked == false)) then + inv:set_stack("output", 1, inv:get_stack("offered", 1)) + if sound then + minetest.sound_play("mobs_mc_villager_accept", {to_player = name}, true) + end + return true + else + inv:set_stack("output", 1, ItemStack("")) + if sound then + minetest.sound_play("mobs_mc_villager_deny", {to_player = name}, true) + end + return false + end +end + +-- Returns a single itemstack in the given inventory to the player's main inventory, or drop it when there's no space left +local function return_item(itemstack, dropper, pos, inv_p) + if dropper:is_player() then + -- Return to main inventory + if inv_p:room_for_item("main", itemstack) then + inv_p:add_item("main", itemstack) + else + -- Drop item on the ground + local v = dropper:get_look_dir() + local p = {x=pos.x, y=pos.y+1.2, z=pos.z} + p.x = p.x+(math.random(1,3)*0.2) + p.z = p.z+(math.random(1,3)*0.2) + local obj = minetest.add_item(p, itemstack) + if obj then + v.x = v.x*4 + v.y = v.y*4 + 2 + v.z = v.z*4 + obj:set_velocity(v) + obj:get_luaentity()._insta_collect = false + end + end + else + -- Fallback for unexpected cases + minetest.add_item(pos, itemstack) + end + return itemstack +end + +local return_fields = function(player) + local name = player:get_player_name() + local inv_t = minetest.get_inventory({type="detached", name = "mobs_mc:trade_"..name}) + local inv_p = player:get_inventory() + if not inv_t or not inv_p then + return + end + for i=1, inv_t:get_size("input") do + local stack = inv_t:get_stack("input", i) + return_item(stack, player, player:get_pos(), inv_p) + stack:clear() + inv_t:set_stack("input", i, stack) + end + inv_t:set_stack("output", 1, "") +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if string.sub(formname, 1, 14) == "mobs_mc:trade_" then + local name = player:get_player_name() + if fields.quit then + -- Get input items back + return_fields(player) + -- Reset internal "trading with" state + local trader = player_trading_with[name] + if trader then + trader._trading_players[name] = nil + end + player_trading_with[name] = nil + elseif fields.next_trade or fields.prev_trade then + local trader = player_trading_with[name] + if not trader or not trader.object:get_luaentity() then + return + end + local trades = trader._trades + if not trades then + return + end + local dir = 1 + if fields.prev_trade then + dir = -1 + end + local tradenum = player_tradenum[name] + dir + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) + if not inv then + return + end + set_trade(trader, player, inv, tradenum) + update_offer(inv, player, false) + show_trade_formspec(name, trader, player_tradenum[name]) + end + end +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + return_fields(player) + player_tradenum[name] = nil + local trader = player_trading_with[name] + if trader then + trader._trading_players[name] = nil + end + player_trading_with[name] = nil + +end) + +-- Return true if player is trading with villager, and the villager entity exists +local trader_exists = function(playername) + local trader = player_trading_with[playername] + return trader ~= nil and trader.object:get_luaentity() ~= nil +end + +local trade_inventory = { + allow_take = function(inv, listname, index, stack, player) + if listname == "input" then + return stack:get_count() + elseif listname == "output" then + if not trader_exists(player:get_player_name()) then + return 0 + end + -- Only allow taking full stack + local count = stack:get_count() + if count == inv:get_stack(listname, index):get_count() then + -- Also update output stack again. + -- If input has double the wanted items, the + -- output will stay because there will be still + -- enough items in input after the trade + local wanted1 = inv:get_stack("wanted", 1) + local wanted2 = inv:get_stack("wanted", 2) + local input1 = inv:get_stack("input", 1) + local input2 = inv:get_stack("input", 2) + wanted1:set_count(wanted1:get_count()*2) + wanted2:set_count(wanted2:get_count()*2) + -- BEGIN OF SPECIAL HANDLING FOR COMPASS + local special_checks = function(wanted1, input1, input2) + if wanted1:get_name() == COMPASS then + local compasses = 0 + if (minetest.get_item_group(input1:get_name(), "compass") ~= 0) then + compasses = compasses + input1:get_count() + end + if (minetest.get_item_group(input2:get_name(), "compass") ~= 0) then + compasses = compasses + input2:get_count() + end + return compasses >= wanted1:get_count() + end + return false + end + -- END OF SPECIAL HANDLING FOR COMPASS + if (inv:contains_item("input", wanted1) and + (wanted2:is_empty() or inv:contains_item("input", wanted2))) + -- BEGIN OF SPECIAL HANDLING FOR COMPASS + or special_checks(wanted1, input1, input2) then + -- END OF SPECIAL HANDLING FOR COMPASS + return -1 + else + -- If less than double the wanted items, + -- remove items from output (final trade, + -- input runs empty) + return count + end + else + return 0 + end + else + return 0 + end + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + if from_list == "input" and to_list == "input" then + return count + elseif from_list == "output" and to_list == "input" then + if not trader_exists(player:get_player_name()) then + return 0 + end + local move_stack = inv:get_stack(from_list, from_index) + if inv:get_stack(to_list, to_index):item_fits(move_stack) then + return count + end + end + return 0 + end, + allow_put = function(inv, listname, index, stack, player) + if listname == "input" then + if not trader_exists(player:get_player_name()) then + return 0 + else + return stack:get_count() + end + else + return 0 + end + end, + on_put = function(inv, listname, index, stack, player) + update_offer(inv, player, true) + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player) + if from_list == "output" and to_list == "input" then + inv:remove_item("input", inv:get_stack("wanted", 1)) + local wanted2 = inv:get_stack("wanted", 2) + if not wanted2:is_empty() then + inv:remove_item("input", inv:get_stack("wanted", 2)) + end + minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}, true) + end + update_offer(inv, player, true) + end, + on_take = function(inv, listname, index, stack, player) + local accept + local name = player:get_player_name() + if listname == "output" then + local wanted1 = inv:get_stack("wanted", 1) + inv:remove_item("input", wanted1) + local wanted2 = inv:get_stack("wanted", 2) + if not wanted2:is_empty() then + inv:remove_item("input", inv:get_stack("wanted", 2)) + end + -- BEGIN OF SPECIAL HANDLING FOR COMPASS + if wanted1:get_name() == COMPASS then + for n=1, 2 do + local input = inv:get_stack("input", n) + if minetest.get_item_group(input:get_name(), "compass") ~= 0 then + input:set_count(input:get_count() - wanted1:get_count()) + inv:set_stack("input", n, input) + break + end + end + end + -- END OF SPECIAL HANDLING FOR COMPASS + local trader = player_trading_with[name] + local tradenum = player_tradenum[name] + local trades + if trader and trader._trades then + trades = minetest.deserialize(trader._trades) + end + if trades then + local trade = trades[tradenum] + local unlock_stuff = false + if not trade.traded_once then + -- Unlock all the things if something was traded + -- for the first time ever + unlock_stuff = true + trade.traded_once = true + elseif trade.trade_counter == 0 and math.random(1,5) == 1 then + -- Otherwise, 20% chance to unlock if used freshly reset trade + unlock_stuff = true + end + local update_formspec = false + if unlock_stuff then + -- First-time trade unlock all trades and unlock next trade tier + if trade.tier + 1 > trader._max_trade_tier then + trader._max_trade_tier = trader._max_trade_tier + 1 + update_max_tradenum(trader) + update_formspec = true + end + for t=1, #trades do + trades[t].locked = false + trades[t].trade_counter = 0 + end + trader._locked_trades = 0 + -- Also heal trader for unlocking stuff + -- TODO: Replace by Regeneration I + trader.health = math.min(trader.hp_max, trader.health + 4) + end + trade.trade_counter = trade.trade_counter + 1 + -- Semi-randomly lock trade for repeated trade (not if there's only 1 trade) + if trader._max_tradenum > 1 then + if trade.trade_counter >= 12 then + trade.locked = true + elseif trade.trade_counter >= 2 then + local r = math.random(1, math.random(4, 10)) + if r == 1 then + trade.locked = true + end + end + end + + if trade.locked then + inv:set_stack("output", 1, "") + update_formspec = true + trader._locked_trades = trader._locked_trades + 1 + -- Check if we managed to lock ALL available trades. Rare but possible. + if trader._locked_trades >= trader._max_tradenum then + -- Emergency unlock! Unlock all other trades except the current one + for t=1, #trades do + if t ~= tradenum then + trades[t].locked = false + trades[t].trade_counter = 0 + end + end + trader._locked_trades = 1 + -- Also heal trader for unlocking stuff + -- TODO: Replace by Regeneration I + trader.health = math.min(trader.hp_max, trader.health + 4) + end + end + trader._trades = minetest.serialize(trades) + if update_formspec then + show_trade_formspec(name, trader, tradenum) + end + else + minetest.log("error", "[mobs_mc] Player took item from trader output but player_trading_with or player_tradenum is nil!") + end + + accept = true + elseif listname == "input" then + update_offer(inv, player, false) + end + if accept then + minetest.sound_play("mobs_mc_villager_accept", {to_player = name}, true) + else + minetest.sound_play("mobs_mc_villager_deny", {to_player = name}, true) + end + end, +} + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + player_tradenum[name] = 1 + player_trading_with[name] = nil + + -- Create or get player-specific trading inventory + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) + if not inv then + inv = minetest.create_detached_inventory("mobs_mc:trade_"..name, trade_inventory, name) + end + inv:set_size("input", 2) + inv:set_size("output", 1) + inv:set_size("wanted", 2) + inv:set_size("offered", 1) +end) + +--[=======[ MOB REGISTRATION AND SPAWNING ]=======] mobs:register_mob("mobs_mc:villager", { type = "npc", + spawn_class = "passive", hp_min = 20, hp_max = 20, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", mesh = "mobs_mc_villager.b3d", textures = { - {"mobs_mc_villager.png"}, - {"mobs_mc_villager_farmer.png"}, - {"mobs_mc_villager_priest.png"}, - {"mobs_mc_villager_librarian.png"}, - {"mobs_mc_villager_butcher.png"}, - {"mobs_mc_villager_smith.png"}, + { + "mobs_mc_villager.png", + "mobs_mc_villager.png", --hat + }, + { + "mobs_mc_villager_farmer.png", + "mobs_mc_villager_farmer.png", --hat + }, + { + "mobs_mc_villager_priest.png", + "mobs_mc_villager_priest.png", --hat + }, + { + "mobs_mc_villager_librarian.png", + "mobs_mc_villager_librarian.png", --hat + }, + { + "mobs_mc_villager_butcher.png", + "mobs_mc_villager_butcher.png", --hat + }, + { + "mobs_mc_villager_smith.png", + "mobs_mc_villager_smith.png", --hat + }, }, visual_size = {x=3, y=3}, makes_footstep_sound = true, walk_velocity = 1.2, run_velocity = 2.4, drops = {}, - sounds = { - random = "Villager1", - death = "Villagerdead", - damage = "Villagerhurt1", - distance = 16, - }, + -- TODO: sounds animation = { - stand_speed = 25, walk_speed = 25, run_speed = 50, - stand_start = 0, stand_end = 0, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, + stand_speed = 25, + stand_start = 40, + stand_end = 59, + walk_speed = 25, + walk_start = 0, + walk_end = 40, + run_speed = 25, + run_start = 0, + run_end = 40, + die_speed = 15, + die_start = 210, + die_end = 220, + die_loop = false, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, view_range = 16, fear_height = 4, - --[[ + jump = true, + walk_chance = DEFAULT_WALK_CHANCE, on_rightclick = function(self, clicker) - local inv - inv = minetest.get_inventory({type="detached", name="trading_inv"}) + -- Initiate trading + local name = clicker:get_player_name() + self._trading_players[name] = true + + init_trader_vars(self) + if self._trades == nil then + init_trades(self) + end + update_max_tradenum(self) + if self._trades == false then + -- Villager has no trades, rightclick is a no-op + return + end + + player_trading_with[name] = self + + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) if not inv then - inv = minetest.create_detached_inventory("trading_inv", { - allow_take = function(inv, listname, index, stack, player) - if listname == "output" then - inv:remove_item("input", inv:get_stack("wanted", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) - end - if listname == "input" or listname == "output" then - --return 1000 - return 0 - else - return 0 - end - end, - allow_put = function(inv, listname, index, stack, player) - if listname == "input" then - return 1000 - else - return 0 - end - end, - on_put = function(inv, listname, index, stack, player) - if inv:contains_item("input", inv:get_stack("wanted", 1)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) - else - inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("Villagerdeny", {to_player = player:get_player_name()}) - end - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if inv:contains_item("input", inv:get_stack("wanted", 1)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) - else - inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("Villagerdeny", {to_player = player:get_player_name()}) - end - end, - on_take = function(inv, listname, index, stack, player) - if inv:contains_item("input", inv:get_stack("wanted", 1)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) - else - inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("Villagerdeny", {to_player = player:get_player_name()}) - - end - end, - }) - end - inv:set_size("input", 1) - inv:set_size("output", 1) - inv:set_size("wanted", 1) - inv:set_size("offered", 1) + return + end - local trades = { - {"default:apple 12", "default:clay_lump 1"}, - {"default:coal_lump 20", "default:clay_lump 1"}, - {"default:paper 30", "default:clay_lump 1"}, - {"mobs:leather 10", "default:clay_lump 1"}, - {"default:book 2", "default:clay_lump 1"}, - {"default:clay_lump 3", "default:clay_lump 1"}, - {"farming:potato 15", "default:clay_lump 1"}, - {"farming:wheat 20", "default:clay_lump 1"}, - {"farming:carrot 15", "default:clay_lump 1"}, - {"farming:melon_8 8", "default:clay_lump 1"}, - {"mobs:rotten_flesh 40", "default:clay_lump 1"}, - {"default:gold_ingot 10", "default:clay_lump 1"}, - {"farming:cotton 10", "default:clay_lump 1"}, - {"wool:white 15", "default:clay_lump 1"}, - {"farming:pumpkin 8", "default:clay_lump 1"}, + set_trade(self, clicker, inv, 1) - {"default:clay_lump 1", "mobs:beef_cooked 5"}, - {"default:clay_lump 1", "mobs:chicken_cooked 7"}, - {"default:clay_lump 1", "farming:cookie 6"}, - {"default:clay_lump 1", "farming:pumpkin_bread 3"}, - {"default:clay_lump 1", "mobs:arrow 10"}, - {"default:clay_lump 3", "mobs:bow_wood 1"}, - {"default:clay_lump 8", "fishing:pole_wood 1"}, - --{"default:clay_lump 4", "potionspack:healthii 1"}, - {"default:clay_lump 1", "cake:cake 1"}, - {"default:clay_lump 10", "mobs:saddle 1"}, - {"default:clay_lump 10", "clock:1 1"}, - {"default:clay_lumpd 10", "compass:0 1"}, - {"default:clay_lump 1", "default:glass 5"}, - {"default:clay_lump 1", "nether:glowstone 3"}, - {"default:clay_lump 3", "mobs:shears 1"}, - {"default:clay_lump 10", "default:sword_diamond 1"}, - {"default:clay_lump 20", "3d_armor:chestplate_diamond 1"}, - } - local tradenum = math.random(#trades) - inv:set_stack("wanted", 1, ItemStack(trades[tradenum][1])) - inv:set_stack("offered", 1, ItemStack(trades[tradenum][2])) - - local formspec = - "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;trading_formspec_bg.png]".. - "bgcolor[#080808BB;true]".. - "listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]" - .."list[detached:trading_inv;wanted;2,1;1,1;]" - .."list[detached:trading_inv;offered;5.75,1;1,1;]" - .."list[detached:trading_inv;input;2,2.5;1,1;]" - .."list[detached:trading_inv;output;5.75,2.5;1,1;]" - minetest.sound_play("Villagertrade", {to_player = clicker:get_player_name()}) - minetest.show_formspec(clicker:get_player_name(), "tradespec", formspec) + show_trade_formspec(name, self) + + -- Behaviour stuff: + -- Make villager look at player and stand still + local selfpos = self.object:get_pos() + local clickerpos = clicker:get_pos() + local dir = vector.direction(selfpos, clickerpos) + self.object:set_yaw(minetest.dir_to_yaw(dir)) + stand_still(self) + end, + + _player_scan_timer = 0, + _trading_players = {}, -- list of playernames currently trading with villager (open formspec) + do_custom = function(self, dtime) + -- Stand still if player is nearby. + if not self._player_scan_timer then + self._player_scan_timer = 0 + end + self._player_scan_timer = self._player_scan_timer + dtime + -- Check infrequently to keep CPU load low + if self._player_scan_timer > PLAYER_SCAN_INTERVAL then + self._player_scan_timer = 0 + local selfpos = self.object:get_pos() + local objects = minetest.get_objects_inside_radius(selfpos, PLAYER_SCAN_RADIUS) + local has_player = false + for o, obj in pairs(objects) do + if obj:is_player() then + has_player = true + break + end + end + if has_player then + minetest.log("verbose", "[mobs_mc] Player near villager found!") + stand_still(self) + else + minetest.log("verbose", "[mobs_mc] No player near villager found!") + self.walk_chance = DEFAULT_WALK_CHANCE + self.jump = true + end + end + end, + + on_spawn = function(self) + init_trader_vars(self) + end, + on_die = function(self, pos) + -- Close open trade formspecs and give input back to players + local trading_players = self._trading_players + for name, _ in pairs(trading_players) do + minetest.close_formspec(name, "mobs_mc:trade_"..name) + local player = minetest.get_player_by_name(name) + if player then + return_fields(player) + end + end end, - - ]] }) + + mobs:spawn_specific("mobs_mc:villager", mobs_mc.spawn.village, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8000, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) --- compatibility -mobs:alias_mob("mobs:villager", "mobs_mc:villager") - -- spawn eggs mobs:register_egg("mobs_mc:villager", S("Villager"), "mobs_mc_spawn_icon_villager.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC mobs loaded") -end diff --git a/mods/ENTITIES/mobs_mc/villager_agent.lua b/mods/ENTITIES/mobs_mc/villager_agent.lua deleted file mode 100644 index e3acc529..00000000 --- a/mods/ENTITIES/mobs_mc/villager_agent.lua +++ /dev/null @@ -1,219 +0,0 @@ ---MCmobs v0.2 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - - ---dofile(minetest.get_modpath("mobs").."/api.lua") - ---################### ---################### AGENT ---################### - -mobs:register_mob("mobs_mc:63agent", { - type = "animal", - passive = true, - runaway = true, - stepheight = 1.2, - hp_min = 30, - hp_max = 60, - armor = 150, - collisionbox = {-0.35, -0.01, -0.35, 0.35, 2, 0.35}, - visual = "mesh", - mesh = "mobs_mc_agent.b3d", - textures = { - {"mobs_mc_agent.png"}, - }, - visual_size = {x=3, y=3}, - walk_velocity = 0.6, - run_velocity = 2, - jump = true, - animation = { - speed_normal = 25, speed_run = 50, - stand_start = 20, stand_end = 60, - walk_start = 0, walk_end = 20, - run_start = 0, run_end = 20, - }, -}) - -mobs:register_egg("mobs_mc:63agent", "Agent", "mobs_mc_spawn_icon_agent.png", 0) - - - -mobs:register_mob("mobs_mc:villager", { - type = "npc", - hp_min = 35, - hp_max = 75, - collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.95, 0.4}, - textures = { - {"mobs_farmer.png"} - }, - visual = "mesh", - mesh = "mobs_villager.x", - makes_footstep_sound = true, - damage = 2, - walk_velocity = 1.2, - run_velocity = 2.4, - damage = 1, - group_attack = true, - attack_type = "dogfight", - drops = { - {name = "default:apple", - chance = 10, - min = 1, - max = 2,}, - }, - armor = 90, - sounds = { - random = "Villager1", - death = "Villagerdead", - damage = "Villagerhurt1", - }, - animation = { - speed_normal = 30, - speed_run = 60, - stand_start = 0, - stand_end = 23, - walk_start = 24, - walk_end = 49, - run_start = 24, - run_end = 49, - hurt_start = 85, - hurt_end = 115, - death_start = 117, - death_end = 145, - shoot_start = 50, - shoot_end = 82, - }, - water_damage = 1, - lava_damage = 5, - light_damage = 0, - view_range = 16, - fear_height = 5, - --[[ - on_rightclick = function(self, clicker) - local inv - inv = minetest.get_inventory({type="detached", name="trading_inv"}) - if not inv then - inv = minetest.create_detached_inventory("trading_inv", { - allow_take = function(inv, listname, index, stack, player) - if listname == "output" then - inv:remove_item("input", inv:get_stack("wanted", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) - end - if listname == "input" or listname == "output" then - --return 1000 - return 0 - else - return 0 - end - end, - allow_put = function(inv, listname, index, stack, player) - if listname == "input" then - return 1000 - else - return 0 - end - end, - on_put = function(inv, listname, index, stack, player) - if inv:contains_item("input", inv:get_stack("wanted", 1)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) - else - inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("Villagerdeny", {to_player = player:get_player_name()}) - end - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if inv:contains_item("input", inv:get_stack("wanted", 1)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) - else - inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("Villagerdeny", {to_player = player:get_player_name()}) - end - end, - on_take = function(inv, listname, index, stack, player) - if inv:contains_item("input", inv:get_stack("wanted", 1)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) - else - inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("Villagerdeny", {to_player = player:get_player_name()}) - - end - end, - }) - end - inv:set_size("input", 1) - inv:set_size("output", 1) - inv:set_size("wanted", 1) - inv:set_size("offered", 1) - - local trades = { - {"default:apple 12", "default:clay_lump 1"}, - {"default:coal_lump 20", "default:clay_lump 1"}, - {"default:paper 30", "default:clay_lump 1"}, - {"mobs:leather 10", "default:clay_lump 1"}, - {"default:book 2", "default:clay_lump 1"}, - {"default:clay_lump 3", "default:clay_lump 1"}, - {"farming:potato 15", "default:clay_lump 1"}, - {"farming:wheat 20", "default:clay_lump 1"}, - {"farming:carrot 15", "default:clay_lump 1"}, - {"farming:melon_8 8", "default:clay_lump 1"}, - {"mobs:rotten_flesh 40", "default:clay_lump 1"}, - {"default:gold_ingot 10", "default:clay_lump 1"}, - {"farming:cotton 10", "default:clay_lump 1"}, - {"wool:white 15", "default:clay_lump 1"}, - {"farming:pumpkin 8", "default:clay_lump 1"}, - - {"default:clay_lump 1", "mobs:beef_cooked 5"}, - {"default:clay_lump 1", "mobs:chicken_cooked 7"}, - {"default:clay_lump 1", "farming:cookie 6"}, - {"default:clay_lump 1", "farming:pumpkin_bread 3"}, - {"default:clay_lump 1", "mobs:arrow 10"}, - {"default:clay_lump 3", "mobs:bow_wood 1"}, - {"default:clay_lump 8", "fishing:pole_wood 1"}, - --{"default:clay_lump 4", "potionspack:healthii 1"}, - {"default:clay_lump 1", "cake:cake 1"}, - {"default:clay_lump 10", "mobs:saddle 1"}, - {"default:clay_lump 10", "clock:1 1"}, - {"default:clay_lumpd 10", "compass:0 1"}, - {"default:clay_lump 1", "default:glass 5"}, - {"default:clay_lump 1", "nether:glowstone 3"}, - {"default:clay_lump 3", "mobs:shears 1"}, - {"default:clay_lump 10", "default:sword_diamond 1"}, - {"default:clay_lump 20", "3d_armor:chestplate_diamond 1"}, - } - local tradenum = math.random(#trades) - inv:set_stack("wanted", 1, ItemStack(trades[tradenum][1])) - inv:set_stack("offered", 1, ItemStack(trades[tradenum][2])) - - local formspec = - "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;trading_formspec_bg.png]".. - "bgcolor[#080808BB;true]".. - "listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]" - .."list[detached:trading_inv;wanted;2,1;1,1;]" - .."list[detached:trading_inv;offered;5.75,1;1,1;]" - .."list[detached:trading_inv;input;2,2.5;1,1;]" - .."list[detached:trading_inv;output;5.75,2.5;1,1;]" - minetest.sound_play("Villagertrade", {to_player = clicker:get_player_name()}) - minetest.show_formspec(clicker:get_player_name(), "tradespec", formspec) - end, - - ]] -}) - --- compatibility -mobs:alias_mob("mobs:villager", "mobs_mc:villager") - --- spawn eggs -mobs:register_egg("mobs_mc:villager", "Villager", "spawn_egg_villager.png") - - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC mobs loaded") -end diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 567f64dd..3b9b1578 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -3,11 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### EVOKER --################### @@ -16,17 +13,19 @@ local pr = PseudoRandom(os.time()*666) mobs:register_mob("mobs_mc:evoker", { type = "monster", + spawn_class = "hostile", physical = true, pathfinding = 1, hp_min = 24, hp_max = 24, collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.95, 0.4}, visual = "mesh", - mesh = "mobs_mc_evoker.b3d", - textures = { - {"mobs_mc_evoker_base.png"}, + mesh = "mobs_mc_villager.b3d", + textures = { { + "mobs_mc_evoker.png", + "blank.png", --no hat -- TODO: Attack glow - }, + } }, visual_size = {x=3, y=3}, makes_footstep_sound = true, damage = 6, @@ -37,7 +36,7 @@ mobs:register_mob("mobs_mc:evoker", { -- Summon vexes custom_attack = function(self, to_attack) local r = pr:next(2,4) - local basepos = self.object:getpos() + local basepos = self.object:get_pos() basepos.y = basepos.y + 1 for i=1, r do local spawnpos = vector.add(basepos, minetest.yaw_to_dir(pr:next(0,360))) @@ -60,39 +59,25 @@ mobs:register_mob("mobs_mc:evoker", { min = 1, max = 1,}, }, - sounds = { - random = "Villagerdead", - death = "Villagerdead", - damage = "mese_dragon", - attack = "zombiedeath", - distance = 16, - }, + -- TODO: sounds animation = { - walk_speed = 25, - run_speed = 25, + stand_speed = 25, stand_start = 40, stand_end = 59, - stand_speed = 5, + walk_speed = 25, walk_start = 0, walk_end = 40, - shoot_start = 60, - shoot_end = 80, - -- TODO: Implement and fix death animation - --die_start = 80, - --die_end = 130, - --die_loop = false, + run_speed = 25, + shoot_start = 120, --magic arm swinging + shoot_end = 140, + die_speed = 15, + die_start = 190, + die_end = 200, + die_loop = false, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, view_range = 16, fear_height = 4, }) -- spawn eggs mobs:register_egg("mobs_mc:evoker", S("Evoker"), "mobs_mc_spawn_icon_evoker.png", 0) - - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Evoker loaded") -end diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index 8907ac53..0e41f4e9 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -3,50 +3,59 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") +local mod_bows = minetest.get_modpath("mcl_bows") ~= nil mobs:register_mob("mobs_mc:illusioner", { type = "monster", + spawn_class = "hostile", attack_type = "shoot", - shoot_interval = 0.5, - arrow = "mobs_mc:arrow_entity", + shoot_interval = 2.5, shoot_offset = 1.5, + arrow = "mcl_bows:arrow_entity", + shoot_arrow = function(self, pos, dir) + if mod_bows then + -- 1-4 damage per arrow + local dmg = math.random(1, 4) + mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + end + end, hp_min = 32, hp_max = 32, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", mesh = "mobs_mc_illusioner.b3d", - textures = { - {"mobs_mc_illusionist.png^mobs_mc_illusionist_bow.png"}, + textures = { { + "mobs_mc_illusionist.png", + "mobs_mc_illusionist.png", --hat + "mcl_bows_bow.png", + }, }, + sounds = { + -- TODO: more sounds + distance = 16, }, visual_size = {x=3, y=3}, walk_velocity = 0.6, run_velocity = 2, jump = true, animation = { - walk_speed = 25, - run_speed = 25, + stand_speed = 25, stand_start = 40, stand_end = 59, + walk_speed = 25, walk_start = 0, walk_end = 40, - shoot_start = 90, - shoot_end = 110, - -- TODO: Implement and fix death animation - --die_start = 110, - --die_end = 130, - --die_loop = false, - -- 60-80 magic arm swinging, 80-90 transition between magic to bow shooting + run_speed = 25, + shoot_start = 150, + shoot_end = 170, + die_speed = 15, + die_start = 170, + die_end = 180, + die_loop = false, + -- 120-140 magic arm swinging, 140-150 transition between magic to bow shooting }, view_range = 16, fear_height = 4, - lava_damage = 4, }) mobs:register_egg("mobs_mc:illusioner", S("Illusioner"), "mobs_mc_spawn_icon_illusioner.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Illusioner loaded") -end diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index 4c9dfa52..d7d6f273 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -3,11 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### VINDICATOR --################### @@ -15,6 +12,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:vindicator", { type = "monster", + spawn_class = "hostile", physical = false, pathfinding = 1, hp_min = 24, @@ -22,10 +20,14 @@ mobs:register_mob("mobs_mc:vindicator", { collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", mesh = "mobs_mc_vindicator.b3d", - textures = { - {"mobs_mc_vindicator_axe.png"}, - -- TODO: Glow when attacking (mobs_mc_vindicator.png) - }, + textures = { + { + "mobs_mc_vindicator.png", + "blank.png", --no hat + "default_tool_steelaxe.png", + -- TODO: Glow when attacking (mobs_mc_vindicator.png) + }, + }, visual_size = {x=3, y=3}, makes_footstep_sound = true, damage = 13, @@ -43,29 +45,23 @@ mobs:register_mob("mobs_mc:vindicator", { min = 1, max = 1,}, }, - sounds = { - random = "Villager1", - death = "Villagerdead", - damage = "Villagerhurt1", - }, + -- TODO: sounds animation = { - walk_speed = 25, - run_speed = 25, + stand_speed = 25, stand_start = 40, stand_end = 59, - stand_speed = 5, + walk_speed = 25, walk_start = 0, walk_end = 40, + run_speed = 25, + punch_speed = 25, punch_start = 90, punch_end = 110, - -- TODO: Implement and fix death animation - --die_start = 110, - --die_end = 130, - --die_loop = false, + die_speed = 25, + die_start = 170, + die_end = 180, + die_loop = false, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, view_range = 16, fear_height = 4, @@ -73,7 +69,3 @@ mobs:register_mob("mobs_mc:vindicator", { -- spawn eggs mobs:register_egg("mobs_mc:vindicator", S("Vindicator"), "mobs_mc_spawn_icon_vindicator.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC vindicator loaded") -end diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index b5c079c8..1e874803 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -3,11 +3,9 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") +-- TODO: Turn villagers to zombie villager --################### --################### ZOMBIE VILLAGER @@ -16,12 +14,14 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:villager_zombie", { type = "monster", + spawn_class = "hostile", hp_min = 20, hp_max = 20, + breath_max = -1, armor = 90, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", - mesh = "mobs_mc_zvillager.b3d", + mesh = "mobs_mc_villager_zombie.b3d", textures = { {"mobs_mc_zombie_butcher.png"}, {"mobs_mc_zombie_farmer.png"}, @@ -44,24 +44,21 @@ mobs:register_mob("mobs_mc:villager_zombie", { min = 0, max = 2,}, {name = mobs_mc.items.iron_ingot, - -- approximation to 8.5% - chance = 11, + chance = 120, -- 2.5% / 3 min = 1, max = 1,}, {name = mobs_mc.items.carrot, - -- approximation to 8.5% - chance = 11, + chance = 120, -- 2.5% / 3 min = 1, max = 1,}, {name = mobs_mc.items.potato, - -- approximation to 8.5% - chance = 11, + chance = 120, -- 2.5% / 3 min = 1, max = 1,}, }, sounds = { - random = "mobs_mc_zombie_idle", - war_cry = "mobs_mc_zombie_idle", + random = "mobs_mc_zombie_growl", + war_cry = "mobs_mc_zombie_growl", death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, @@ -76,11 +73,9 @@ mobs:register_mob("mobs_mc:villager_zombie", { run_start = 0, run_end = 20, }, - water_damage = 1, - lava_damage = 5, - light_damage = 1, + sunlight_damage = 1, view_range = 16, - fear_height = 5, + fear_height = 4, }) @@ -88,7 +83,3 @@ mobs:spawn_specific("mobs_mc:villager_zombie", mobs_mc.spawn.village, {"air"}, 0 -- spawn eggs mobs:register_egg("mobs_mc:villager_zombie", S("Zombie Villager"), "mobs_mc_spawn_icon_zombie_villager.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC mobs Zombie Villager loaded") -end diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index 85abbdc2..fcc05627 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -3,11 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### WITCH @@ -18,6 +14,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:witch", { type = "monster", + spawn_class = "hostile", hp_min = 26, hp_max = 26, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, @@ -35,7 +32,7 @@ mobs:register_mob("mobs_mc:witch", { pathfinding = 1, group_attack = true, attack_type = "dogshoot", - arrow = "mobs:potion_arrow", + arrow = "mobs_mc:potion_arrow", shoot_interval = 2.5, shoot_offset = 1, dogshoot_switch = 1, @@ -50,12 +47,7 @@ mobs:register_mob("mobs_mc:witch", { {name = mobs_mc.items.sugar, chance = 8, min = 0, max = 2,}, {name = mobs_mc.items.stick, chance = 4, min = 0, max = 2,}, }, - sounds = { - random = "Villager1", - death = "Villagerdead", - damage = "Villagerhurt1", - distance = 16, - }, + -- TODO: sounds animation = { speed_normal = 30, speed_run = 60, @@ -72,16 +64,13 @@ mobs:register_mob("mobs_mc:witch", { shoot_start = 50, shoot_end = 82, }, - water_damage = 1, - lava_damage = 5, - light_damage = 0, view_range = 16, fear_height = 4, }) --- fireball (weapon) -mobs:register_arrow(":mobs:potion_arrow", { +-- potion projectile (EXPERIMENTAL) +mobs:register_arrow("mobs_mc:potion_arrow", { visual = "sprite", visual_size = {x = 0.5, y = 0.5}, --textures = {"vessels_glass_bottle.png"}, --TODO fix to else if default @@ -96,8 +85,8 @@ mobs:register_arrow(":mobs:potion_arrow", { }, nil) end, - hit_mob = function(self, player) - player:punch(self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 2}, }, nil) @@ -105,7 +94,7 @@ mobs:register_arrow(":mobs:potion_arrow", { -- node hit, bursts into flame hit_node = function(self, pos, node) - --mobs:explosion(pos, 1, 1, 0) + --TODO end }) @@ -113,8 +102,4 @@ mobs:register_arrow(":mobs:potion_arrow", { --mobs:spawn_specific("mobs_mc:witch", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, mobs_mc.spawn_height.water-6, mobs_mc.spawn_height.overworld_max) -- spawn eggs -mobs:register_egg("mobs_mc:witch", S("Witch"), "mobs_mc_spawn_icon_witch.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC mobs loaded") -end +mobs:register_egg("mobs_mc:witch", S("Witch"), "mobs_mc_spawn_icon_witch.png", 0, true) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 21c21f6a..ebbbf92f 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -3,20 +3,15 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") - - --################### --################### WITHER --################### - mobs:register_mob("mobs_mc:wither", { type = "monster", + spawn_class = "hostile", hp_max = 300, hp_min = 300, armor = 80, @@ -33,34 +28,30 @@ mobs:register_mob("mobs_mc:wither", { fear_height = 4, walk_velocity = 2, run_velocity = 4, - stepheight = 1.2, sounds = { shoot_attack = "mobs_mc_ender_dragon_shoot", attack = "mobs_mc_ender_dragon_attack", + -- TODO: sounds distance = 60, }, jump = true, jump_height = 10, - jump_chance = 98, fly = true, dogshoot_switch = 1, dogshoot_count_max =1, attack_animals = true, - floats=1, drops = { {name = mobs_mc.items.nether_star, chance = 1, min = 1, max = 1}, }, - water_damage = 0, lava_damage = 0, - light_damage = 0, + fire_damage = 0, attack_type = "dogshoot", - explosion_radius = 3, - explosion_fire = false, + explosion_strength = 8, dogshoot_stop = true, - arrow = "mobs_mc:fireball", + arrow = "mobs_mc:wither_skull", reach = 5, shoot_interval = 0.5, shoot_offset = -1, @@ -70,88 +61,41 @@ mobs:register_mob("mobs_mc:wither", { walk_start = 0, walk_end = 20, run_start = 0, run_end = 20, }, - blood_amount = 0, }) -mobs:register_arrow("mobs_mc:roar_of_the_dragon", { - visual = "sprite", - visual_size = {x = 1, y = 1}, - textures = {"blank.png"}, - velocity = 10, +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false - on_step = function(self, dtime) - - local pos = self.object:getpos() - - local n = minetest.get_node(pos).name - - if self.timer == 0 then - self.timer = os.time() - end - - if os.time() - self.timer > 8 or minetest.is_protected(pos, "") then - self.object:remove() - end - - local objects = minetest.get_objects_inside_radius(pos, 1) - for _,obj in ipairs(objects) do - local name = obj:get_entity_name() - if name~="mobs_mc:roar_of_the_dragon" and name ~= "mobs_mc:wither" then - obj:set_hp(obj:get_hp()-0.05) - if (obj:get_hp() <= 0) then - if (not obj:is_player()) and name ~= self.object:get_luaentity().name then - obj:remove() - end - end - end - end - - minetest.set_node(pos, {name="air"}) - if math.random(1,2)==1 then - dx = math.random(-1,1) - dy = math.random(-1,1) - dz = math.random(-1,1) - local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} - minetest.set_node(p, {name="air"}) - end - end -}) ---GOOD LUCK LOL! --- fireball (weapon) -mobs:register_arrow(":mobs_mc:fireball", { +mobs:register_arrow("mobs_mc:wither_skull", { visual = "sprite", visual_size = {x = 0.75, y = 0.75}, -- TODO: 3D projectile, replace tetxture textures = {"mobs_mc_TEMP_wither_projectile.png"}, velocity = 6, - -- direct hit, no fire... just plenty of pain + -- direct hit hit_player = function(self, player) - minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 16}) player:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, }, nil) - + mobs:boom(self, self.object:get_pos(), 1) end, - hit_mob = function(self, player) - minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5,max_hear_distance = 16}) - player:punch(self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, }, nil) - + mobs:boom(self, self.object:get_pos(), 1) end, - -- node hit, bursts into flame + -- node hit, explode hit_node = function(self, pos, node) - -- FIXME: Deprecated, switch to mobs:boom instead - mobs:explosion(pos, 3, 0, 1) + mobs:boom(self, pos, 1) end }) ---Spawn egg -mobs:register_egg("mobs_mc:wither", S("Wither"), "mobs_mc_spawn_icon_wither.png", 0) +-- TODO: Add blue wither skull + +--Spawn egg +mobs:register_egg("mobs_mc:wither", S("Wither"), "mobs_mc_spawn_icon_wither.png", 0, true) ---Compatibility -mobs:alias_mob("nssm:mese_dragon", "mobs_mc:wither") diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 7f22ce90..54bb0d41 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -1,8 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") local default_walk_chance = 50 @@ -22,7 +20,8 @@ end -- Wolf local wolf = { type = "animal", - + spawn_class = "passive", + can_despawn = true, hp_min = 8, hp_max = 8, passive = false, @@ -35,24 +34,17 @@ local wolf = { }, visual_size = {x=3, y=3}, makes_footstep_sound = true, - sounds = { - war_cry = "mobs_wolf_attack", - distance = 16, - }, + -- TODO: sounds pathfinding = 1, floats = 1, view_range = 16, walk_chance = default_walk_chance, walk_velocity = 2, run_velocity = 3, - stepheight = 1.1, damage = 4, reach = 2, attack_type = "dogfight", fear_height = 4, - water_damage = 0, - lava_damage = 4, - light_damage = 0, follow = mobs_mc.follow.wolf, on_rightclick = function(self, clicker) -- Try to tame wolf (intentionally does NOT use mobs:feed_tame) @@ -68,7 +60,7 @@ local wolf = { -- 1/3 chance of getting tamed if pr:next(1, 3) == 1 then local yaw = self.object:get_yaw() - dog = minetest.add_entity(self.object:getpos(), "mobs_mc:dog") + dog = minetest.add_entity(self.object:get_pos(), "mobs_mc:dog") dog:set_yaw(yaw) ent = dog:get_luaentity() ent.owner = clicker:get_player_name() @@ -84,6 +76,8 @@ local wolf = { }, jump = true, attacks_monsters = true, + attack_animals = true, + specific_attack = { "player", "mobs_mc:sheep" }, } mobs:register_mob("mobs_mc:wolf", wolf) @@ -121,6 +115,7 @@ end -- Tamed wolf (aka “dog”) local dog = table.copy(wolf) +dog.can_despawn = false dog.passive = true dog.hp_min = 20 dog.hp_max = 20 @@ -133,6 +128,8 @@ dog.owner_loyal = true -- Automatically teleport dog to owner dog.do_custom = mobs_mc.make_owner_teleport_function(12) dog.follow = mobs_mc.follow.dog +dog.attack_animals = nil +dog.specific_attack = nil dog.on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() @@ -207,16 +204,6 @@ end mobs:register_mob("mobs_mc:dog", dog) -- Spawn -mobs:spawn_specific("mobs_mc:wolf", mobs_mc.spawn.wolf, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 9000, 20, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) - --- Compatibility -mobs:alias_mob("mobs:wolf", "mobs_mc:wolf") -mobs:alias_mob("mobs:dog", "mobs_mc:dog") -mobs:alias_mob("esmobs:wolf", "mobs_mc:wolf") -mobs:alias_mob("esmobs:dog", "mobs_mc:dog") +mobs:spawn_specific("mobs_mc:wolf", mobs_mc.spawn.wolf, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 9000, 7, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) mobs:register_egg("mobs_mc:wolf", S("Wolf"), "mobs_mc_spawn_icon_wolf.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Wolf loaded") -end diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 4408a7be..552369b8 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -3,22 +3,47 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### ZOMBIE --################### +local drops_common = { + {name = mobs_mc.items.rotten_flesh, + chance = 1, + min = 0, + max = 2,}, + {name = mobs_mc.items.iron_ingot, + chance = 120, -- 2.5% / 3 + min = 1, + max = 1,}, + {name = mobs_mc.items.carrot, + chance = 120, -- 2.5% / 3 + min = 1, + max = 1,}, + {name = mobs_mc.items.potato, + chance = 120, -- 2.5% / 3 + min = 1, + max = 1,}, +} + +local drops_zombie = table.copy(drops_common) +table.insert(drops_zombie, { + -- Zombie Head + -- TODO: Only drop if killed by charged creeper + name = mobs_mc.items.head_zombie, + chance = 200, -- 0.5% + min = 1, + max = 1, +}) local zombie = { type = "monster", + spawn_class = "hostile", hp_min = 20, hp_max = 20, + breath_max = -1, armor = 90, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", @@ -29,8 +54,8 @@ local zombie = { visual_size = {x=3, y=3}, makes_footstep_sound = true, sounds = { - random = "mobs_mc_zombie_idle", - war_cry = "mobs_mc_zombie_idle", + random = "mobs_mc_zombie_growl", + war_cry = "mobs_mc_zombie_growl", death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, @@ -42,45 +67,16 @@ local zombie = { fear_height = 4, pathfinding = 1, jump = true, - --jump_height = 3, - group_attack = true, - drops = { - {name = mobs_mc.items.rotten_flesh, - chance = 1, - min = 0, - max = 2,}, - {name = mobs_mc.items.iron_ingot, - -- approximation to 8.5% - chance = 11, - min = 1, - max = 1,}, - {name = mobs_mc.items.carrot, - -- approximation to 8.5% - chance = 11, - min = 1, - max = 1,}, - {name = mobs_mc.items.potato, - -- approximation to 8.5% - chance = 11, - min = 1, - max = 1,}, - - -- Head - -- TODO: Only drop if killed by charged creeper - {name = mobs_mc.items.head_zombie, - chance = 200, -- 0.5% - min = 1, - max = 1,}, - }, + jump_height = 4, + group_attack = { "mobs_mc:zombie", "mobs_mc:baby_zombie", "mobs_mc:husk", "mobs_mc:baby_husk" }, + drops = drops_zombie, animation = { speed_normal = 25, speed_run = 50, stand_start = 40, stand_end = 80, walk_start = 0, walk_end = 40, run_start = 0, run_end = 40, }, - lava_damage = 4, - -- TODO: Burn mob only when in direct sunlight - light_damage = 2, + sunlight_damage = 2, view_range = 16, attack_type = "dogfight", } @@ -95,7 +91,7 @@ baby_zombie.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} baby_zombie.visual_size = {x=zombie.visual_size.x/2, y=zombie.visual_size.y/2} baby_zombie.walk_velocity = 1.2 baby_zombie.run_velocity = 2.4 -baby_zombie.light_damage = 0 +baby_zombie.child = 1 mobs:register_mob("mobs_mc:baby_zombie", baby_zombie) @@ -103,8 +99,8 @@ mobs:register_mob("mobs_mc:baby_zombie", baby_zombie) -- Desert variant of the zombie local husk = table.copy(zombie) husk.textures = {{"mobs_mc_husk.png"}} -husk.light_damage = 0 -husk.water_damage = 3 +husk.sunlight_damage = 0 +husk.drops = drops_common -- TODO: Husks avoid water mobs:register_mob("mobs_mc:husk", husk) @@ -116,6 +112,7 @@ baby_husk.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} baby_husk.visual_size = {x=zombie.visual_size.x/2, y=zombie.visual_size.y/2} baby_husk.walk_velocity = 1.2 baby_husk.run_velocity = 2.4 +baby_husk.child = 1 mobs:register_mob("mobs_mc:baby_husk", baby_husk) @@ -128,13 +125,6 @@ mobs:spawn_specific("mobs_mc:baby_zombie", mobs_mc.spawn.solid, {"air"}, 0, 7, 3 mobs:spawn_specific("mobs_mc:husk", mobs_mc.spawn.desert, {"air"}, 0, 7, 30, 6500, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) mobs:spawn_specific("mobs_mc:baby_husk", mobs_mc.spawn.desert, {"air"}, 0, 7, 30, 65000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) --- Compatibility -mobs:alias_mob("mobs:zombie", "mobs_mc:zombie") - -- Spawn eggs mobs:register_egg("mobs_mc:husk", S("Husk"), "mobs_mc_spawn_icon_husk.png", 0) mobs:register_egg("mobs_mc:zombie", S("Zombie"), "mobs_mc_spawn_icon_zombie.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Zombie loaded") -end diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index 3661ec47..bdf97e05 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -3,11 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### ZOMBIE PIGMAN --################### @@ -17,21 +14,27 @@ local pigman = { -- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked type = "animal", passive = false, + spawn_class = "passive", hp_min = 20, hp_max = 20, + breath_max = -1, armor = 90, attack_type = "dogfight", - group_attack = true, + group_attack = { "mobs_mc:pigman", "mobs_mc:baby_pigman" }, damage = 9, reach = 2, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", mesh = "mobs_mc_zombie_pigman.b3d", - textures = {{"mobs_mc_zombie_pigman.png^mobs_mc_zombie_pigman_sword.png"}}, + textures = { { + "blank.png", --baby + "default_tool_goldsword.png", --sword + "mobs_mc_zombie_pigman.png", --pigman + } }, visual_size = {x=3, y=3}, sounds = { - random = "mobs_mc_zombie_idle", - war_cry = "mobs_mc_zombie_idle", + random = "mobs_mc_zombie_growl", + war_cry = "mobs_mc_zombie_growl", death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, @@ -60,15 +63,20 @@ local pigman = { max = 1,}, }, animation = { - stnd_speed = 25, walk_speed = 25, run_speed = 50, punch_speed = 25, - stand_start = 40, stand_end = 80, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - punch_start = 90, punch_end = 130, + stand_speed = 25, + walk_speed = 25, + run_speed = 50, + stand_start = 40, + stand_end = 80, + walk_start = 0, + walk_end = 40, + run_start = 0, + run_end = 40, + punch_start = 90, + punch_end = 130, }, - water_damage = 1, lava_damage = 0, - light_damage = 0, + fire_damage = 0, fear_height = 4, view_range = 16, } @@ -81,10 +89,15 @@ mobs:register_mob("mobs_mc:pigman", pigman) local baby_pigman = table.copy(pigman) baby_pigman.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} baby_pigman.visual_size = {x=pigman.visual_size.x/2, y=pigman.visual_size.y/2} -baby_pigman.textures = {{"mobs_mc_zombie_pigman.png"}} +baby_pigman.textures = { { + "mobs_mc_zombie_pigman.png", --baby + "default_tool_goldsword.png", --sword + "mobs_mc_zombie_pigman.png", --pigman +} } baby_pigman.walk_velocity = 1.2 baby_pigman.run_velocity = 2.4 baby_pigman.light_damage = 0 +baby_pigman.child = 1 mobs:register_mob("mobs_mc:baby_pigman", baby_pigman) @@ -96,12 +109,5 @@ mobs:spawn_specific("mobs_mc:baby_pigman", mobs_mc.spawn.solid, {"air"}, 0, mine -- Spawning in Nether portals in the Overworld mobs:spawn_specific("mobs_mc:pigman", mobs_mc.spawn.nether_portal, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 500, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) --- compatibility -mobs:alias_mob("mobs:pigman", "mobs_mc:pigman") - -- spawn eggs mobs:register_egg("mobs_mc:pigman", S("Zombie Pigman"), "mobs_mc_spawn_icon_zombie_pigman.png", 0) - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "MC Pigmen loaded") -end diff --git a/mods/ENTITIES/mobs_mc_gameconfig/depends.txt b/mods/ENTITIES/mobs_mc_gameconfig/depends.txt index 3b355984..2f89674f 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/depends.txt +++ b/mods/ENTITIES/mobs_mc_gameconfig/depends.txt @@ -1 +1,2 @@ mcl_init +mcl_core diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index a8f403f1..80485d95 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -33,8 +33,8 @@ mobs_mc.override.items = { snowball = "mcl_throwing:snowball", top_snow = "mcl_core:snow", snow_block = "mcl_core:snowblock", - arrow = "mcl_throwing:arrow", - bow = "mcl_throwing:bow", + arrow = "mcl_bows:arrow", + bow = "mcl_bows:bow", head_zombie = "mcl_heads:zombie", head_creeper = "mcl_heads:creeper", head_skeleton = "mcl_heads:skeleton", @@ -44,6 +44,7 @@ mobs_mc.override.items = { shears = "mcl_tools:shears", mushroom_red = "mcl_mushrooms:mushroom_red", + mushroom_brown = "mcl_mushrooms:mushroom_brown", bucket = "mcl_buckets:bucket_empty", grass_block = "mcl_core:dirt_with_grass", string = "mcl_mobitems:string", @@ -55,6 +56,7 @@ mobs_mc.override.items = { gunpowder = "mcl_mobitems:gunpowder", flint_and_steel = "mcl_fire:flint_and_steel", water_source = "mcl_core:water_source", + river_water_source = "mclx_core:river_water_source", black_dye = "mcl_dye:black", poppy = "mcl_flowers:poppy", dandelion = "mcl_flowers:dandelion", @@ -71,7 +73,7 @@ mobs_mc.override.items = { wheat = "mcl_farming:wheat_item", cookie = "mcl_farming:cookie", potato = "mcl_farming:potato_item", - hay_bale = "mcl_farming:hay_bale", + hay_bale = "mcl_farming:hay_block", prismarine_shard = "mcl_ocean:prismarine_shard", prismarine_crystals = "mcl_ocean:prismarine_crystals", apple = "mcl_core:apple", @@ -83,6 +85,7 @@ mobs_mc.override.items = { nether_brick_block = "mcl_nether:nether_brick", netherrack = "mcl_nether:netherrack", nether_star = "mcl_mobitems:nether_star", + nether_portal = "mcl_portals:portal", mycelium = "mcl_core:mycelium", carrot = "mcl_farming:carrot_item", golden_carrot = "mcl_farming:carrot_item_gold", @@ -114,9 +117,11 @@ mobs_mc.override.items = { wool_light_blue = "mcl_wool:light_blue", music_discs = { - -- Music discs 2, 3 and 5 intentionally left out for the temporary crafting recipes "mcl_jukebox:record_1", + "mcl_jukebox:record_2", + "mcl_jukebox:record_3", "mcl_jukebox:record_4", + "mcl_jukebox:record_5", "mcl_jukebox:record_6", "mcl_jukebox:record_7", "mcl_jukebox:record_8", @@ -132,7 +137,10 @@ mobs_mc.override.follow = { sheep = { mobs_mc.override.items.wheat }, cow = { mobs_mc.override.items.wheat }, horse = { mobs_mc.override.items.apple, mobs_mc.override.items.sugar, mobs_mc.override.items.wheat, mobs_mc.override.items.hay_bale, mobs_mc.override.items.golden_apple, mobs_mc.override.items.golden_carrot }, + llama = { mobs_mc.override.items.wheat, mobs_mc.override.items.hay_bale }, rabbit = { mobs_mc.override.items.dandelion, mobs_mc.override.items.carrot, mobs_mc.override.items.golden_carrot }, + wolf = { mobs_mc.override.items.bone }, + dog = { mobs_mc.override.items.rabbit_raw, mobs_mc.override.items.rabbit_cooked, mobs_mc.override.items.mutton_raw, mobs_mc.override.items.mutton_cooked, mobs_mc.override.items.beef_raw, mobs_mc.override.items.beef_cooked, mobs_mc.override.items.chicken_raw, mobs_mc.override.items.chicken_cooked, mobs_mc.override.items.rotten_flesh, mobs_mc.override.items.porkchop_raw, mobs_mc.override.items.porkchop_cooked }, } mobs_mc.override.replace = { @@ -168,26 +176,54 @@ mobs_mc.override.enderman_takable = { -- Generic handling, useful for entensions "group:enderman_takable", } +mobs_mc.override.enderman_replace_on_take = { + -- Turn covered dirt blocks to normal dirt. + -- This is a workaround because the dirt with grass texture fails when held by the enderman + -- (because of the node coloring). + -- FIXME: Remove these lines as soon we support rendering dirt with grass + ["mcl_core:dirt_with_grass"] = "mcl_core:dirt", +} +mobs_mc.override.misc = { + totem_fail_nodes = { "mcl_core:void", "mcl_core:realm_barrier" }, +} + +-- Texuture overrides for enderman block. Required for cactus because it's original is a nodebox +-- and the textures have tranparent pixels. +local cbackground = "mobs_mc_gameconfig_enderman_cactus_background.png" +local ctiles = minetest.registered_nodes["mcl_core:cactus"].tiles + +local ctable = {} +local last +for i=1, 6 do + if ctiles[i] then + last = ctiles[i] + end + table.insert(ctable, cbackground .. "^" .. last) +end +mobs_mc.override.enderman_block_texture_overrides = { + ["mcl_core:cactus"] = ctable, +} -- List of nodes on which mobs can spawn mobs_mc.override.spawn = { solid = { "group:solid", }, -- spawn on "solid" nodes - grassland = { mobs_mc.override.items.grass_block }, - savanna = { "group:sand", "mcl_core:sandstone", "mcl_core:redsandstone" }, - grassland_savanna = { mobs_mc.override.items.grass_block, "group:sand", "mcl_core:sandstone", "mcl_core:redsandstone" }, - desert = { "group:sand" }, - jungle = { "mcl_core:podzol", "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern" }, + grassland = { "mcl_core:dirt_with_grass" }, + savanna = { "mcl_core:dirt_with_grass" }, + grassland_savanna = { "mcl_core:dirt_with_grass" }, + desert = { "mcl_core:sand", "mcl_core:sandstone" }, + jungle = { "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern", "mcl_core:vine" }, snow = { "mcl_core:snow", "mcl_core:snowblock", "mcl_core:dirt_with_grass_snow" }, - end_city = { "mcl_end:purpur_block" }, - nether = { "mcl_nether:netherrack", "mcl_nether:quartz_ore" }, + -- End stone added for shulkers because End cities don't generate yet + end_city = { "mcl_end:end_stone", "mcl_end:purpur_block" }, -- Netherrack added because there are no Nether fortresses yet. TODO: Remove netherrac from list as soon they're available nether_fortress = { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, + nether_portal = { mobs_mc.override.items.nether_portal }, wolf = { mobs_mc.override.items.grass_block, "mcl_core:dirt", "mcl_core:dirt_with_grass_snow", "mcl_core:snow", "mcl_core:snowblock", "mcl_core:podzol" }, } -- This table contains important spawn height references for the mob spawn height. mobs_mc.override.spawn_height = { - water = tonumber(minetest.setting_get("water_level")) or 0, -- Water level in the Overworld + water = tonumber(minetest.settings:get("water_level")) or 0, -- Water level in the Overworld -- Overworld boundaries (inclusive) overworld_min = mcl_vars.mg_overworld_min, diff --git a/mods/ENTITIES/mobs_mc_gameconfig/textures/mobs_mc_gameconfig_enderman_cactus_background.png b/mods/ENTITIES/mobs_mc_gameconfig/textures/mobs_mc_gameconfig_enderman_cactus_background.png new file mode 100644 index 00000000..6ec1170e Binary files /dev/null and b/mods/ENTITIES/mobs_mc_gameconfig/textures/mobs_mc_gameconfig_enderman_cactus_background.png differ diff --git a/mods/ENTITIES/modpack.conf b/mods/ENTITIES/modpack.conf new file mode 100644 index 00000000..07731c77 --- /dev/null +++ b/mods/ENTITIES/modpack.conf @@ -0,0 +1,2 @@ +name = ENTITIES +description = Meta-modpack containing entity-related mods for MineClone 2 diff --git a/mods/ENTITIES/modpack.txt b/mods/ENTITIES/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/ENVIRONMENT/lightning/depends.txt b/mods/ENVIRONMENT/lightning/depends.txt index 47738767..356c2f18 100644 --- a/mods/ENVIRONMENT/lightning/depends.txt +++ b/mods/ENVIRONMENT/lightning/depends.txt @@ -1 +1,2 @@ mcl_fire +mcl_death_messages? diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 8ff5855b..ae7c7700 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -1,4 +1,3 @@ - --[[ Copyright (C) 2016 - Auke Kok @@ -10,6 +9,8 @@ of the license, or (at your option) any later version. --]] +local S = minetest.get_translator("lightning") + lightning = {} lightning.interval_low = 17 @@ -34,7 +35,7 @@ local revertsky = function(dtime) return end - skycolor.remove_layer("lightning") + mcl_weather.skycolor.remove_layer("lightning") ps = {} end @@ -54,7 +55,7 @@ local function choose_pos(pos) local r = rng:next(1, playercount) local randomplayer = playerlist[r] - pos = randomplayer:getpos() + pos = randomplayer:get_pos() -- avoid striking underground if pos.y < -20 then @@ -116,14 +117,56 @@ lightning.strike = function(pos) -- to make the texture lightning bolt hit exactly in the middle of the -- texture (e.g. 127/128 on a 256x wide texture) texture = "lightning_lightning_" .. rng:next(1,3) .. ".png", + glow = minetest.LIGHT_MAX, }) - minetest.sound_play({ pos = pos, name = "lightning_thunder", gain = 10, max_hear_distance = 500 }) + minetest.sound_play({ pos = pos, name = "lightning_thunder", gain = 10, max_hear_distance = 500 }, true) - -- damage nearby objects, player or not - for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 5)) do - -- nil as param#1 is supposed to work, but core can't handle it. - obj:punch(obj, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy=8}}, nil) + -- damage nearby objects, transform mobs + local objs = minetest.get_objects_inside_radius(pos2, 3.5) + for o=1, #objs do + local obj = objs[o] + local lua = obj:get_luaentity() + if obj:is_player() then + -- Player damage + if minetest.get_modpath("mcl_death_messages") then + mcl_death_messages.player_damage(obj, S("@1 was struck by lightning.", obj:get_player_name())) + end + obj:set_hp(obj:get_hp()-5, { type = "punch", from = "mod" }) + -- Mobs + elseif lua and lua._cmi_is_mob then + -- pig → zombie pigman (no damage) + if lua.name == "mobs_mc:pig" then + local rot = obj:get_yaw() + obj:remove() + obj = minetest.add_entity(pos2, "mobs_mc:pigman") + obj:set_yaw(rot) + -- mooshroom: toggle color red/brown (no damage) + elseif lua.name == "mobs_mc:mooshroom" then + if lua.base_texture[1] == "mobs_mc_mooshroom.png" then + lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } + else + lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" } + end + obj:set_properties({textures = lua.base_texture}) + -- villager → witch (no damage) + elseif lua.name == "mobs_mc:villager" then + -- Witches are incomplete, this code is unused + -- TODO: Enable this code when witches are working. + --[[ + local rot = obj:get_yaw() + obj:remove() + obj = minetest.add_entity(pos2, "mobs_mc:witch") + obj:set_yaw(rot) + ]] + -- TODO: creeper → charged creeper (no damage) + elseif lua.name == "mobs_mc:creeper" then + + -- Other mobs: Just damage + else + obj:set_hp(obj:get_hp()-5, { type = "punch", from = "mod" }) + end + end end local playerlist = minetest.get_connected_players() @@ -136,20 +179,41 @@ lightning.strike = function(pos) local name = player:get_player_name() if ps[name] == nil then ps[name] = {p = player, sky = sky} - skycolor.add_layer("lightning", {{r=255,g=255,b=255}}, true) - skycolor.active = true + mcl_weather.skycolor.add_layer("lightning", {{r=255,g=255,b=255}}, true) + mcl_weather.skycolor.active = true end end -- trigger revert of skybox ttl = 0.1 - -- set the air node above it on fire + -- Events caused by the lightning strike: Fire, damage, mob transformations, rare skeleton spawn + pos2.y = pos2.y + 1/2 + local skeleton_lightning = false + if rng:next(1,100) <= 3 then + skeleton_lightning = true + end if minetest.get_item_group(minetest.get_node({x = pos2.x, y = pos2.y - 1, z = pos2.z}).name, "liquid") < 1 then if minetest.get_node(pos2).name == "air" then + -- Low chance for a lightning to spawn skeleton horse + skeletons + if skeleton_lightning then + minetest.add_entity(pos2, "mobs_mc:skeleton_horse") + + local angle, posadd + angle = math.random(0, math.pi*2) + for i=1,3 do + posadd = {x=math.cos(angle),y=0,z=math.sin(angle)} + posadd = vector.normalize(posadd) + local mob = minetest.add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton") + mob:set_yaw(angle-math.pi/2) + angle = angle + (math.pi*2) / 3 + end + -- Cause a fire - minetest.set_node(pos2, {name = "mcl_fire:fire"}) + else + minetest.set_node(pos2, {name = "mcl_fire:fire"}) + end end end @@ -162,3 +226,34 @@ minetest.after(5, function(dtime) lightning.interval_high), lightning.strike) end end) + +minetest.register_chatcommand("lightning", { + params = "[ ]", + description = S("Let lightning strike at the specified position or yourself"), + privs = { maphack = true }, + func = function(name, param) + local pos = {} + pos.x, pos.y, pos.z = string.match(param, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") + pos.x = tonumber(pos.x) + pos.y = tonumber(pos.y) + pos.z = tonumber(pos.z) + if not (pos.x and pos.y and pos.z) then + pos = nil + end + if name == "" and pos == nil then + return false, "No position specified and unknown player" + end + if pos then + lightning.strike(pos) + else + local player = minetest.get_player_by_name(name) + if player then + lightning.strike(player:get_pos()) + else + return false, S("No position specified and unknown player") + end + end + return true + end, +}) + diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.de.tr b/mods/ENVIRONMENT/lightning/locale/lightning.de.tr new file mode 100644 index 00000000..a76c6809 --- /dev/null +++ b/mods/ENVIRONMENT/lightning/locale/lightning.de.tr @@ -0,0 +1,4 @@ +# textdomain: lightning +@1 was struck by lightning.=@1 wurde vom Blitz getroffen. +Let lightning strike at the specified position or yourself=Lassen Sie einen Blitz an die gegebene Position oder auf sich selbst einschlagen. +No position specified and unknown player=Keine Position angegeben und Spieler nicht bekannt diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.es.tr b/mods/ENVIRONMENT/lightning/locale/lightning.es.tr new file mode 100644 index 00000000..5d207a5c --- /dev/null +++ b/mods/ENVIRONMENT/lightning/locale/lightning.es.tr @@ -0,0 +1,4 @@ +# textdomain: lightning +@1 was struck by lightning.=@ 1 fue alcanzado por un rayo. +Let lightning strike at the specified position or yourself=Deje que un rayo golpee en la posición especificada o sobre usted mismo. +No position specified and unknown player=Ninguna posición especificada y jugador desconocido diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.fr.tr b/mods/ENVIRONMENT/lightning/locale/lightning.fr.tr new file mode 100644 index 00000000..18c61d51 --- /dev/null +++ b/mods/ENVIRONMENT/lightning/locale/lightning.fr.tr @@ -0,0 +1,4 @@ +# textdomain: lightning +@1 was struck by lightning.=@1 a été frappé par la foudre. +Let lightning strike at the specified position or yourself=Laissez la foudre frapper à la position spécifiée ou sur vous-même +No position specified and unknown player=Aucune position spécifiée et joueur inconnu diff --git a/mods/ENVIRONMENT/lightning/locale/template.txt b/mods/ENVIRONMENT/lightning/locale/template.txt new file mode 100644 index 00000000..2c07393f --- /dev/null +++ b/mods/ENVIRONMENT/lightning/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: lightning +@1 was struck by lightning.= +Let lightning strike at the specified position or yourself= +No position specified and unknown player= diff --git a/mods/ENVIRONMENT/lightning/textures/lightning_lightning_1.png b/mods/ENVIRONMENT/lightning/textures/lightning_lightning_1.png index 37af59e0..5f6c6086 100644 Binary files a/mods/ENVIRONMENT/lightning/textures/lightning_lightning_1.png and b/mods/ENVIRONMENT/lightning/textures/lightning_lightning_1.png differ diff --git a/mods/ENVIRONMENT/lightning/textures/lightning_lightning_2.png b/mods/ENVIRONMENT/lightning/textures/lightning_lightning_2.png index 7bab36b7..cb6cc837 100644 Binary files a/mods/ENVIRONMENT/lightning/textures/lightning_lightning_2.png and b/mods/ENVIRONMENT/lightning/textures/lightning_lightning_2.png differ diff --git a/mods/ENVIRONMENT/lightning/textures/lightning_lightning_3.png b/mods/ENVIRONMENT/lightning/textures/lightning_lightning_3.png index f090529e..17e1d34e 100644 Binary files a/mods/ENVIRONMENT/lightning/textures/lightning_lightning_3.png and b/mods/ENVIRONMENT/lightning/textures/lightning_lightning_3.png differ diff --git a/mods/ENVIRONMENT/mcl_moon/API.md b/mods/ENVIRONMENT/mcl_moon/API.md new file mode 100644 index 00000000..553df0de --- /dev/null +++ b/mods/ENVIRONMENT/mcl_moon/API.md @@ -0,0 +1,15 @@ +# `mcl_moon` API +This API has one function: + +## `mcl_moon.get_moon_phase()` + +Returns current moon phase (0-7). + +* 0 = Full Moon +* 1 = Waning Gibbous +* 2 = Last Quarter +* 3 = Waning Crescent +* 4 = New Moon +* 5 = Waxing Crescent +* 6 = First Quarter +* 7 = Waxing Gibbous diff --git a/mods/ENVIRONMENT/mcl_moon/init.lua b/mods/ENVIRONMENT/mcl_moon/init.lua new file mode 100644 index 00000000..4ee2623a --- /dev/null +++ b/mods/ENVIRONMENT/mcl_moon/init.lua @@ -0,0 +1,64 @@ +local MOON_PHASES = 8 +local MOON_PHASES_HALF = MOON_PHASES / 2 +local SHEET_W = 4 +local SHEET_H = 2 + +-- Randomize initial moon phase, based on map seed +local phase_offset +local mg_seed = minetest.get_mapgen_setting("seed") +local rand = PseudoRandom(mg_seed) +local phase_offset = rand:next(0, MOON_PHASES - 1) +rand = nil + +minetest.log("info", "[mcl_moon] Moon phase offset of this world: "..phase_offset) + +mcl_moon = {} +mcl_moon.MOON_PHASES = MOON_PHASES + +mcl_moon.get_moon_phase = function() + local after_midday = 0 + -- Moon phase changes after midday + local tod = minetest.get_timeofday() + if tod > 0.5 then + after_midday = 1 + end + return (minetest.get_day_count() + phase_offset + after_midday) % MOON_PHASES +end + +local get_moon_texture = function() + local phase = mcl_moon.get_moon_phase() + local x = phase % MOON_PHASES_HALF + local y + if phase >= MOON_PHASES_HALF then + y = 1 + else + y = 0 + end + return "mcl_moon_moon_phases.png^[sheet:"..SHEET_W.."x"..SHEET_H..":"..x..","..y +end + +local timer = 0 +local last_reported_phase = nil +minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < 8 then + return + end + timer = 0 + local phase = mcl_moon.get_moon_phase() + -- No-op when moon phase didn't change yet + if last_reported_phase == phase then + return + end + minetest.log("info", "[mcl_moon] New moon phase: "..phase) + last_reported_phase = phase + local moon_arg = {texture = get_moon_texture()} + local players = minetest.get_connected_players() + for p=1, #players do + players[p]:set_moon(moon_arg) + end +end) + +minetest.register_on_joinplayer(function(player) + player:set_moon({texture = get_moon_texture(), scale=3.75}) +end) diff --git a/mods/ENVIRONMENT/mcl_moon/mod.conf b/mods/ENVIRONMENT/mcl_moon/mod.conf new file mode 100644 index 00000000..9ff8c04b --- /dev/null +++ b/mods/ENVIRONMENT/mcl_moon/mod.conf @@ -0,0 +1,2 @@ +name = mcl_moon +description = Adds moon phases to the game diff --git a/mods/ENVIRONMENT/mcl_moon/textures/mcl_moon_moon_phases.png b/mods/ENVIRONMENT/mcl_moon/textures/mcl_moon_moon_phases.png new file mode 100644 index 00000000..d2ee963a Binary files /dev/null and b/mods/ENVIRONMENT/mcl_moon/textures/mcl_moon_moon_phases.png differ diff --git a/mods/ENVIRONMENT/mcl_void_damage/depends.txt b/mods/ENVIRONMENT/mcl_void_damage/depends.txt new file mode 100644 index 00000000..e134aeef --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/depends.txt @@ -0,0 +1,2 @@ +mcl_worlds +mcl_death_messages diff --git a/mods/ENVIRONMENT/mcl_void_damage/description.txt b/mods/ENVIRONMENT/mcl_void_damage/description.txt new file mode 100644 index 00000000..ac7e3d8c --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/description.txt @@ -0,0 +1 @@ +Deal damage to entities stuck in the deep void diff --git a/mods/ENVIRONMENT/mcl_void_damage/init.lua b/mods/ENVIRONMENT/mcl_void_damage/init.lua new file mode 100644 index 00000000..f4824414 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/init.lua @@ -0,0 +1,82 @@ +local S = minetest.get_translator("mcl_void_damage") +local enable_damage = minetest.settings:get_bool("enable_damage") + +local voidtimer = 0 +local VOID_DAMAGE_FREQ = 0.5 +local VOID_DAMAGE = 4 + +-- Remove entities that fall too deep into the void +minetest.register_on_mods_loaded(function() + -- We do this by overwriting on_step of all entities + for entitystring, def in pairs(minetest.registered_entities) do + local on_step_old = def.on_step + if not on_step_old then + on_step_old = function() end + end + local on_step = function(self, dtime) + on_step_old(self, dtime) + local obj = self.object + local pos = obj:get_pos() + -- Old on_step function might have deleted object, + -- so we delete it + if not pos then + return + end + + if not self._void_timer then + self._void_timer = 0 + end + self._void_timer = self._void_timer + dtime + if self._void_timer <= VOID_DAMAGE_FREQ then + return + end + self._void_timer = 0 + + local pos = obj:get_pos() + local void, void_deadly = mcl_worlds.is_in_void(pos) + if void_deadly then + local ent = obj:get_luaentity() + obj:remove() + return + end + end + def.on_step = on_step + minetest.register_entity(":"..entitystring, def) + end +end) + +-- Hurt players or teleport them back to spawn if they are too deep in the void +minetest.register_globalstep(function(dtime) + voidtimer = voidtimer + dtime + if voidtimer > VOID_DAMAGE_FREQ then + voidtimer = 0 + local enable_damage = minetest.settings:get_bool("enable_damage") + local players = minetest.get_connected_players() + for p=1, #players do + local player = players[p] + local pos = player:get_pos() + local void, void_deadly = mcl_worlds.is_in_void(pos) + if void_deadly then + local immortal_val = player:get_armor_groups().immortal + local is_immortal = false + if immortal_val and immortal_val > 0 then + is_immortal = true + end + if is_immortal or not enable_damage then + -- If damage is disabled, we can't kill players. + -- So we just teleport the player back to spawn. + local spawn = mcl_spawn.get_spawn_pos(player) + player:set_pos(spawn) + mcl_worlds.dimension_change(player, mcl_worlds.pos_to_dimension(spawn)) + minetest.chat_send_player(player:get_player_name(), S("The void is off-limits to you!")) + elseif enable_damage and not is_immortal then + -- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds) + if player:get_hp() > 0 then + mcl_death_messages.player_damage(player, S("@1 fell into the endless void.", player:get_player_name())) + player:set_hp(player:get_hp() - VOID_DAMAGE) + end + end + end + end + end +end) diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.de.tr b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.de.tr new file mode 100644 index 00000000..19ef9065 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_void_damage +The void is off-limits to you!=Die Leere ist für Sie tabu! +@1 fell into the endless void.=@1 fiel in die endlose Leere. diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.es.tr b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.es.tr new file mode 100644 index 00000000..73d7d065 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.es.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_void_damage +The void is off-limits to you!=¡El vacío está fuera de tus límites! +@1 fell into the endless void.=@1 cayó en el vacío infinito. diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.fr.tr b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.fr.tr new file mode 100644 index 00000000..515d1c99 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.fr.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_void_damage +The void is off-limits to you!=Le vide vous est interdit! +@1 fell into the endless void.=@1 est tombé dans le vide sans fin. diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/template.txt b/mods/ENVIRONMENT/mcl_void_damage/locale/template.txt new file mode 100644 index 00000000..db9050e2 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_void_damage +The void is off-limits to you!= +@1 fell into the endless void.= diff --git a/mods/ENVIRONMENT/mcl_void_damage/mod.conf b/mods/ENVIRONMENT/mcl_void_damage/mod.conf new file mode 100644 index 00000000..7e0ea4ba --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/mod.conf @@ -0,0 +1 @@ +name = mcl_void_damage diff --git a/mods/ENVIRONMENT/weather_pack/README.md b/mods/ENVIRONMENT/mcl_weather/README.md similarity index 89% rename from mods/ENVIRONMENT/weather_pack/README.md rename to mods/ENVIRONMENT/mcl_weather/README.md index 09d83e3b..08f748df 100644 --- a/mods/ENVIRONMENT/weather_pack/README.md +++ b/mods/ENVIRONMENT/mcl_weather/README.md @@ -1,6 +1,6 @@ -weather-pack +`mcl_weather` ======================= -Weather mod for Minetest (http://minetest.net/) +Weather mod for MineClone 2. Forked from the `weather_pack` mod by xeranas. Weathers included ----------------------- @@ -10,13 +10,13 @@ Weathers included Commands ----------------------- -`set_weather ` requires `weather_manager` privilege. +`weather `, requires `weather_manager` privilege. Dependencies ----------------------- Thunder weather requres [lightning](https://github.com/minetest-mods/lightning) mod. -Configuration properties +Configuration prope, ties ----------------------- Weather mod for indoor check depends on sunlight propogation check. Some nodes (e.g. glass block) propogates sunlight and thus weather particles will go through it. To change that set `weather_allow_override_nodes=true` in `minetest.conf` file. Be aware that just few nodes will be override and these blocks needs to be re-builded to take effect. Maybe in future other 'cheap' way to check indoor will be available. diff --git a/mods/ENVIRONMENT/weather_pack/depends.txt b/mods/ENVIRONMENT/mcl_weather/depends.txt similarity index 64% rename from mods/ENVIRONMENT/weather_pack/depends.txt rename to mods/ENVIRONMENT/mcl_weather/depends.txt index 47f1b63e..0e5110c4 100644 --- a/mods/ENVIRONMENT/weather_pack/depends.txt +++ b/mods/ENVIRONMENT/mcl_weather/depends.txt @@ -1,3 +1,3 @@ mcl_init -mcl_util +mcl_worlds lightning? diff --git a/mods/ENVIRONMENT/mcl_weather/description.txt b/mods/ENVIRONMENT/mcl_weather/description.txt new file mode 100644 index 00000000..3f28b271 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/description.txt @@ -0,0 +1 @@ +Weather and sky handling: Rain, snow, thunderstorm, End and Nether ambience diff --git a/mods/ENVIRONMENT/weather_pack/init.lua b/mods/ENVIRONMENT/mcl_weather/init.lua similarity index 82% rename from mods/ENVIRONMENT/weather_pack/init.lua rename to mods/ENVIRONMENT/mcl_weather/init.lua index f740cc0f..e31331f5 100644 --- a/mods/ENVIRONMENT/weather_pack/init.lua +++ b/mods/ENVIRONMENT/mcl_weather/init.lua @@ -1,4 +1,12 @@ -local modpath = minetest.get_modpath("weather_pack"); +local modpath = minetest.get_modpath("mcl_weather"); + +mcl_weather = {} + +-- If not located then embeded skycolor mod version will be loaded. +if minetest.get_modpath("skycolor") == nil then + dofile(modpath.."/skycolor.lua") +end + dofile(modpath.."/weather_core.lua") dofile(modpath.."/snow.lua") dofile(modpath.."/rain.lua") @@ -6,8 +14,3 @@ dofile(modpath.."/rain.lua") if minetest.get_modpath("lightning") ~= nil then dofile(modpath.."/thunder.lua") end - --- If not located then embeded skycolor mod version will be loaded. -if minetest.get_modpath("skycolor") == nil then - dofile(modpath.."/skycolor.lua") -end diff --git a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.de.tr b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.de.tr new file mode 100644 index 00000000..0fc8330a --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.de.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_weather +Gives ability to control weather=Fähigkeit, das Wetter zu beeinflussen +Changes the weather to the specified parameter.=Ändert das Wetter. +Error: No weather specified.=Fehler: Kein Wetter angegeben. +Error: Invalid parameters.=Fehler: Ungültige Parameter. +Error: Duration can't be less than 1 second.=Fehler: Dauer darf nicht weniger als 1 Sekunde sein. +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=Fehler. Ungültiges Wetter. Benutzen Sie „clear“ (klar), „rain“ (Regen), „snow“ (Schnee) oder „thunder“ (Gewittersturm). +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=Wechselt das Wetter zwischem klaren Wetter und Wetter mit Niederschlag (zufällig Regen, Gewittersturm oder Schnee) diff --git a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.es.tr b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.es.tr new file mode 100644 index 00000000..396b77f0 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.es.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_weather +Gives ability to control weather=Da la capacidad de controlar el clima +Changes the weather to the specified parameter.=Cambia el clima al parámetro especificado. +Error: No weather specified.=Error: no se especificó el clima. +Error: Invalid parameters.=Error: parámetros no válidos. +Error: Duration can't be less than 1 second.=Error: la duración no puede ser inferior a 1 segundo. +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=Error: tiempo especificado no válido. Utilice "clear", "rain", "snow" o "thunder". +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=Alterna entre clima despejado y clima con caída (lluvia al azar, tormenta o nieve) diff --git a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.fr.tr b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.fr.tr new file mode 100644 index 00000000..6fd0b4b5 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.fr.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_weather +Gives ability to control weather=Donne la capacité de contrôler la météo +Changes the weather to the specified parameter.=Modifie la météo au paramètre spécifié. +Error: No weather specified.=Erreur: Aucune météo spécifiée. +Error: Invalid parameters.=Erreur: Paramètres non valides. +Error: Duration can't be less than 1 second.=Erreur: La durée ne peut pas être inférieure à 1 seconde. +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=Erreur: Météo non valide spécifiée. Utilisez "clear" (clair), "rain" (pluie), "snow" (neige) ou "thunder" (tonnerre). +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=Bascule entre temps clair et temps avec chute (au hasard entre pluie, orage ou neige) diff --git a/mods/ENVIRONMENT/mcl_weather/locale/template.txt b/mods/ENVIRONMENT/mcl_weather/locale/template.txt new file mode 100644 index 00000000..03555e47 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: mcl_weather +Gives ability to control weather= +Changes the weather to the specified parameter.= +Error: No weather specified.= +Error: Invalid parameters.= +Error: Duration can't be less than 1 second.= +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.= +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)= diff --git a/mods/ENVIRONMENT/mcl_weather/mod.conf b/mods/ENVIRONMENT/mcl_weather/mod.conf new file mode 100644 index 00000000..4cc16984 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/mod.conf @@ -0,0 +1 @@ +name = mcl_weather diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua new file mode 100644 index 00000000..0dde0d2d --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -0,0 +1,281 @@ +local PARTICLES_COUNT_RAIN = 30 +local PARTICLES_COUNT_THUNDER = 45 + +mcl_weather.rain = { + -- max rain particles created at time + particles_count = PARTICLES_COUNT_RAIN, + + -- flag to turn on/off extinguish fire for rain + extinguish_fire = true, + + -- flag useful when mixing weathers + raining = false, + + -- keeping last timeofday value (rounded). + -- Defaulted to non-existing value for initial comparing. + sky_last_update = -1, + + init_done = false, +} + +mcl_weather.rain.sound_handler = function(player) + return minetest.sound_play("weather_rain", { + to_player = player:get_player_name(), + loop = true, + }) +end + +-- set skybox based on time (uses skycolor api) +mcl_weather.rain.set_sky_box = function() + if mcl_weather.state == "rain" then + mcl_weather.skycolor.add_layer( + "weather-pack-rain-sky", + {{r=0, g=0, b=0}, + {r=85, g=86, b=98}, + {r=135, g=135, b=151}, + {r=85, g=86, b=98}, + {r=0, g=0, b=0}}) + mcl_weather.skycolor.active = true + for _, player in pairs(minetest.get_connected_players()) do + player:set_clouds({color="#5D5D5FE8"}) + end + end +end + +-- creating manually parctiles instead of particles spawner because of easier to control +-- spawn position. +mcl_weather.rain.add_rain_particles = function(player) + + mcl_weather.rain.last_rp_count = 0 + for i=mcl_weather.rain.particles_count, 1,-1 do + local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) + if mcl_weather.is_outdoor({x=random_pos_x, y=random_pos_y, z=random_pos_z}) then + mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 + minetest.add_particle({ + pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, + velocity = {x=0, y=-10, z=0}, + acceleration = {x=0, y=-30, z=0}, + expirationtime = 1.0, + size = math.random(0.5, 3), + collisiondetection = true, + collision_removal = true, + vertical = true, + texture = mcl_weather.rain.get_texture(), + playername = player:get_player_name() + }) + end + end +end + +-- Simple random texture getter +mcl_weather.rain.get_texture = function() + local texture_name + local random_number = math.random() + if random_number > 0.33 then + texture_name = "weather_pack_rain_raindrop_1.png" + elseif random_number > 0.66 then + texture_name = "weather_pack_rain_raindrop_2.png" + else + texture_name = "weather_pack_rain_raindrop_3.png" + end + return texture_name; +end + +-- register player for rain weather. +-- basically needs for origin sky reference and rain sound controls. +mcl_weather.rain.add_player = function(player) + if mcl_weather.players[player:get_player_name()] == nil then + local player_meta = {} + player_meta.origin_sky = {player:get_sky()} + mcl_weather.players[player:get_player_name()] = player_meta + end +end + +-- remove player from player list effected by rain. +-- be sure to remove sound before removing player otherwise soundhandler reference will be lost. +mcl_weather.rain.remove_player = function(player) + local player_meta = mcl_weather.players[player:get_player_name()] + if player_meta ~= nil and player_meta.origin_sky ~= nil then + player:set_clouds({color="#FFF0F0E5"}) + mcl_weather.players[player:get_player_name()] = nil + end +end + +mcl_worlds.register_on_dimension_change(function(player, dimension) + if dimension ~= "overworld" and dimension ~= "void" then + mcl_weather.rain.remove_sound(player) + mcl_weather.rain.remove_player(player) + elseif dimension == "overworld" then + mcl_weather.rain.update_sound(player) + if mcl_weather.rain.raining then + mcl_weather.rain.add_rain_particles(player) + mcl_weather.rain.add_player(player) + end + end +end) + +-- adds and removes rain sound depending how much rain particles around player currently exist. +-- have few seconds delay before each check to avoid on/off sound too often +-- when player stay on 'edge' where sound should play and stop depending from random raindrop appearance. +mcl_weather.rain.update_sound = function(player) + local player_meta = mcl_weather.players[player:get_player_name()] + if player_meta ~= nil then + if player_meta.sound_updated ~= nil and player_meta.sound_updated + 5 > minetest.get_gametime() then + return false + end + + if player_meta.sound_handler ~= nil then + if mcl_weather.rain.last_rp_count == 0 then + minetest.sound_fade(player_meta.sound_handler, -0.5, 0.0) + player_meta.sound_handler = nil + end + elseif mcl_weather.rain.last_rp_count > 0 then + player_meta.sound_handler = mcl_weather.rain.sound_handler(player) + end + + player_meta.sound_updated = minetest.get_gametime() + end +end + +-- rain sound removed from player. +mcl_weather.rain.remove_sound = function(player) + local player_meta = mcl_weather.players[player:get_player_name()] + if player_meta ~= nil and player_meta.sound_handler ~= nil then + minetest.sound_fade(player_meta.sound_handler, -0.5, 0.0) + player_meta.sound_handler = nil + player_meta.sound_updated = nil + end +end + +-- callback function for removing rain +mcl_weather.rain.clear = function() + mcl_weather.rain.raining = false + mcl_weather.rain.sky_last_update = -1 + mcl_weather.rain.init_done = false + mcl_weather.rain.set_particles_mode("rain") + mcl_weather.skycolor.remove_layer("weather-pack-rain-sky") + for _, player in ipairs(minetest.get_connected_players()) do + mcl_weather.rain.remove_sound(player) + mcl_weather.rain.remove_player(player) + end +end + +minetest.register_globalstep(function(dtime) + if mcl_weather.state ~= "rain" then + return false + end + + mcl_weather.rain.make_weather() +end) + +mcl_weather.rain.make_weather = function() + if mcl_weather.rain.init_done == false then + mcl_weather.rain.raining = true + mcl_weather.rain.set_sky_box() + mcl_weather.rain.set_particles_mode(mcl_weather.mode) + mcl_weather.rain.init_done = true + end + + for _, player in ipairs(minetest.get_connected_players()) do + if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then + mcl_weather.rain.remove_sound(player) + return false + end + mcl_weather.rain.add_player(player) + mcl_weather.rain.add_rain_particles(player) + mcl_weather.rain.update_sound(player) + end +end + +-- Switch the number of raindrops: "thunder" for many raindrops, otherwise for normal raindrops +mcl_weather.rain.set_particles_mode = function(mode) + if mode == "thunder" then + mcl_weather.rain.particles_count = PARTICLES_COUNT_THUNDER + else + mcl_weather.rain.particles_count = PARTICLES_COUNT_RAIN + end +end + +if mcl_weather.allow_abm then + -- ABM for extinguish fire + minetest.register_abm({ + label = "Rain extinguishes fire", + nodenames = {"mcl_fire:fire"}, + interval = 2.0, + chance = 2, + action = function(pos, node, active_object_count, active_object_count_wider) + -- Fire is extinguished if in rain or one of 4 neighbors is in rain + if mcl_weather.rain.raining and mcl_weather.rain.extinguish_fire then + local around = { + { x = 0, y = 0, 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 a=1, #around do + local apos = vector.add(pos, around[a]) + if mcl_weather.is_outdoor(apos) then + minetest.remove_node(pos) + minetest.sound_play("fire_extinguish_flame", {pos = pos, max_hear_distance = 8, gain = 0.1}, true) + return + end + end + end + end, + }) + + -- Slowly fill up cauldrons + minetest.register_abm({ + label = "Rain fills cauldrons with water", + nodenames = {"mcl_cauldrons:cauldron", "mcl_cauldrons:cauldron_1", "mcl_cauldrons:cauldron_2"}, + interval = 56.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + -- Rain is equivalent to a water bottle + if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then + if node.name == "mcl_cauldrons:cauldron" then + minetest.set_node(pos, {name="mcl_cauldrons:cauldron_1"}) + elseif node.name == "mcl_cauldrons:cauldron_1" then + minetest.set_node(pos, {name="mcl_cauldrons:cauldron_2"}) + elseif node.name == "mcl_cauldrons:cauldron_2" then + minetest.set_node(pos, {name="mcl_cauldrons:cauldron_3"}) + elseif node.name == "mcl_cauldrons:cauldron_1r" then + minetest.set_node(pos, {name="mcl_cauldrons:cauldron_2r"}) + elseif node.name == "mcl_cauldrons:cauldron_2r" then + minetest.set_node(pos, {name="mcl_cauldrons:cauldron_3r"}) + end + end + end + }) + + -- Wetten the soil + minetest.register_abm({ + label = "Rain hydrates farmland", + nodenames = {"mcl_farming:soil"}, + interval = 22.0, + chance = 3, + action = function(pos, node, active_object_count, active_object_count_wider) + if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then + if node.name == "mcl_farming:soil" then + minetest.set_node(pos, {name="mcl_farming:soil_wet"}) + end + end + end + }) +end + +if mcl_weather.reg_weathers.rain == nil then + mcl_weather.reg_weathers.rain = { + clear = mcl_weather.rain.clear, + light_factor = 0.6, + -- 10min - 20min + min_duration = 600, + max_duration = 1200, + transitions = { + [65] = "none", + [70] = "snow", + [100] = "thunder", + } + } +end diff --git a/mods/ENVIRONMENT/weather_pack/screenshot.png b/mods/ENVIRONMENT/mcl_weather/screenshot.png similarity index 100% rename from mods/ENVIRONMENT/weather_pack/screenshot.png rename to mods/ENVIRONMENT/mcl_weather/screenshot.png diff --git a/mods/ENVIRONMENT/mcl_weather/skycolor.lua b/mods/ENVIRONMENT/mcl_weather/skycolor.lua new file mode 100644 index 00000000..d32c0280 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/skycolor.lua @@ -0,0 +1,224 @@ +mcl_weather.skycolor = { + -- Should be activated before do any effect. + active = true, + + -- To skip update interval + force_update = true, + + -- Update interval. + update_interval = 15, + + -- Main sky colors: starts from midnight to midnight. + -- Please do not set directly. Use add_layer instead. + colors = {}, + + -- min value which will be used in color gradient, usualy its first user given color in 'pure' color. + min_val = 0, + + -- number of colors while constructing gradient of user given colors + max_val = 1000, + + -- Table for tracking layer order + layer_names = {}, + + -- To layer to colors table + add_layer = function(layer_name, layer_color, instant_update) + mcl_weather.skycolor.colors[layer_name] = layer_color + table.insert(mcl_weather.skycolor.layer_names, layer_name) + mcl_weather.skycolor.force_update = true + end, + + current_layer_name = function() + return mcl_weather.skycolor.layer_names[#mcl_weather.skycolor.layer_names] + end, + + -- Retrieve layer from colors table + retrieve_layer = function() + local last_layer = mcl_weather.skycolor.current_layer_name() + return mcl_weather.skycolor.colors[last_layer] + end, + + -- Remove layer from colors table + remove_layer = function(layer_name) + for k, name in ipairs(mcl_weather.skycolor.layer_names) do + if name == layer_name then + table.remove(mcl_weather.skycolor.layer_names, k) + mcl_weather.skycolor.force_update = true + return + end + end + end, + + -- Update sky color. If players not specified update sky for all players. + update_sky_color = function(players) + -- Override day/night ratio as well + players = mcl_weather.skycolor.utils.get_players(players) + for _, player in ipairs(players) do + local pos = player:get_pos() + local dim = mcl_worlds.pos_to_dimension(pos) + if dim == "overworld" then + if (mcl_weather.state == "none") then + -- Clear weather + player:set_sky({ + type = "regular", + sky_color = { + day_sky = "#92B9FF", + day_horizon = "#B4D0FF", + dawn_sky = "#B4BAFA", + dawn_horizon = "#BAC1F0", + night_sky = "#006AFF", + night_horizon = "#4090FF", + }, + clouds = true, + }) + player:set_sun({visible = true, sunrise_visible = true}) + player:set_moon({visible = true}) + player:set_stars({visible = true}) + player:override_day_night_ratio(nil) + else + -- Weather skies + local day_color = mcl_weather.skycolor.get_sky_layer_color(0.5) + local dawn_color = mcl_weather.skycolor.get_sky_layer_color(0.75) + local night_color = mcl_weather.skycolor.get_sky_layer_color(0) + player:set_sky({ type = "regular", + sky_color = { + day_sky = day_color, + day_horizon = day_color, + dawn_sky = dawn_color, + dawn_horizon = dawn_color, + night_sky = night_color, + night_horizon = night_color, + }, + clouds = true, + }) + player:set_sun({visible = false, sunrise_visible = false}) + player:set_moon({visible = false}) + player:set_stars({visible = false}) + + local lf = mcl_weather.get_current_light_factor() + if mcl_weather.skycolor.current_layer_name() == "lightning" then + player:override_day_night_ratio(1) + elseif lf then + local w = minetest.get_timeofday() + local light = (w * (lf*2)) + if light > 1 then + light = 1 - (light - 1) + end + light = (light * lf) + 0.15 + player:override_day_night_ratio(light) + else + player:override_day_night_ratio(nil) + end + end + elseif dim == "end" then + local t = "mcl_playerplus_end_sky.png" + player:set_sky({ type = "skybox", + base_color = "#000000", + textures = {t,t,t,t,t,t}, + clouds = false, + }) + player:set_sun({visible = false , sunrise_visible = false}) + player:set_moon({visible = false}) + player:set_stars({visible = false}) + player:override_day_night_ratio(0.5) + elseif dim == "nether" then + player:set_sky({ type = "plain", + base_color = "#300808", + clouds = false, + }) + player:set_sun({visible = false , sunrise_visible = false}) + player:set_moon({visible = false}) + player:set_stars({visible = false}) + player:override_day_night_ratio(nil) + elseif dim == "void" then + player:set_sky({ type = "plain", + base_color = "#000000", + clouds = false, + }) + player:set_sun({visible = false, sunrise_visible = false}) + player:set_moon({visible = false}) + player:set_stars({visible = false}) + end + end + end, + + -- Returns current layer color in {r, g, b} format + get_sky_layer_color = function(timeofday) + if #mcl_weather.skycolor.layer_names == 0 then + return nil + end + + -- min timeofday value 0; max timeofday value 1. So sky color gradient range will be between 0 and 1 * mcl_weather.skycolor.max_val. + local rounded_time = math.floor(timeofday * mcl_weather.skycolor.max_val) + local color = mcl_weather.skycolor.utils.convert_to_rgb(mcl_weather.skycolor.min_val, mcl_weather.skycolor.max_val, rounded_time, mcl_weather.skycolor.retrieve_layer()) + return color + end, + + utils = { + convert_to_rgb = function(minval, maxval, current_val, colors) + local max_index = #colors - 1 + local val = (current_val-minval) / (maxval-minval) * max_index + 1.0 + local index1 = math.floor(val) + local index2 = math.min(math.floor(val)+1, max_index + 1) + local f = val - index1 + local c1 = colors[index1] + local c2 = colors[index2] + return {r=math.floor(c1.r + f*(c2.r - c1.r)), g=math.floor(c1.g + f*(c2.g-c1.g)), b=math.floor(c1.b + f*(c2.b - c1.b))} + end, + + -- Simply getter. Ether returns user given players list or get all connected players if none provided + get_players = function(players) + if players == nil or #players == 0 then + players = minetest.get_connected_players() + end + return players + end, + + -- Returns first player sky color. I assume that all players are in same color layout. + get_current_bg_color = function() + local players = mcl_weather.skycolor.utils.get_players(nil) + for _, player in ipairs(players) do + return player:get_sky() + end + return nil + end + }, + +} + +local timer = 0 +minetest.register_globalstep(function(dtime) + if mcl_weather.skycolor.active ~= true or #minetest.get_connected_players() == 0 then + return + end + + if mcl_weather.skycolor.force_update then + mcl_weather.skycolor.update_sky_color() + mcl_weather.skycolor.force_update = false + return + end + + -- regular updates based on iterval + timer = timer + dtime; + if timer >= mcl_weather.skycolor.update_interval then + mcl_weather.skycolor.update_sky_color() + timer = 0 + end + +end) + +local initsky = function(player) + if (mcl_weather.skycolor.active) then + mcl_weather.skycolor.force_update = true + end + + -- MC-style clouds: Layer 127, thickness 4, fly to the “West” + player:set_clouds({height=mcl_worlds.layer_to_y(127), speed={x=-2, z=0}, thickness=4, color="#FFF0FEF"}) +end + +minetest.register_on_joinplayer(initsky) +minetest.register_on_respawnplayer(initsky) + +mcl_worlds.register_on_dimension_change(function(player) + mcl_weather.skycolor.update_sky_color({player}) +end) diff --git a/mods/ENVIRONMENT/mcl_weather/snow.lua b/mods/ENVIRONMENT/mcl_weather/snow.lua new file mode 100644 index 00000000..7adfd0d5 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/snow.lua @@ -0,0 +1,97 @@ +mcl_weather.snow = {} + +mcl_weather.snow.particles_count = 15 +mcl_weather.snow.init_done = false + +-- calculates coordinates and draw particles for snow weather +mcl_weather.snow.add_snow_particles = function(player) + mcl_weather.rain.last_rp_count = 0 + for i=mcl_weather.snow.particles_count, 1,-1 do + local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) + random_pos_y = math.random() + math.random(player:get_pos().y - 1, player:get_pos().y + 7) + if minetest.get_node_light({x=random_pos_x, y=random_pos_y, z=random_pos_z}, 0.5) == 15 then + mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 + minetest.add_particle({ + pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, + velocity = {x = math.random(-100,100)*0.001, y = math.random(-300,-100)*0.004, z = math.random(-100,100)*0.001}, + acceleration = {x = 0, y=0, z = 0}, + expirationtime = 8.0, + size = 1, + collisiondetection = true, + collision_removal = true, + object_collision = false, + vertical = false, + texture = mcl_weather.snow.get_texture(), + playername = player:get_player_name() + }) + end + end +end + +mcl_weather.snow.set_sky_box = function() + mcl_weather.skycolor.add_layer( + "weather-pack-snow-sky", + {{r=0, g=0, b=0}, + {r=85, g=86, b=86}, + {r=135, g=135, b=135}, + {r=85, g=86, b=86}, + {r=0, g=0, b=0}}) + mcl_weather.skycolor.active = true + for _, player in pairs(minetest.get_connected_players()) do + player:set_clouds({color="#ADADADE8"}) + end + mcl_weather.skycolor.active = true +end + +mcl_weather.snow.clear = function() + mcl_weather.skycolor.remove_layer("weather-pack-snow-sky") + mcl_weather.snow.init_done = false +end + +-- Simple random texture getter +mcl_weather.snow.get_texture = function() + return "weather_pack_snow_snowflake"..math.random(1,2)..".png" +end + +local timer = 0 +minetest.register_globalstep(function(dtime) + if mcl_weather.state ~= "snow" then + return false + end + + timer = timer + dtime; + if timer >= 0.5 then + timer = 0 + else + return + end + + if mcl_weather.snow.init_done == false then + mcl_weather.snow.set_sky_box() + mcl_weather.snow.init_done = true + end + + for _, player in ipairs(minetest.get_connected_players()) do + if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then + return false + end + mcl_weather.snow.add_snow_particles(player) + end +end) + +-- register snow weather +if mcl_weather.reg_weathers.snow == nil then + mcl_weather.reg_weathers.snow = { + clear = mcl_weather.snow.clear, + light_factor = 0.6, + -- 10min - 20min + min_duration = 600, + max_duration = 1200, + transitions = { + [65] = "none", + [80] = "rain", + [100] = "thunder", + } +} +end + diff --git a/mods/ENVIRONMENT/mcl_weather/sounds/weather_rain.ogg b/mods/ENVIRONMENT/mcl_weather/sounds/weather_rain.ogg new file mode 100644 index 00000000..6216875d Binary files /dev/null and b/mods/ENVIRONMENT/mcl_weather/sounds/weather_rain.ogg differ diff --git a/mods/ENVIRONMENT/weather_pack/textures/weather_pack_rain_raindrop_1.png b/mods/ENVIRONMENT/mcl_weather/textures/weather_pack_rain_raindrop_1.png similarity index 100% rename from mods/ENVIRONMENT/weather_pack/textures/weather_pack_rain_raindrop_1.png rename to mods/ENVIRONMENT/mcl_weather/textures/weather_pack_rain_raindrop_1.png diff --git a/mods/ENVIRONMENT/weather_pack/textures/weather_pack_rain_raindrop_2.png b/mods/ENVIRONMENT/mcl_weather/textures/weather_pack_rain_raindrop_2.png similarity index 100% rename from mods/ENVIRONMENT/weather_pack/textures/weather_pack_rain_raindrop_2.png rename to mods/ENVIRONMENT/mcl_weather/textures/weather_pack_rain_raindrop_2.png diff --git a/mods/ENVIRONMENT/weather_pack/textures/weather_pack_rain_raindrop_3.png b/mods/ENVIRONMENT/mcl_weather/textures/weather_pack_rain_raindrop_3.png similarity index 100% rename from mods/ENVIRONMENT/weather_pack/textures/weather_pack_rain_raindrop_3.png rename to mods/ENVIRONMENT/mcl_weather/textures/weather_pack_rain_raindrop_3.png diff --git a/mods/ENVIRONMENT/weather_pack/textures/weather_pack_snow_snowflake1.png b/mods/ENVIRONMENT/mcl_weather/textures/weather_pack_snow_snowflake1.png similarity index 100% rename from mods/ENVIRONMENT/weather_pack/textures/weather_pack_snow_snowflake1.png rename to mods/ENVIRONMENT/mcl_weather/textures/weather_pack_snow_snowflake1.png diff --git a/mods/ENVIRONMENT/weather_pack/textures/weather_pack_snow_snowflake2.png b/mods/ENVIRONMENT/mcl_weather/textures/weather_pack_snow_snowflake2.png similarity index 100% rename from mods/ENVIRONMENT/weather_pack/textures/weather_pack_snow_snowflake2.png rename to mods/ENVIRONMENT/mcl_weather/textures/weather_pack_snow_snowflake2.png diff --git a/mods/ENVIRONMENT/mcl_weather/thunder.lua b/mods/ENVIRONMENT/mcl_weather/thunder.lua new file mode 100644 index 00000000..b1837f02 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/thunder.lua @@ -0,0 +1,61 @@ +-- turn off lightning mod 'auto mode' +lightning.auto = false + +mcl_weather.thunder = { + next_strike = 0, + min_delay = 3, + max_delay = 12, + init_done = false, +} + +minetest.register_globalstep(function(dtime) + if mcl_weather.get_weather() ~= "thunder" then + return false + end + + mcl_weather.rain.set_particles_mode("thunder") + mcl_weather.rain.make_weather() + + if mcl_weather.thunder.init_done == false then + mcl_weather.skycolor.add_layer( + "weather-pack-thunder-sky", + {{r=0, g=0, b=0}, + {r=40, g=40, b=40}, + {r=85, g=86, b=86}, + {r=40, g=40, b=40}, + {r=0, g=0, b=0}}) + mcl_weather.skycolor.active = true + for _, player in pairs(minetest.get_connected_players()) do + player:set_clouds({color="#3D3D3FE8"}) + end + mcl_weather.thunder.init_done = true + end + + if (mcl_weather.thunder.next_strike <= minetest.get_gametime()) then + lightning.strike() + local delay = math.random(mcl_weather.thunder.min_delay, mcl_weather.thunder.max_delay) + mcl_weather.thunder.next_strike = minetest.get_gametime() + delay + end + +end) + +mcl_weather.thunder.clear = function() + mcl_weather.rain.clear() + mcl_weather.skycolor.remove_layer("weather-pack-thunder-sky") + mcl_weather.skycolor.remove_layer("lightning") + mcl_weather.thunder.init_done = false +end + +-- register thunderstorm weather +if mcl_weather.reg_weathers.thunder == nil then + mcl_weather.reg_weathers.thunder = { + clear = mcl_weather.thunder.clear, + light_factor = 0.33333, + -- 10min - 20min + min_duration = 600, + max_duration = 1200, + transitions = { + [100] = "rain", + } + } +end diff --git a/mods/ENVIRONMENT/mcl_weather/weather_core.lua b/mods/ENVIRONMENT/mcl_weather/weather_core.lua new file mode 100644 index 00000000..fb90aa74 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/weather_core.lua @@ -0,0 +1,272 @@ +local S = minetest.get_translator("mcl_weather") + +-- weather states, 'none' is default, other states depends from active mods +mcl_weather.state = "none" + +-- player list for saving player meta info +mcl_weather.players = {} + +-- default weather recalculation interval +mcl_weather.check_interval = 300 + +-- weather min duration +mcl_weather.min_duration = 600 + +-- weather max duration +mcl_weather.max_duration = 9000 + +-- weather calculated end time +mcl_weather.end_time = nil + +-- registered weathers +mcl_weather.reg_weathers = {} + +-- global flag to disable/enable ABM logic. +mcl_weather.allow_abm = true + +mcl_weather.reg_weathers["none"] = { + min_duration = mcl_weather.min_duration, + max_duration = mcl_weather.max_duration, + light_factor = nil, + transitions = { + [50] = "rain", + [100] = "snow", + }, + clear = function() end, +} + +local storage = minetest.get_mod_storage() +-- Save weather into mod storage, so it can be loaded after restarting the server +local save_weather = function() + storage:set_string("mcl_weather_state", mcl_weather.state) + storage:set_int("mcl_weather_end_time", mcl_weather.end_time) + minetest.log("verbose", "[mcl_weather] Weather data saved: state="..mcl_weather.state.." end_time="..mcl_weather.end_time) +end +minetest.register_on_shutdown(save_weather) + +mcl_weather.get_rand_end_time = function(min_duration, max_duration) + local r + if min_duration ~= nil and max_duration ~= nil then + r = math.random(min_duration, max_duration); + else + r = math.random(mcl_weather.min_duration, mcl_weather.max_duration); + end + return minetest.get_gametime() + r +end + +mcl_weather.get_current_light_factor = function() + if mcl_weather.state == "none" then + return nil + else + return mcl_weather.reg_weathers[mcl_weather.state].light_factor + end +end + +-- Returns true if pos is outdoor. +-- Outdoor is defined as any node in the Overworld under open sky. +-- FIXME: Nodes below glass also count as “outdoor”, this should not be the case. +mcl_weather.is_outdoor = function(pos) + local cpos = {x=pos.x, y=pos.y+1, z=pos.z} + local dim = mcl_worlds.pos_to_dimension(cpos) + if minetest.get_node_light(cpos, 0.5) == 15 and dim == "overworld" then + return true + end + return false +end + +-- checks if player is undewater. This is needed in order to +-- turn off weather particles generation. +mcl_weather.is_underwater = function(player) + local ppos = player:get_pos() + local offset = player:get_eye_offset() + local player_eye_pos = {x = ppos.x + offset.x, + y = ppos.y + offset.y + 1.5, + z = ppos.z + offset.z} + local node_level = minetest.get_node_level(player_eye_pos) + if node_level == 8 or node_level == 7 then + return true + end + return false +end + +-- trying to locate position for particles by player look direction for performance reason. +-- it is costly to generate many particles around player so goal is focus mainly on front view. +mcl_weather.get_random_pos_by_player_look_dir = function(player) + local look_dir = player:get_look_dir() + local player_pos = player:get_pos() + + local random_pos_x = 0 + local random_pos_y = 0 + local random_pos_z = 0 + + if look_dir.x > 0 then + if look_dir.z > 0 then + random_pos_x = math.random() + math.random(player_pos.x - 2.5, player_pos.x + 5) + random_pos_z = math.random() + math.random(player_pos.z - 2.5, player_pos.z + 5) + else + random_pos_x = math.random() + math.random(player_pos.x - 2.5, player_pos.x + 5) + random_pos_z = math.random() + math.random(player_pos.z - 5, player_pos.z + 2.5) + end + else + if look_dir.z > 0 then + random_pos_x = math.random() + math.random(player_pos.x - 5, player_pos.x + 2.5) + random_pos_z = math.random() + math.random(player_pos.z - 2.5, player_pos.z + 5) + else + random_pos_x = math.random() + math.random(player_pos.x - 5, player_pos.x + 2.5) + random_pos_z = math.random() + math.random(player_pos.z - 5, player_pos.z + 2.5) + end + end + + random_pos_y = math.random() + math.random(player_pos.y + 10, player_pos.y + 15) + return random_pos_x, random_pos_y, random_pos_z +end + +minetest.register_globalstep(function(dtime) + if mcl_weather.end_time == nil then + mcl_weather.end_time = mcl_weather.get_rand_end_time() + end + -- recalculate weather + if mcl_weather.end_time <= minetest.get_gametime() then + local changeWeather = minetest.settings:get_bool("mcl_doWeatherCycle") + if changeWeather == nil then + changeWeather = true + end + if changeWeather then + mcl_weather.set_random_weather(mcl_weather.state, mcl_weather.reg_weathers[mcl_weather.state]) + else + mcl_weather.end_time = mcl_weather.get_rand_end_time() + end + end +end) + +-- Sets random weather (which could be 'none' (no weather)). +mcl_weather.set_random_weather = function(weather_name, weather_meta) + if (weather_meta ~= nil) then + local transitions = weather_meta.transitions + local random_roll = math.random(0,100) + local new_weather + for v, weather in pairs(transitions) do + if random_roll < v then + new_weather = weather + break + end + end + if new_weather then + mcl_weather.change_weather(new_weather) + end + end +end + +-- Change weather to new_weather. +-- * explicit_end_time is OPTIONAL. If specified, explicitly set the +-- gametime (minetest.get_gametime) in which the weather ends. +mcl_weather.change_weather = function(new_weather, explicit_end_time) + if (mcl_weather.reg_weathers ~= nil and mcl_weather.reg_weathers[new_weather] ~= nil) then + if (mcl_weather.state ~= nil and mcl_weather.reg_weathers[mcl_weather.state] ~= nil) then + mcl_weather.reg_weathers[mcl_weather.state].clear() + end + mcl_weather.state = new_weather + local weather_meta = mcl_weather.reg_weathers[mcl_weather.state] + if explicit_end_time then + mcl_weather.end_time = explicit_end_time + else + mcl_weather.end_time = mcl_weather.get_rand_end_time(weather_meta.min_duration, weather_meta.max_duration) + end + mcl_weather.skycolor.update_sky_color() + save_weather() + return true + end + return false +end + +mcl_weather.get_weather = function() + return mcl_weather.state +end + +minetest.register_privilege("weather_manager", { + description = S("Gives ability to control weather"), + give_to_singleplayer = false +}) + +-- Weather command definition. Set +minetest.register_chatcommand("weather", { + params = "(clear | rain | snow | thunder) []", + description = S("Changes the weather to the specified parameter."), + privs = {weather_manager = true}, + func = function(name, param) + if (param == "") then + return false, S("Error: No weather specified.") + end + local new_weather, end_time + local parse1, parse2 = string.match(param, "(%w+) ?(%d*)") + if parse1 then + if parse1 == "clear" then + new_weather = "none" + else + new_weather = parse1 + end + else + return false, S("Error: Invalid parameters.") + end + if parse2 then + if type(tonumber(parse2)) == "number" then + local duration = tonumber(parse2) + if duration < 1 then + return false, S("Error: Duration can't be less than 1 second.") + end + end_time = minetest.get_gametime() + duration + end + end + + local success = mcl_weather.change_weather(new_weather, end_time) + if success then + return true + else + return false, S("Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.") + end + end +}) + +minetest.register_chatcommand("toggledownfall", { + params = "", + description = S("Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)"), + privs = {weather_manager = true}, + func = function(name, param) + -- Currently rain/thunder/snow: Set weather to clear + if mcl_weather.state ~= "none" then + return mcl_weather.change_weather("none") + + -- Currently clear: Set weather randomly to rain/thunder/snow + else + local new = { "rain", "thunder", "snow" } + local r = math.random(1, #new) + return mcl_weather.change_weather(new[r]) + end + end +}) + +-- Configuration setting which allows user to disable ABM for weathers (if they use it). +-- Weather mods expected to be use this flag before registering ABM. +local weather_allow_abm = minetest.settings:get_bool("weather_allow_abm") +if weather_allow_abm ~= nil and weather_allow_abm == false then + mcl_weather.allow_abm = false +end + + +local load_weather = function() + local weather = storage:get_string("mcl_weather_state") + if weather and weather ~= "" then + mcl_weather.state = weather + mcl_weather.end_time = storage:get_int("mcl_weather_end_time") + mcl_weather.change_weather(weather, mcl_weather.end_time) + if type(mcl_weather.end_time) ~= "number" then + -- Fallback in case of corrupted end time + mcl_weather.end_time = mcl_weather.min_duration + end + minetest.log("action", "[mcl_weather] Weather restored.") + else + minetest.log("action", "[mcl_weather] No weather data found. Starting with clear weather.") + end +end + +load_weather() diff --git a/mods/ENVIRONMENT/modpack.conf b/mods/ENVIRONMENT/modpack.conf new file mode 100644 index 00000000..8c40cfab --- /dev/null +++ b/mods/ENVIRONMENT/modpack.conf @@ -0,0 +1,2 @@ +name = ENVIRONMENT +description = Meta-modpack containing environment and nature-related mods for MineClone 2 diff --git a/mods/ENVIRONMENT/modpack.txt b/mods/ENVIRONMENT/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/ENVIRONMENT/weather_pack/description.txt b/mods/ENVIRONMENT/weather_pack/description.txt deleted file mode 100644 index 6efa41ed..00000000 --- a/mods/ENVIRONMENT/weather_pack/description.txt +++ /dev/null @@ -1 +0,0 @@ -Set of weathers for minetest. \ No newline at end of file diff --git a/mods/ENVIRONMENT/weather_pack/mod.conf b/mods/ENVIRONMENT/weather_pack/mod.conf deleted file mode 100644 index 7baa0476..00000000 --- a/mods/ENVIRONMENT/weather_pack/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = weather_pack diff --git a/mods/ENVIRONMENT/weather_pack/rain.lua b/mods/ENVIRONMENT/weather_pack/rain.lua deleted file mode 100644 index 18ed0605..00000000 --- a/mods/ENVIRONMENT/weather_pack/rain.lua +++ /dev/null @@ -1,227 +0,0 @@ -rain = { - -- max rain particles created at time - particles_count = 35, - - -- flag to turn on/off extinguish fire for rain - extinguish_fire = true, - - -- flag useful when mixing weathers - raining = false, - - -- keeping last timeofday value (rounded). - -- Defaulted to non-existing value for initial comparing. - sky_last_update = -1, - - init_done = false, -} - -rain.sound_handler = function(player) - return minetest.sound_play("weather_rain", { - object = player, - max_hear_distance = 2, - loop = true, - }) -end - --- set skybox based on time (uses skycolor api) -rain.set_sky_box = function() - skycolor.add_layer( - "weather-pack-rain-sky", - {{r=0, g=0, b=0}, - {r=85, g=86, b=98}, - {r=152, g=150, b=159}, - {r=85, g=86, b=98}, - {r=0, g=0, b=0}}) - skycolor.active = true - for _, player in pairs(minetest.get_connected_players()) do - player:set_clouds({color="#3D3D3FE8"}) - end -end - --- creating manually parctiles instead of particles spawner because of easier to control --- spawn position. -rain.add_rain_particles = function(player) - - rain.last_rp_count = 0 - for i=rain.particles_count, 1,-1 do - local random_pos_x, random_pos_y, random_pos_z = weather.get_random_pos_by_player_look_dir(player) - if minetest.get_node_light({x=random_pos_x, y=random_pos_y, z=random_pos_z}, 0.5) == 15 then - rain.last_rp_count = rain.last_rp_count + 1 - minetest.add_particle({ - pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, - velocity = {x=0, y=-10, z=0}, - acceleration = {x=0, y=-30, z=0}, - expirationtime = 0.2, - size = math.random(0.5, 3), - collisiondetection = true, - collision_removal = true, - vertical = true, - texture = rain.get_texture(), - playername = player:get_player_name() - }) - end - end -end - --- Simple random texture getter -rain.get_texture = function() - local texture_name - local random_number = math.random() - if random_number > 0.33 then - texture_name = "weather_pack_rain_raindrop_1.png" - elseif random_number > 0.66 then - texture_name = "weather_pack_rain_raindrop_2.png" - else - texture_name = "weather_pack_rain_raindrop_3.png" - end - return texture_name; -end - --- register player for rain weather. --- basically needs for origin sky reference and rain sound controls. -rain.add_player = function(player) - if weather.players[player:get_player_name()] == nil then - local player_meta = {} - player_meta.origin_sky = {player:get_sky()} - weather.players[player:get_player_name()] = player_meta - end -end - --- remove player from player list effected by rain. --- be sure to remove sound before removing player otherwise soundhandler reference will be lost. -rain.remove_player = function(player) - local player_meta = weather.players[player:get_player_name()] - if player_meta ~= nil and player_meta.origin_sky ~= nil then - player:set_sky(player_meta.origin_sky[1], player_meta.origin_sky[2], player_meta.origin_sky[3], true) - player:set_clouds({color="#FFF0F0E5"}) - weather.players[player:get_player_name()] = nil - end -end - --- adds and removes rain sound depending how much rain particles around player currently exist. --- have few seconds delay before each check to avoid on/off sound too often --- when player stay on 'edge' where sound should play and stop depending from random raindrop appearance. -rain.update_sound = function(player) - local player_meta = weather.players[player:get_player_name()] - if player_meta ~= nil then - if player_meta.sound_updated ~= nil and player_meta.sound_updated + 5 > os.time() then - return false - end - - if player_meta.sound_handler ~= nil then - if rain.last_rp_count == 0 then - minetest.sound_stop(player_meta.sound_handler) - player_meta.sound_handler = nil - end - elseif rain.last_rp_count > 0 then - player_meta.sound_handler = rain.sound_handler(player) - end - - player_meta.sound_updated = os.time() - end -end - --- rain sound removed from player. -rain.remove_sound = function(player) - local player_meta = weather.players[player:get_player_name()] - if player_meta ~= nil and player_meta.sound_handler ~= nil then - minetest.sound_stop(player_meta.sound_handler) - player_meta.sound_handler = nil - end -end - --- callback function for removing rain -rain.clear = function() - rain.raining = false - rain.sky_last_update = -1 - rain.init_done = false - skycolor.remove_layer("weather-pack-rain-sky") - for _, player in ipairs(minetest.get_connected_players()) do - rain.remove_sound(player) - rain.remove_player(player) - end -end - -minetest.register_globalstep(function(dtime) - if weather.state ~= "rain" then - return false - end - - rain.make_weather() -end) - -rain.make_weather = function() - if rain.init_done == false then - rain.raining = true - rain.set_sky_box() - rain.init_done = true - end - - for _, player in ipairs(minetest.get_connected_players()) do - if (weather.is_underwater(player)) then - return false - end - rain.add_player(player) - rain.add_rain_particles(player) - rain.update_sound(player) - end -end - -if weather.reg_weathers.rain == nil then - weather.reg_weathers.rain = { - chance = 15, - clear = rain.clear - } -end - -if weather.allow_abm then - -- ABM for extinguish fire - minetest.register_abm({ - label = "Rain extinguishes fire", - nodenames = {"mcl_fire:fire"}, - interval = 4.0, - chance = 2, - action = function(pos, node, active_object_count, active_object_count_wider) - if rain.raining and rain.extinguish_fire then - if weather.is_outdoor(pos) then - minetest.remove_node(pos) - minetest.sound_play("fire_extinguish_flame", {pos = pos, max_hear_distance = 16, gain = 0.15}) - end - end - end - }) - - -- Slowly fill up cauldrons - minetest.register_abm({ - label = "Rain fills cauldrons with water", - nodenames = {"mcl_cauldrons:cauldron", "mcl_cauldrons:cauldron_1", "mcl_cauldrons:cauldron_2"}, - interval = 56.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - if rain.raining and weather.is_outdoor(pos) then - if node.name == "mcl_cauldrons:cauldron" then - minetest.set_node(pos, {name="mcl_cauldrons:cauldron_1"}) - elseif node.name == "mcl_cauldrons:cauldron_1" then - minetest.set_node(pos, {name="mcl_cauldrons:cauldron_2"}) - elseif node.name == "mcl_cauldrons:cauldron_2" then - minetest.set_node(pos, {name="mcl_cauldrons:cauldron_3"}) - end - end - end - }) - - -- Wetten the soil - minetest.register_abm({ - label = "Rain hydrates farmland", - nodenames = {"mcl_farming:soil"}, - interval = 22.0, - chance = 3, - action = function(pos, node, active_object_count, active_object_count_wider) - if rain.raining and weather.is_outdoor(pos) then - if node.name == "mcl_farming:soil" then - minetest.set_node(pos, {name="mcl_farming:soil_wet"}) - end - end - end - }) -end diff --git a/mods/ENVIRONMENT/weather_pack/skycolor.lua b/mods/ENVIRONMENT/weather_pack/skycolor.lua deleted file mode 100644 index 6fe3870b..00000000 --- a/mods/ENVIRONMENT/weather_pack/skycolor.lua +++ /dev/null @@ -1,225 +0,0 @@ -skycolor = { - -- Should be activated before do any effect. - active = true, - - -- To skip update interval - force_update = true, - - -- Update interval. - update_interval = 15, - - -- Main sky colors: starts from midnight to midnight. - -- Please do not set directly. Use add_layer instead. - colors = {}, - - -- min value which will be used in color gradient, usualy its first user given color in 'pure' color. - min_val = 0, - - -- number of colors while constructing gradient of user given colors - max_val = 1000, - - -- Enables smooth transition between existing sky color and target. - smooth_transitions = true, - - -- Transition between current sky color and new user given. - transition_in_progress = false, - - -- Transition colors are generated automaticly during initialization. - transition_colors = {}, - - -- Time where transition between current color and user given will be done - transition_time = 15, - - -- Tracks how much time passed during transition - transition_timer = 0, - - -- Table for tracking layer order - layer_names = {}, - - -- To layer to colors table - add_layer = function(layer_name, layer_color, instant_update) - skycolor.colors[layer_name] = layer_color - table.insert(skycolor.layer_names, layer_name) - if (instant_update ~= true) then - skycolor.init_transition() - end - skycolor.force_update = true - end, - - -- Retrieve layer from colors table - retrieve_layer = function() - local last_layer = skycolor.layer_names[#skycolor.layer_names] - return skycolor.colors[last_layer] - end, - - -- Remove layer from colors table - remove_layer = function(layer_name) - for k, name in ipairs(skycolor.layer_names) do - if name == layer_name then - table.remove(skycolor.layer_names, k) - skycolor.force_update = true - return - end - end - end, - - -- Update sky color. If players not specified update sky for all players. - update_sky_color = function(players) - local color = skycolor.current_sky_layer_color() - if (color == nil) then - skycolor.set_default_sky() - return - end - - players = skycolor.utils.get_players(players) - for _, player in ipairs(players) do - local pos = player:getpos() - if pos.y >= mcl_vars.mg_bedrock_overworld_max then - player:set_sky(color, "plain", nil, true) - end - end - end, - - -- Returns current layer color in {r, g, b} format - current_sky_layer_color = function() - if #skycolor.layer_names == 0 then - return nil - end - - -- min timeofday value 0; max timeofday value 1. So sky color gradient range will be between 0 and 1 * skycolor.max_value. - local timeofday = minetest.get_timeofday() - local rounded_time = math.floor(timeofday * skycolor.max_val) - local color = skycolor.utils.convert_to_rgb(skycolor.min_val, skycolor.max_val, rounded_time, skycolor.retrieve_layer()) - return color - end, - - -- Initialy used only on - update_transition_sky_color = function() - if #skycolor.layer_names == 0 then - skycolor.set_default_sky() - return - end - - local multiplier = 100 - local rounded_time = math.floor(skycolor.transition_timer * multiplier) - if rounded_time >= skycolor.transition_time * multiplier then - skycolor.stop_transition() - return - end - - local color = skycolor.utils.convert_to_rgb(0, skycolor.transition_time * multiplier, rounded_time, skycolor.transition_colors) - - local players = skycolor.utils.get_players(nil) - for _, player in ipairs(players) do - local pos = player:getpos() - if pos.y >= mcl_vars.mg_bedrock_overworld_max then - player:set_sky(color, "plain", nil, true) - end - end - end, - - -- Reset sky color to game default. If players not specified update sky for all players. - -- Could be sometimes useful but not recomended to use in general case as there may be other color layers - -- which needs to preserve. - set_default_sky = function(players) - local players = skycolor.utils.get_players(players) - for _, player in ipairs(players) do - local pos = player:getpos() - if pos.y >= mcl_vars.mg_bedrock_overworld_max then - player:set_sky(nil, "regular", nil, true) - end - end - end, - - init_transition = function() - -- sadly default sky returns unpredictible colors so transition mode becomes usable only for user defined color layers - -- Here '2' means that one color layer existed before new added and transition is posible. - if #skycolor.layer_names < 2 then - return - end - - local transition_start_color = skycolor.utils.get_current_bg_color() - if (transition_start_color == nil) then - return - end - local transition_end_color = skycolor.current_sky_layer_color() - skycolor.transition_colors = {transition_start_color, transition_end_color} - skycolor.transition_in_progress = true - end, - - stop_transition = function() - skycolor.transition_in_progress = false - skycolor.transition_colors = {} - skycolor.transition_timer = 0 - end, - - utils = { - convert_to_rgb = function(minval, maxval, current_val, colors) - local max_index = #colors - 1 - local val = (current_val-minval) / (maxval-minval) * max_index + 1.0 - local index1 = math.floor(val) - local index2 = math.min(math.floor(val)+1, max_index + 1) - local f = val - index1 - local c1 = colors[index1] - local c2 = colors[index2] - return {r=math.floor(c1.r + f*(c2.r - c1.r)), g=math.floor(c1.g + f*(c2.g-c1.g)), b=math.floor(c1.b + f*(c2.b - c1.b))} - end, - - -- Simply getter. Ether returns user given players list or get all connected players if none provided - get_players = function(players) - if players == nil or #players == 0 then - players = minetest.get_connected_players() - end - return players - end, - - -- Returns first player sky color. I assume that all players are in same color layout. - get_current_bg_color = function() - local players = skycolor.utils.get_players(nil) - for _, player in ipairs(players) do - return player:get_sky() - end - return nil - end - }, - -} - -local timer = 0 -minetest.register_globalstep(function(dtime) - if skycolor.active ~= true or #minetest.get_connected_players() == 0 then - return - end - - if skycolor.smooth_transitions and skycolor.transition_in_progress then - skycolor.transition_timer = skycolor.transition_timer + dtime - skycolor.update_transition_sky_color() - return - end - - if skycolor.force_update then - skycolor.update_sky_color() - skycolor.force_update = false - return - end - - -- regular updates based on iterval - timer = timer + dtime; - if timer >= skycolor.update_interval then - skycolor.update_sky_color() - timer = 0 - end - -end) - -local initsky = function(player) - if (skycolor.active) then - skycolor.force_update = true - end - - -- MC-style clouds: Layer 127, thickness 4, fly to the “West” - player:set_clouds({height=mcl_util.layer_to_y(127), speed={x=-2, y=0}, thickness=4, color="#FFF0FEF"}) -end - -minetest.register_on_joinplayer(initsky) -minetest.register_on_respawnplayer(initsky) diff --git a/mods/ENVIRONMENT/weather_pack/snow.lua b/mods/ENVIRONMENT/weather_pack/snow.lua deleted file mode 100644 index 7b4ec19d..00000000 --- a/mods/ENVIRONMENT/weather_pack/snow.lua +++ /dev/null @@ -1,90 +0,0 @@ -snow = {} - -snow.particles_count = 15 -snow.init_done = false - --- calculates coordinates and draw particles for snow weather -snow.add_rain_particles = function(player) - rain.last_rp_count = 0 - for i=snow.particles_count, 1,-1 do - local random_pos_x, random_pos_y, random_pos_z = weather.get_random_pos_by_player_look_dir(player) - random_pos_y = math.random() + math.random(player:getpos().y - 1, player:getpos().y + 7) - if minetest.get_node_light({x=random_pos_x, y=random_pos_y, z=random_pos_z}, 0.5) == 15 then - rain.last_rp_count = rain.last_rp_count + 1 - minetest.add_particle({ - pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, - velocity = {x = math.random(-1,-0.5), y = math.random(-2,-1), z = math.random(-1,-0.5)}, - acceleration = {x = math.random(-1,-0.5), y=-0.5, z = math.random(-1,-0.5)}, - expirationtime = 2.0, - size = math.random(0.5, 2), - collisiondetection = true, - collision_removal = true, - vertical = true, - texture = snow.get_texture(), - playername = player:get_player_name() - }) - end - end -end - -snow.set_sky_box = function() - skycolor.add_layer( - "weather-pack-snow-sky", - {{r=0, g=0, b=0}, - {r=241, g=244, b=249}, - {r=0, g=0, b=0}} - ) - skycolor.active = true -end - -snow.clear = function() - skycolor.remove_layer("weather-pack-snow-sky") - snow.init_done = false -end - --- Simple random texture getter -snow.get_texture = function() - local texture_name - local random_number = math.random() - if random_number > 0.5 then - texture_name = "weather_pack_snow_snowflake1.png" - else - texture_name = "weather_pack_snow_snowflake2.png" - end - return texture_name; -end - -local timer = 0 -minetest.register_globalstep(function(dtime) - if weather.state ~= "snow" then - return false - end - - timer = timer + dtime; - if timer >= 0.5 then - timer = 0 - else - return - end - - if snow.init_done == false then - snow.set_sky_box() - snow.init_done = true - end - - for _, player in ipairs(minetest.get_connected_players()) do - if (weather.is_underwater(player)) then - return false - end - snow.add_rain_particles(player) - end -end) - --- register snow weather -if weather.reg_weathers.snow == nil then - weather.reg_weathers.snow = { - chance = 10, - clear = snow.clear - } -end - diff --git a/mods/ENVIRONMENT/weather_pack/sounds/weather_rain.ogg b/mods/ENVIRONMENT/weather_pack/sounds/weather_rain.ogg deleted file mode 100644 index ba2ea272..00000000 Binary files a/mods/ENVIRONMENT/weather_pack/sounds/weather_rain.ogg and /dev/null differ diff --git a/mods/ENVIRONMENT/weather_pack/thunder.lua b/mods/ENVIRONMENT/weather_pack/thunder.lua deleted file mode 100644 index 3ff64539..00000000 --- a/mods/ENVIRONMENT/weather_pack/thunder.lua +++ /dev/null @@ -1,37 +0,0 @@ --- turn off lightning mod 'auto mode' -lightning.auto = false - -thunder = { - next_strike = 0, - min_delay = 3, - max_delay = 12, -} - -minetest.register_globalstep(function(dtime) - if weather.state ~= "thunder" then - return false - end - - rain.make_weather() - - if (thunder.next_strike <= os.time()) then - lightning.strike() - local delay = math.random(thunder.min_delay, thunder.max_delay) - thunder.next_strike = os.time() + delay - end - -end) - -thunder.clear = function() - rain.clear() -end - --- register thunderstorm weather -if weather.reg_weathers.thunder == nil then - weather.reg_weathers.thunder = { - chance = 5, - clear = thunder.clear, - min_duration = 120, - max_duration = 600, - } -end \ No newline at end of file diff --git a/mods/ENVIRONMENT/weather_pack/weather_core.lua b/mods/ENVIRONMENT/weather_pack/weather_core.lua deleted file mode 100644 index 912cf1c0..00000000 --- a/mods/ENVIRONMENT/weather_pack/weather_core.lua +++ /dev/null @@ -1,194 +0,0 @@ -weather = { - -- weather states, 'none' is default, other states depends from active mods - state = "none", - - -- player list for saving player meta info - players = {}, - - -- time when weather should be re-calculated - next_check = 0, - - -- default weather recalculation interval - check_interval = 300, - - -- weather min duration - min_duration = 240, - - -- weather max duration - max_duration = 3600, - - -- weather calculated end time - end_time = nil, - - -- registered weathers - reg_weathers = {}, - - -- automaticly calculates intervals and swap weathers - auto_mode = true, - - -- global flag to disable/enable ABM logic. - allow_abm = true, -} - -weather.get_rand_end_time = function(min_duration, max_duration) - if min_duration ~= nil and max_duration ~= nil then - return os.time() + math.random(min_duration, max_duration); - else - return os.time() + math.random(weather.min_duration, weather.max_duration); - end -end - -weather.is_outdoor = function(pos) - if minetest.get_node_light({x=pos.x, y=pos.y + 1, z=pos.z}, 0.5) == 15 then - return true - end - return false -end - --- checks if player is undewater. This is needed in order to --- turn off weather particles generation. -weather.is_underwater = function(player) - local ppos = player:getpos() - local offset = player:get_eye_offset() - local player_eye_pos = {x = ppos.x + offset.x, - y = ppos.y + offset.y + 1.5, - z = ppos.z + offset.z} - local node_level = minetest.get_node_level(player_eye_pos) - if node_level == 8 or node_level == 7 then - return true - end - return false -end - --- trying to locate position for particles by player look direction for performance reason. --- it is costly to generate many particles around player so goal is focus mainly on front view. -weather.get_random_pos_by_player_look_dir = function(player) - local look_dir = player:get_look_dir() - local player_pos = player:getpos() - - local random_pos_x = 0 - local random_pos_y = 0 - local random_pos_z = 0 - - if look_dir.x > 0 then - if look_dir.z > 0 then - random_pos_x = math.random() + math.random(player_pos.x - 2.5, player_pos.x + 5) - random_pos_z = math.random() + math.random(player_pos.z - 2.5, player_pos.z + 5) - else - random_pos_x = math.random() + math.random(player_pos.x - 2.5, player_pos.x + 5) - random_pos_z = math.random() + math.random(player_pos.z - 5, player_pos.z + 2.5) - end - else - if look_dir.z > 0 then - random_pos_x = math.random() + math.random(player_pos.x - 5, player_pos.x + 2.5) - random_pos_z = math.random() + math.random(player_pos.z - 2.5, player_pos.z + 5) - else - random_pos_x = math.random() + math.random(player_pos.x - 5, player_pos.x + 2.5) - random_pos_z = math.random() + math.random(player_pos.z - 5, player_pos.z + 2.5) - end - end - - random_pos_y = math.random() + math.random(player_pos.y + 1, player_pos.y + 3) - return random_pos_x, random_pos_y, random_pos_z -end - -minetest.register_globalstep(function(dtime) - if weather.auto_mode == false then - return 0 - end - - -- recalculate weather only when there aren't currently any - if (weather.state ~= "none") then - if (weather.end_time ~= nil and weather.end_time <= os.time()) then - weather.reg_weathers[weather.state].clear() - weather.state = "none" - end - elseif (weather.next_check <= os.time()) then - for weather_name, weather_meta in pairs(weather.reg_weathers) do - weather.set_random_weather(weather_name, weather_meta) - end - -- fallback next_check set, weather 'none' will be. - weather.next_check = os.time() + weather.check_interval - end -end) - --- sets random weather (which could be 'regular' (no weather)). -weather.set_random_weather = function(weather_name, weather_meta) - if weather.next_check > os.time() then return 0 end - - if (weather_meta ~= nil and weather_meta.chance ~= nil) then - local random_roll = math.random(0,100) - if (random_roll <= weather_meta.chance) then - weather.state = weather_name - weather.end_time = weather.get_rand_end_time(weather_meta.min_duration, weather_meta.max_duration) - weather.next_check = os.time() + weather.check_interval - end - end -end - -minetest.register_privilege("weather_manager", { - description = "Gives ability to control weather", - give_to_singleplayer = false -}) - --- Weather command definition. Set -minetest.register_chatcommand("weather", { - params = "clear | rain | snow | thunder", - description = "Changes the weather to the specified parameter.", - privs = {weather_manager = true}, - func = function(name, param) - if (param == "") then - minetest.chat_send_player(name, "Error: No weather specified.") - return - end - local success = false - if (param == "clear") then - if (weather.state ~= nil and weather.reg_weathers[weather.state] ~= nil) then - weather.reg_weathers[weather.state].clear() - end - weather.state = "none" - success = true - return - end - - if (weather.reg_weathers ~= nil and weather.reg_weathers[param] ~= nil) then - if (weather.state ~= nil and weather.state ~= "none" and weather.reg_weathers[weather.state] ~= nil) then - weather.reg_weathers[weather.state].clear() - end - weather.state = param - return - else - minetest.chat_send_player(name, "Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.") - end - end -}) - -minetest.register_chatcommand("toggledownfall", { - params = "", - description = "Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)", - privs = {weather_manager = true}, - func = function(name, param) - -- Currently rain/thunder/snow: Set weather to clear - if weather.state ~= "none" then - if (weather.state ~= nil and weather.state ~= "none" and weather.reg_weathers[weather.state] ~= nil) then - weather.reg_weathers[weather.state].clear() - end - weather.state = "none" - -- Currently clear: Set weather randomly to rain/thunder/snow - else - local new = { "rain", "thunder", "snow" } - local r = math.random(1, #new) - if (weather.state ~= nil and weather.state ~= "none" and weather.reg_weathers[weather.state] ~= nil) then - weather.reg_weathers[weather.state].clear() - end - weather.state = new[r] - end - end -}) - --- Configuration setting which allows user to disable ABM for weathers (if they use it). --- Weather mods expected to be use this flag before registering ABM. -local weather_allow_abm = minetest.settings:get_bool("weather_allow_abm") -if weather_allow_abm ~= nil and weather_allow_abm == false then - weather.allow_abm = false -end diff --git a/mods/HELP/doc/doc/API.md b/mods/HELP/doc/doc/API.md index 3c20a12b..49afeb3a 100644 --- a/mods/HELP/doc/doc/API.md +++ b/mods/HELP/doc/doc/API.md @@ -41,7 +41,7 @@ this mod is capable of and how these use cases could be implemented. ### Simple use case: Minetest basics Let's say you want to write in free form short help texts about the basic -concepts of Minetest or your subgame. First you could define a category +concepts of Minetest or your game. First you could define a category called “Basics”, the data for each of its entry is just a free form text. The template function simply creates a formspec where this free form text is displayed. @@ -233,7 +233,7 @@ The help starts with this default order: This function can be called at any time, but it recommended to only call this function once for the entire server session and to only call it -from subgame mods, to avoid contradictions. If this function is called a +from game mods, to avoid contradictions. If this function is called a second time by any mod, a warning is written into the log. #### Parameters @@ -454,10 +454,6 @@ viewed a category as well, both returned values are `nil`. This is a convenience function for creating a special formspec widget. It creates a widget in which you can insert scrollable multi-line text. -As of Minetest 0.4.14, this function is only provided because Minetest lacks -native support for such a widget. When Minetest supports such a widget natively, -this function may become just a simple wrapper. - #### Parameters * `data`: Text to be written inside the widget * `x`: Formspec X coordinate (optional) diff --git a/mods/HELP/doc/doc/README.md b/mods/HELP/doc/doc/README.md index 5731495c..72d2b85f 100644 --- a/mods/HELP/doc/doc/README.md +++ b/mods/HELP/doc/doc/README.md @@ -4,7 +4,7 @@ can access help pages about various things and the modder can add those pages. The mod itself does not provide any help texts, just the framework. It is the heart of the Help modpack, on which the other Help mods depend. -Current version: 1.1.0 +Current version: 1.2.1 ## For players ### Accessing the help @@ -37,9 +37,9 @@ stored in the world directory in the file `doc.mt`. You can safely reset the viewed/revealed state of all players by deleting this file. Players then need to start over revealing all entries. -## For modders and subgame authors +## For modders and game authors This mod helps you in creating extensive and flexible help entries for your -mods or subgame. You can write about basically anything in the presentation +mods or game. You can write about basically anything in the presentation you prefer. To get started, read `API.md` in the directory of this mod. @@ -50,3 +50,8 @@ For custom entities, you may also want to add support for `doc_identifier`. ## License of everything MIT License + +## Translation credits +French: Karamel +German: Wuzzy +Portuguese: BrunoMine diff --git a/mods/HELP/doc/doc/depends.txt b/mods/HELP/doc/doc/depends.txt deleted file mode 100644 index 4907c641..00000000 --- a/mods/HELP/doc/doc/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -intllib? -unified_inventory? -sfinv_buttons? -central_message? -inventory_plus? diff --git a/mods/HELP/doc/doc/description.txt b/mods/HELP/doc/doc/description.txt deleted file mode 100644 index 808a218b..00000000 --- a/mods/HELP/doc/doc/description.txt +++ /dev/null @@ -1 +0,0 @@ -A simple in-game documentation system which enables mods to add help entries based on templates. diff --git a/mods/HELP/doc/doc/init.lua b/mods/HELP/doc/doc/init.lua index b8f82703..360cc149 100644 --- a/mods/HELP/doc/doc/init.lua +++ b/mods/HELP/doc/doc/init.lua @@ -1,16 +1,10 @@ --- Boilerplate to support localized strings if intllib mod is installed. -local S, F -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end -end -F = function(f) return minetest.formspec_escape(S(f)) end +local S = minetest.get_translator("doc") +local F = function(f) return minetest.formspec_escape(S(f)) end -- Compability for 0.4.14 or earlier local colorize -if core.colorize then - colorize = core.colorize +if minetest.colorize then + colorize = minetest.colorize else colorize = function(color, text) return text end end @@ -23,7 +17,7 @@ doc = {} -- Version number (follows the SemVer specification 2.0.0) doc.VERSION = {} doc.VERSION.MAJOR = 1 -doc.VERSION.MINOR = 0 +doc.VERSION.MINOR = 2 doc.VERSION.PATCH = 1 doc.VERSION.STRING = doc.VERSION.MAJOR.."."..doc.VERSION.MINOR.."."..doc.VERSION.PATCH @@ -57,9 +51,6 @@ local CATEGORYFIELDSIZE = { HEIGHT = math.floor(doc.FORMSPEC.HEIGHT-1), } --- Maximum characters per line in the text widget -local TEXT_LINELENGTH = 80 - doc.data = {} doc.data.categories = {} doc.data.aliases = {} @@ -200,7 +191,7 @@ function doc.mark_entry_as_revealed(playername, category_id, entry_id) local last_sound = doc.data.players[playername].last_reveal_sound if last_sound == nil or os.difftime(os.time(), last_sound) >= 1 then -- Play notification sound - minetest.sound_play({ name = "doc_reveal", gain = 0.2 }, { to_player = playername }) + minetest.sound_play({ name = "doc_reveal", gain = 0.2 }, { to_player = playername }, true) doc.data.players[playername].last_reveal_sound = os.time() end end @@ -233,7 +224,7 @@ function doc.mark_all_entries_as_revealed(playername) msg = S("All help entries revealed!") -- Play notification sound (ignore sound limit intentionally) - minetest.sound_play({ name = "doc_reveal", gain = 0.2 }, { to_player = playername }) + minetest.sound_play({ name = "doc_reveal", gain = 0.2 }, { to_player = playername }, true) doc.data.players[playername].last_reveal_sound = os.time() else msg = S("All help entries are already revealed.") @@ -462,66 +453,9 @@ end -- Template function templates, to be used for build_formspec in doc.add_category doc.entry_builders = {} --- Inserts line breaks into a single paragraph and collapses all whitespace (including newlines) --- into spaces -local linebreaker_single = function(text, linelength) - if linelength == nil then - linelength = TEXT_LINELENGTH - end - local remain = linelength - local res = {} - local line = {} - local split = function(s) - local res = {} - for w in string.gmatch(s, "%S+") do - res[#res+1] = w - end - return res - end - - for _, word in ipairs(split(text)) do - if string.len(word) + 1 > remain then - table.insert(res, table.concat(line, " ")) - line = { word } - remain = linelength - string.len(word) - else - table.insert(line, word) - remain = remain - (string.len(word) + 1) - end - end - - table.insert(res, table.concat(line, " ")) - return table.concat(res, "\n") -end - --- Inserts automatic line breaks into an entire text and preserves existing newlines -local linebreaker = function(text, linelength) - local out = "" - for s in string.gmatch(text, "([^\n]*)") do - local l = linebreaker_single(s, linelength) - out = out .. l - if(string.len(l) == 0) then - out = out .. "\n" - end - end - -- Remove last newline - if string.len(out) >= 1 then - out = string.sub(out, 1, string.len(out) - 1) - end - return out -end - --- Inserts text suitable for a textlist (including automatic word-wrap) -local text_for_textlist = function(text, linelength) - text = linebreaker(text, linelength) - text = minetest.formspec_escape(text) - text = string.gsub(text, "\n", ",") - return text -end - -- Scrollable freeform text doc.entry_builders.text = function(data) - local formstring = doc.widgets.text(data, doc.FORMSPEC.ENTRY_START_X, doc.FORMSPEC.ENTRY_START_Y, doc.FORMSPEC.ENTRY_WIDTH - 0.2, doc.FORMSPEC.ENTRY_HEIGHT) + local formstring = doc.widgets.text(data, doc.FORMSPEC.ENTRY_START_X, doc.FORMSPEC.ENTRY_START_Y, doc.FORMSPEC.ENTRY_WIDTH - 0.4, doc.FORMSPEC.ENTRY_HEIGHT) return formstring end @@ -539,7 +473,7 @@ doc.entry_builders.text_and_gallery = function(data, playername) formstring = formstring .. doc.widgets.text(data.text, doc.FORMSPEC.ENTRY_START_X, doc.FORMSPEC.ENTRY_START_Y, - doc.FORMSPEC.ENTRY_WIDTH - 0.2, + doc.FORMSPEC.ENTRY_WIDTH - 0.4, doc.FORMSPEC.ENTRY_HEIGHT - stolen_height) return formstring @@ -547,12 +481,13 @@ end doc.widgets = {} -local text_id = 1 -- Scrollable freeform text doc.widgets.text = function(data, x, y, width, height) if x == nil then x = doc.FORMSPEC.ENTRY_START_X end + -- Offset to table[], which was used for this in a previous version + local xfix = x + 0.35 if y == nil then y = doc.FORMSPEC.ENTRY_START_Y end @@ -562,18 +497,13 @@ doc.widgets.text = function(data, x, y, width, height) if height == nil then height = doc.FORMSPEC.ENTRY_HEIGHT end - local baselength = TEXT_LINELENGTH - local widget_basewidth = doc.FORMSPEC.WIDTH - local linelength = math.max(20, math.floor(baselength * (width / widget_basewidth))) + -- Weird offset for textarea[] + local heightfix = height + 1 - local widget_id = "doc_widget_text"..text_id - text_id = text_id + 1 - -- TODO: Wait for Minetest to provide a native widget for scrollable read-only text with automatic line breaks. - -- Currently, all of this had to be hacked into this script manually by using/abusing the table widget - local formstring = "tablecolumns[text]".. - "tableoptions[background=#000000FF;highlight=#000000FF;border=false]".. - "table["..tostring(x)..","..tostring(y)..";"..tostring(width)..","..tostring(height)..";"..widget_id..";"..text_for_textlist(data, linelength).."]" - return formstring, widget_id + -- Also add background box + local formstring = "box["..tostring(x-0.175)..","..tostring(y)..";"..tostring(width)..","..tostring(height)..";#000000]" .. + "textarea["..tostring(xfix)..","..tostring(y)..";"..tostring(width)..","..tostring(heightfix)..";;;"..minetest.formspec_escape(data).."]" + return formstring end -- Image gallery @@ -689,7 +619,7 @@ do doc.data.players[name] = {} doc.data.players[name].stored_data = players_stored_data end - minetest.debug("[doc] doc.mt successfully read.") + minetest.log("action", "[doc] doc.mt successfully read.") end end end @@ -727,16 +657,17 @@ end) function doc.formspec_core(tab) if tab == nil then tab = 1 else tab = tostring(tab) end - return "size["..doc.FORMSPEC.WIDTH..","..doc.FORMSPEC.HEIGHT.."]tabheader[0,0;doc_header;".. + return "size["..doc.FORMSPEC.WIDTH..","..doc.FORMSPEC.HEIGHT.."]".. + "tabheader[0,0;doc_header;".. minetest.formspec_escape(S("Category list")) .. "," .. minetest.formspec_escape(S("Entry list")) .. "," .. minetest.formspec_escape(S("Entry")) .. ";" - ..tab..";true;true]" .. - "bgcolor[#343434FF]" + ..tab..";false;false]" + -- Let the Game decide on the style, such as background, etc. end function doc.formspec_main(playername) - local formstring = "label[0,0;"..minetest.formspec_escape(DOC_INTRO) .. "\n" + local formstring = "textarea[0.35,0;"..doc.FORMSPEC.WIDTH..",1;;;"..minetest.formspec_escape(DOC_INTRO) .. "\n" local notify_checkbox_x, notify_checkbox_y if doc.get_category_count() >= 1 then formstring = formstring .. F("Please select a category you wish to learn more about:").."]" @@ -806,7 +737,8 @@ function doc.formspec_error_no_categories() formstring = formstring .. minetest.formspec_escape( colorize(COLOR_ERROR, S("Error: No help available.")) .. "\n\n" .. -S("No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.")) .. "\n\n" .. +S("No categories have been registered, but they are required to provide help.").."\n".. +S("The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.")) .. "\n\n" .. S("Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.") formstring = formstring .. ";]button_exit[3,5;2,1;okay;"..F("OK").."]" return formstring @@ -941,7 +873,7 @@ function doc.formspec_category(id, playername) if total >= 1 then local revealed = doc.get_revealed_count(playername, id) if revealed == 0 then - formstring = formstring .. "label[0,0.5;"..F("Currently all entries in this category are hidden from you.\nUnlock new entries by progressing in the game.").."]" + formstring = formstring .. "label[0,0.5;"..minetest.formspec_escape(S("Currently all entries in this category are hidden from you.").."\n"..S("Unlock new entries by progressing in the game.")).."]" formstring = formstring .. "button[0,1.5;3,1;doc_button_goto_main;"..F("Go to category list").."]" else formstring = formstring .. "label[0,0.5;"..F("This category has the following entries:").."]" @@ -1007,7 +939,9 @@ function doc.formspec_entry(category_id, entry_id, playername) if ename == nil or ename == "" then ename = S("Nameless entry (@1)", entry_id) end - formstring = "label[0,0;"..minetest.formspec_escape(S("Help > @1 > @2", category.def.name, ename)).."]" + + formstring = "style_type[textarea;textcolor=#FFFFFF]" + formstring = formstring .. "label[0,0;"..minetest.formspec_escape(S("Help > @1 > @2", category.def.name, ename)).."]" formstring = formstring .. category.def.build_formspec(entry.data, playername) formstring = formstring .. doc.formspec_entry_navigation(category_id, entry_id) end diff --git a/mods/HELP/doc/doc/locale/de.txt b/mods/HELP/doc/doc/locale/de.txt deleted file mode 100644 index 113307ed..00000000 --- a/mods/HELP/doc/doc/locale/de.txt +++ /dev/null @@ -1,42 +0,0 @@ -< = < -> = > -Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry. = Der Zugriff auf den angeforderten Eintrag wurde verweigert; dieser Eintrag ist geheim. Sie können durch weiteren Spielfortschritt den Zugriff freischalten. Finden Sie selbst heraus, wie Sie diesen Eintrag freischalten können. -All entries read. = Alle Einträge gelesen. -All help entries revealed! = Alle Hilfseinträge aufgedeckt! -All help entries are already revealed. = Alle Hilfseinträge sind schon aufgedeckt. -Allows you to reveal all hidden help entries with /help_reveal = Ermöglicht es Ihnen, alle verborgenen Hilfseinträge mit /help_reveal freizuschalten -Category list = Kategorienliste -Currently all entries in this category are hidden from you.\nUnlock new entries by progressing in the game. = Momentan sind alle Einträge in dieser Kategorie vor Ihnen verborgen.\nSchalten Sie neue Einträge frei, indem Sie im Spiel fortschreiten. -Help = Hilfe -Entry = Eintrag -Entry list = Eintragsliste -Error: Access denied. = Fehler: Zugriff verweigert. -Error: No help available. = Fehler: Keine Hilfe verfügbar. -Go to category list = Zur Kategorienliste -Go to entry list = Zur Eintragsliste -Help > (No Category) = Hilfe > (Keine Kategorie) -Help > @1 = Hilfe > @1 -Help > @1 > @2 = Hilfe > @1 > @2 -Help > @1 > (No Entry) = Hilfe > @1 > (Kein Eintrag) -Hidden entries: @1 = Verborgene Einträge: @1 -New entries: @1 = Neue Einträge: @1 -New help entry unlocked: @1 > @2 = Neuen Hilfseintrag freigeschaltet: @1 > @2 -No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again. = Es wurden keine Kategorien registriert, aber sie werden benötigt, um die Hilfe anbieten zu können.\nDas Dokumentationssystem [doc] bringt von sich aus keine eigenen Hilfsinhalte mit, es benötigt zusätzliche Mods, um sie hinzuzufügen. Bitte stellen Sie sicher, dass solche Mods für diese Welt aktiviert sind und versuchen Sie es erneut. -Number of entries: @1 = Anzahl der Einträge: @1 -OK = OK -Open a window providing help entries about Minetest and more = Ein Fenster mit Hilfseinträgen über Minetest und mehr öffnen -Please select a category you wish to learn more about: = Bitte wählen Sie eine Kategorie, über die Sie mehr erfahren möchten, aus: -Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia. = Empfohlene Mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia. -Reveal all hidden help entries to you = Alle für Sie verborgenen Hilfseinträge freischalten -Show entry = Eintrag zeigen -Show category = Kategorie zeigen -Show next entry = Nächsten Eintrag zeigen -Show previous entry = Vorherigen Eintrag zeigen -This category does not have any entries. = Diese Kategorie hat keine Einträge. -This category has the following entries: = Diese Kategorie hat die folgenden Einträge: -This category is empty. = Diese Kategorie ist leer. -This is the help. = Dies ist die Hilfe. -You haven't chosen a category yet. Please choose one in the category list first. = Sie haben noch keine Kategorie gewählt. Bitte wählen Sie zuerst eine Kategorie in der Kategorienliste aus. -You haven't chosen an entry yet. Please choose one in the entry list first. = Sie haben noch keinen Eintrag gewählt. Bitte wählen Sie zuerst einen Eintrag in der Eintragsliste aus. -Nameless entry (@1) = Namenloser Eintrag (@1) -Collection of help texts = Sammlung von Hilfstexten diff --git a/mods/HELP/doc/doc/locale/doc.de.tr b/mods/HELP/doc/doc/locale/doc.de.tr new file mode 100644 index 00000000..39fc7251 --- /dev/null +++ b/mods/HELP/doc/doc/locale/doc.de.tr @@ -0,0 +1,51 @@ +# textdomain:doc +<=< +>=> +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.=Der Zugriff auf den angeforderten Eintrag wurde verweigert; dieser Eintrag ist geheim. Sie können durch weiteren Spielfortschritt den Zugriff freischalten. Finden Sie selbst heraus, wie Sie diesen Eintrag freischalten können. +All entries read.=Alle Einträge gelesen. +All help entries revealed!=Alle Hilfseinträge aufgedeckt! +All help entries are already revealed.=Alle Hilfseinträge sind schon aufgedeckt. +Allows you to reveal all hidden help entries with /help_reveal=Ermöglicht es Ihnen, alle verborgenen Hilfseinträge mit /help_reveal freizuschalten +Category list=Kategorienliste +Currently all entries in this category are hidden from you.=Momentan sind alle Einträge in dieser Kategorie vor Ihnen verborgen. +Unlock new entries by progressing in the game.=Schalten Sie neue Einträge frei, indem Sie im Spiel fortschreiten. +Help=Hilfe +Entry=Eintrag +Entry list=Eintragsliste +Error: Access denied.=Fehler: Zugriff verweigert. +Error: No help available.=Fehler: Keine Hilfe verfügbar. +Go to category list=Zur Kategorienliste +Go to entry list=Zur Eintragsliste +Help > (No Category)=Hilfe > (Keine Kategorie) +Help > @1=Hilfe > @1 +Help > @1 > @2=Hilfe > @1 > @2 +Help > @1 > (No Entry)=Hilfe > @1 > (Kein Eintrag) +Hidden entries: @1=Verborgene Einträge: @1 +New entries: @1=Neue Einträge: @1 +New help entry unlocked: @1 > @2=Neuen Hilfseintrag freigeschaltet: @1 > @2 +No categories have been registered, but they are required to provide help.=Es wurden keine Kategorien registriert, aber sie werden benötigt, um die Hilfe anbieten zu können. +The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Das Dokumentationssystem [doc] bringt von sich aus keine eigenen Hilfsinhalte mit, es benötigt zusätzliche Mods, um sie hinzuzufügen. Bitte stellen Sie sicher, dass solche Mods für diese Welt aktiviert sind und versuchen Sie es erneut. +Number of entries: @1=Anzahl der Einträge: @1 +OK=OK +Open a window providing help entries about Minetest and more=Ein Fenster mit Hilfseinträgen über Minetest und mehr öffnen +Please select a category you wish to learn more about:=Bitte wählen Sie eine Kategorie, über die Sie mehr erfahren möchten, aus: +Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Empfohlene Mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia. +Reveal all hidden help entries to you=Alle für Sie verborgenen Hilfseinträge freischalten +Show entry=Eintrag zeigen +Show category=Kategorie zeigen +Show next entry=Nächsten Eintrag zeigen +Show previous entry=Vorherigen Eintrag zeigen +This category does not have any entries.=Diese Kategorie hat keine Einträge. +This category has the following entries:=Diese Kategorie hat die folgenden Einträge: +This category is empty.=Diese Kategorie ist leer. +This is the help.=Dies ist die Hilfe. +You haven't chosen a category yet. Please choose one in the category list first.=Sie haben noch keine Kategorie gewählt, Bitte wählen Sie zuerst eine aus. +You haven't chosen an entry yet. Please choose one in the entry list first.=Sie haben noch keinen Eintrag gewählt. Bitte wählen Sie zuerst einen aus. +Nameless entry (@1)=Namenloser Eintrag (@1) +Collection of help texts=Sammlung von Hilfstexten +Notify me when new help is available=Benachrichtigen, wenn neue Hilfe verfügbar ist +Play notification sound when new help is available=Toneffekt abspielen, wenn neue Hilfe verfügbar ist +Show previous image=Vorheriges Bild zeigen +Show previous gallery page=Vorherige Galerieseite zeigen +Show next image=Nächstes Bild zeigen +Show next gallery page=Nächste Galerieseite zeigen diff --git a/mods/HELP/doc/doc/locale/doc.fr.tr b/mods/HELP/doc/doc/locale/doc.fr.tr new file mode 100644 index 00000000..f7f33b0f --- /dev/null +++ b/mods/HELP/doc/doc/locale/doc.fr.tr @@ -0,0 +1,52 @@ +# textdomain:doc +<=< +>=> +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.=L'accès à cette page a été refusé; cette page est secrète. Vous pouvez débloquer l'accès en progressant dans le jeu. Trouvez comment débloquer cette page. +All entries read.=Toutes les pages sont lues. +All help entries revealed!=Toutes les pages d'aide ont été découvertes ! +All help entries are already revealed.=Toutes les pages d'aide sont déjà découvertes. +Allows you to reveal all hidden help entries with /help_reveal=Vous permet de découvrir toutes les pages d'aide cachées avec /help_reveal +Category list=Liste des catégories +Currently all entries in this category are hidden from you.=Toutes les pages de cette catégories vous sont cachées. +Unlock new entries by progressing in the game.=Débloquez de nouvelles pages en progressant dans le jeu. +Help=Aide +Entry=Page +Entry list=Liste des pages +Error: Access denied.=Erreur : Accès refusé. +Error: No help available.=Erreur : Aucune aide disponible. +# Affichage dans un bouton court +Go to category list=Voir les catégories +Go to entry list=Voir les pages +Help > @1=Aide > @1 +Help > @1 > @2=Aide > @1 > @2 +Help > @1 > (No Entry)=Aide > @1 > (Aucune page) +Help > (No Category)=Aide > (Aucune catégorie) +Hidden entries: @1=Pages cachées : @1 +Nameless entry (@1)=Pages sans nom (@1) +New entries: @1=Nouvelles pages : @1 +New help entry unlocked: @1 > @2=Nouvelles pages d'aide débloquées : @1 +No categories have been registered, but they are required to provide help.=Aucune catégorie n'a été enregistrée, mais elles sont nécessaires pour fournir l'aide. +The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Le Système de Documentation [doc] n'est fourni avec aucun contenu d'aide, il a besoin d'autres mods pour ajouter le contenu de l'aide. Vérifiez que de tels mods sont activés pour ce monde, et réessayez. +Number of entries: @1=Nombre de pages : @1 +OK=OK +Open a window providing help entries about Minetest and more=Ouvrire une fenêtre contenant les pages d'aides à propos de Minetest. +Please select a category you wish to learn more about:=Veuillez choisir une catégorie pour laquelle vous souhaitez en savoir plus : +Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Mods recommandés : doc_basics, doc_items, doc_identifier, doc_encyclopedia. +Reveal all hidden help entries to you=Révéler toutes les pages d'aide cachées pour vous. +Show entry=Voir la page +Show category=Voir la catégorie +Show next entry=Voir la page suivante +Show previous entry=Voir la page précédente +This category does not have any entries.=Cette catégorie ne contient aucune page. +This category has the following entries:=Cette catégorie contient les pages suivantes : +This category is empty.=Cette catégorie est vide. +This is the help.=Ceci est l'aide. +You haven't chosen a category yet. Please choose one in the category list first.=Vous n'avez pas encore choisi de catégorie. Veulliez d'abord en choisir une dans la liste. +You haven't chosen an entry yet. Please choose one in the entry list first.=Vous n'avez pas encore choisi de page. Veuillez d'abord en choisir une dans la liste. +Collection of help texts=Collection des textes d'aide +Notify me when new help is available=Recevoir une notification quand une nouvelle page d'aide est disponible +Play notification sound when new help is available=Jouer un son de notification lorsqu'une nouvelle page d'aide est disponible +Show previous image=Voir l'image précédente +Show previous gallery page=Voir la page précédente de la galerie +Show next image=Voir l'image suivante +Show next gallery page=Voir la page suivante de la galerie diff --git a/mods/HELP/doc/doc/locale/doc.pt.tr b/mods/HELP/doc/doc/locale/doc.pt.tr new file mode 100644 index 00000000..52d68363 --- /dev/null +++ b/mods/HELP/doc/doc/locale/doc.pt.tr @@ -0,0 +1,43 @@ +# textdomain:doc +<= +>= +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.=O acesso à entrada solicitada foi negado; essa entrada é secreta. Você pode desbloquear o acesso progredindo no jogo. Descobrir por conta própria como desbloquear essa entrada. +All entries read.=Todas as entradas lidas. +All help entries revealed!=Todas as entradas de ajuda reveladas! +All help entries are already revealed.=Todas as entradas de ajuda já foram reveladas. +Allows you to reveal all hidden help entries with /help_reveal=Permite revelar todas as entradas de ajuda ocultas com /help_reveal +Category list=Lista de Categorias +Currently all entries in this category are hidden from you.\\nUnlock new entries by progressing in the game.=Atualmente, todas as entradas nessa categoria estão ocultas a você.\\nDesbloqueie novas entradas progredindo no jogo. +Help=Ajuda +Entry=Entrada +Entry list=Lista de Entradas +Error: Access denied.=Erro: Acesso negado. +Error: No help available.=Erro: Nenhuma ajuda disponível. +Go to category list=Ver categorias +Go to entry list=Ir para a lista de entradas +Help > @1=Ajuda > @1 +Help > @1 > @2=Ajuda > @1 > @2 +Help > @1 > (No Entry)=Ajuda > @1 > (Nenhuma Entrada) +Help > (No Category)=Ajuda > (Nenhuma Categoria) +Hidden entries: @1=Entradas ocultas: @1 +Nameless entry (@1)=Entrada sem nome (@1) +New entries: @1=Novas entradas: (@1) +New help entry unlocked: @1 > @2=Nova entrada de ajuda desbloqueada: @1 > @2 +No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Nenhuma categoria foi registrada, mas é necessário fornecer ajuda.\nO Sistema de Documentação [doc] não vem com o conteúdo de ajuda, ele precisa de mods adicionais para adicionar conteúdo de ajuda. Por favor, certifique-se de que os mods estão habilitados para este mundo e tente novamente. +Number of entries: @1=Número de entradas: @1 +OK=OK +Open a window providing help entries about Minetest and more=Abra uma janela fornecendo entradas de ajuda sobre o Minetest e mais +Please select a category you wish to learn more about:=Por favor, selecione uma categoria sobre a qual você deseja saber mais: +Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Mods recomendados: doc_basics, doc_items, doc_identifier, doc_encyclopedia. +Reveal all hidden help entries to you=Revela todas as entradas de ajuda ocultas para você +Show entry=Ver entrada +Show category=Ver categoria +Show next entry=Ver próxima entrada +Show previous entry=Ver entrada anterior +This category does not have any entries.=Essa categoria não possui entradas. +This category has the following entries:=Essa categoria tem as seguintes entradas: +This category is empty.=Essa categoria está vazia. +This is the help.=Essa é a ajuda. +You haven't chosen a category yet. Please choose one in the category list first.=Você ainda não escolheu uma categoria. Por favor, escolha uma na lista de categorias primeiro. +You haven't chosen an entry yet. Please choose one in the entry list first.=Você ainda não escolheu uma entrada. Por favor, escolha uma na lista de entrada primeiro. +Collection of help texts=Coleção de textos de ajuda diff --git a/mods/HELP/doc/doc/locale/doc.pt_BR.tr b/mods/HELP/doc/doc/locale/doc.pt_BR.tr new file mode 100644 index 00000000..52d68363 --- /dev/null +++ b/mods/HELP/doc/doc/locale/doc.pt_BR.tr @@ -0,0 +1,43 @@ +# textdomain:doc +<= +>= +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.=O acesso à entrada solicitada foi negado; essa entrada é secreta. Você pode desbloquear o acesso progredindo no jogo. Descobrir por conta própria como desbloquear essa entrada. +All entries read.=Todas as entradas lidas. +All help entries revealed!=Todas as entradas de ajuda reveladas! +All help entries are already revealed.=Todas as entradas de ajuda já foram reveladas. +Allows you to reveal all hidden help entries with /help_reveal=Permite revelar todas as entradas de ajuda ocultas com /help_reveal +Category list=Lista de Categorias +Currently all entries in this category are hidden from you.\\nUnlock new entries by progressing in the game.=Atualmente, todas as entradas nessa categoria estão ocultas a você.\\nDesbloqueie novas entradas progredindo no jogo. +Help=Ajuda +Entry=Entrada +Entry list=Lista de Entradas +Error: Access denied.=Erro: Acesso negado. +Error: No help available.=Erro: Nenhuma ajuda disponível. +Go to category list=Ver categorias +Go to entry list=Ir para a lista de entradas +Help > @1=Ajuda > @1 +Help > @1 > @2=Ajuda > @1 > @2 +Help > @1 > (No Entry)=Ajuda > @1 > (Nenhuma Entrada) +Help > (No Category)=Ajuda > (Nenhuma Categoria) +Hidden entries: @1=Entradas ocultas: @1 +Nameless entry (@1)=Entrada sem nome (@1) +New entries: @1=Novas entradas: (@1) +New help entry unlocked: @1 > @2=Nova entrada de ajuda desbloqueada: @1 > @2 +No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Nenhuma categoria foi registrada, mas é necessário fornecer ajuda.\nO Sistema de Documentação [doc] não vem com o conteúdo de ajuda, ele precisa de mods adicionais para adicionar conteúdo de ajuda. Por favor, certifique-se de que os mods estão habilitados para este mundo e tente novamente. +Number of entries: @1=Número de entradas: @1 +OK=OK +Open a window providing help entries about Minetest and more=Abra uma janela fornecendo entradas de ajuda sobre o Minetest e mais +Please select a category you wish to learn more about:=Por favor, selecione uma categoria sobre a qual você deseja saber mais: +Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Mods recomendados: doc_basics, doc_items, doc_identifier, doc_encyclopedia. +Reveal all hidden help entries to you=Revela todas as entradas de ajuda ocultas para você +Show entry=Ver entrada +Show category=Ver categoria +Show next entry=Ver próxima entrada +Show previous entry=Ver entrada anterior +This category does not have any entries.=Essa categoria não possui entradas. +This category has the following entries:=Essa categoria tem as seguintes entradas: +This category is empty.=Essa categoria está vazia. +This is the help.=Essa é a ajuda. +You haven't chosen a category yet. Please choose one in the category list first.=Você ainda não escolheu uma categoria. Por favor, escolha uma na lista de categorias primeiro. +You haven't chosen an entry yet. Please choose one in the entry list first.=Você ainda não escolheu uma entrada. Por favor, escolha uma na lista de entrada primeiro. +Collection of help texts=Coleção de textos de ajuda diff --git a/mods/HELP/doc/doc/locale/template.txt b/mods/HELP/doc/doc/locale/template.txt index 7d852e9a..517c4286 100644 --- a/mods/HELP/doc/doc/locale/template.txt +++ b/mods/HELP/doc/doc/locale/template.txt @@ -1,42 +1,51 @@ -< = -> = -Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry. = -All entries read. = -All help entries revealed! = -All help entries are already revealed. = -Allows you to reveal all hidden help entries with /help_reveal = -Category list = -Currently all entries in this category are hidden from you.\\nUnlock new entries by progressing in the game. = -Help = -Entry = -Entry list = -Error: Access denied. = -Error: No help available. = -Go to category list = -Go to entry list = -Help > @1 = -Help > @1 > @2 = -Help > @1 > (No Entry) = -Help > (No Category) = -Hidden entries: @1 = -Nameless entry (@1) = -New entries: @1 = -New help entry unlocked: @1 > @2 = -No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again. = -Number of entries: @1 = -OK = -Open a window providing help entries about Minetest and more = -Please select a category you wish to learn more about: = -Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia. = -Reveal all hidden help entries to you = -Show entry = -Show category = -Show next entry = -Show previous entry = -This category does not have any entries. = -This category has the following entries: = -This category is empty. = -This is the help. = -You haven't chosen a category yet. Please choose one in the category list first. = -You haven't chosen an entry yet. Please choose one in the entry list first. = -Collection of help texts = +# textdomain:doc +<= +>= +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.= +All entries read.= +All help entries revealed!= +All help entries are already revealed.= +Allows you to reveal all hidden help entries with /help_reveal= +Category list= +Currently all entries in this category are hidden from you.= +Unlock new entries by progressing in the game.= +Help= +Entry= +Entry list= +Error: Access denied.= +Error: No help available.= +Go to category list= +Go to entry list= +Help > @1= +Help > @1 > @2= +Help > @1 > (No Entry)= +Help > (No Category)= +Hidden entries: @1= +Nameless entry (@1)= +New entries: @1= +New help entry unlocked: @1 > @2= +No categories have been registered, but they are required to provide help.= +The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.= +Number of entries: @1= +OK= +Open a window providing help entries about Minetest and more= +Please select a category you wish to learn more about:= +Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.= +Reveal all hidden help entries to you= +Show entry= +Show category= +Show next entry= +Show previous entry= +This category does not have any entries.= +This category has the following entries:= +This category is empty.= +This is the help.= +You haven't chosen a category yet. Please choose one in the category list first.= +You haven't chosen an entry yet. Please choose one in the entry list first.= +Collection of help texts= +Notify me when new help is available= +Play notification sound when new help is available= +Show previous image= +Show previous gallery page= +Show next image= +Show next gallery page= diff --git a/mods/HELP/doc/doc/mod.conf b/mods/HELP/doc/doc/mod.conf index 5e2f4308..302fd83d 100644 --- a/mods/HELP/doc/doc/mod.conf +++ b/mods/HELP/doc/doc/mod.conf @@ -1 +1,3 @@ name = doc +optional_depends = unified_inventory, sfinv_buttons, central_message, inventory_plus +description = A simple in-game documentation system which enables mods to add help entries based on templates. diff --git a/mods/HELP/doc/doc_identifier/README.md b/mods/HELP/doc/doc_identifier/README.md index 7620be7c..7afe3b90 100644 --- a/mods/HELP/doc/doc_identifier/README.md +++ b/mods/HELP/doc/doc_identifier/README.md @@ -1,5 +1,5 @@ # Lookup Tool [`doc_identifier`] -Version: 1.2.1 +Version: 1.2.2 ## Description The lookup tool is an useful little helper which can be used to quickly learn diff --git a/mods/HELP/doc/doc_identifier/depends.txt b/mods/HELP/doc/doc_identifier/depends.txt deleted file mode 100644 index b4a65e0d..00000000 --- a/mods/HELP/doc/doc_identifier/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -doc -doc_items -doc_basics? -mcl_core? -intllib? diff --git a/mods/HELP/doc/doc_identifier/description.txt b/mods/HELP/doc/doc_identifier/description.txt deleted file mode 100644 index 8294c740..00000000 --- a/mods/HELP/doc/doc_identifier/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds a tool which shows help entries about almost anything which it punches. diff --git a/mods/HELP/doc/doc_identifier/init.lua b/mods/HELP/doc/doc_identifier/init.lua index b9675349..2e041ae2 100644 --- a/mods/HELP/doc/doc_identifier/init.lua +++ b/mods/HELP/doc/doc_identifier/init.lua @@ -1,10 +1,4 @@ --- Boilerplate to support localized strings if intllib mod is installed. -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s) return s end -end +local S = minetest.get_translator("doc_identifier") local doc_identifier = {} @@ -28,7 +22,7 @@ doc_identifier.identify = function(itemstack, user, pointed_thing) elseif itype == "error_node" then message = S("No help entry for this block could be found.") elseif itype == "error_unknown" then - vsize = vsize + 3 + vsize = vsize + 2 local mod if param ~= nil then local colon = string.find(param, ":") @@ -36,20 +30,23 @@ doc_identifier.identify = function(itemstack, user, pointed_thing) mod = string.sub(param,1,colon-1) end end - message = S("Error: This node, item or object is undefined. This is always an error.\nThis can happen for the following reasons:\n• The mod which is required for it is not enabled\n• The author of the subgame or a mod has made a mistake") + message = S("Error: This node, item or object is undefined. This is always an error.").."\n".. + S("This can happen for the following reasons:").."\n".. + S("• The mod which is required for it is not enabled").."\n".. + S("• The author of the game or a mod has made a mistake") message = message .. "\n\n" if mod ~= nil then if minetest.get_modpath(mod) ~= nil then - message = message .. string.format(S("It appears to originate from the mod “%s”, which is enabled."), mod) + message = message .. S("It appears to originate from the mod “@1”, which is enabled.", mod) message = message .. "\n" else - message = message .. string.format(S("It appears to originate from the mod “%s”, which is not enabled!"), mod) + message = message .. S("It appears to originate from the mod “@1”, which is not enabled!", mod) message = message .. "\n" end end if param ~= nil then - message = message .. string.format(S("Its identifier is “%s”."), param) + message = message .. S("Its identifier is “@1”.", param) end elseif itype == "error_ignore" then message = S("This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.") @@ -61,9 +58,9 @@ doc_identifier.identify = function(itemstack, user, pointed_thing) minetest.show_formspec( username, "doc_identifier:error_missing_item_info", - "size[12,"..vsize..";]" .. - "label[0,0.2;"..minetest.formspec_escape(message).."]" .. - "button_exit[4.5,"..(-0.5+vsize)..";3,1;okay;"..minetest.formspec_escape(S("OK")).."]" + "size[10,"..vsize..";]" .. + "textarea[0.5,0.2;10,"..(vsize-0.2)..";;;"..minetest.formspec_escape(message).."]" .. + "button_exit[3.75,"..(-0.5+vsize)..";3,1;okay;"..minetest.formspec_escape(S("OK")).."]" ) end if pointed_thing.type == "node" then @@ -152,7 +149,7 @@ function doc_identifier.liquid_mode(itemstack, user, pointed_thing) -- Use pointed node's on_rightclick function first, if present if pointed_thing.type == "node" then local node = minetest.get_node(pointed_thing.under) - if user and not user:get_player_control().sneak then + 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 @@ -164,8 +161,9 @@ end minetest.register_tool("doc_identifier:identifier_solid", { description = S("Lookup Tool"), + _tt_help = S("Show help for pointed thing"), _doc_items_longdesc = S("This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used."), - _doc_items_usagehelp = S("Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid."), + _doc_items_usagehelp = S("Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case."), _doc_items_hidden = false, tool_capabilities = {}, range = 10, @@ -181,7 +179,7 @@ minetest.register_tool("doc_identifier:identifier_liquid", { _doc_items_create_entry = false, tool_capabilities = {}, range = 10, - groups = { not_in_creative_inventory = 1, not_in_craft_guide = 1 }, + groups = { not_in_creative_inventory = 1, not_in_craft_guide = 1, disable_repair = 1 }, wield_image = "doc_identifier_identifier_liquid.png", inventory_image = "doc_identifier_identifier_liquid.png", liquids_pointable = true, @@ -190,19 +188,18 @@ minetest.register_tool("doc_identifier:identifier_liquid", { on_secondary_use = doc_identifier.solid_mode, }) --- TODO: These crafting recipes are temporary. Add a different way to obtain the lookup tool +minetest.register_craft({ + output = "doc_identifier:identifier_solid", + recipe = { {"group:stick", "group:stick" }, + {"", "group:stick"}, + {"group:stick", ""} } +}) + if minetest.get_modpath("mcl_core") ~= nil then - minetest.register_craft({ - output = "doc_identifier:identifier_solid", - recipe = { {"mcl_core:stick", "mcl_core:stick" }, - {"", "mcl_core:stick"}, - {"mcl_core:stick", ""} } - }) - minetest.register_craft({ output = "doc_identifier:identifier_solid", recipe = { { "mcl_core:glass" }, - { "mcl_core:stick" } } + { "group:stick" } } }) end diff --git a/mods/HELP/doc/doc_identifier/locale/de.txt b/mods/HELP/doc/doc_identifier/locale/de.txt deleted file mode 100644 index 54688cc2..00000000 --- a/mods/HELP/doc/doc_identifier/locale/de.txt +++ /dev/null @@ -1,13 +0,0 @@ -Error: This node, item or object is undefined. This is always an error.\nThis can happen for the following reasons:\n• The mod which is required for it is not enabled\n• The author of the subgame or a mod has made a mistake = Fehler: Dieser Node, Gegenstand oder dieses Objekt ist nicht definiert.\nDas ist immer ein Fehler.\nDies kann aus folgenden Gründen passieren:\n• Die Mod, die dafür benötigt wird, ist nicht aktiv\n• Der Subgame-Autor oder ein Mod-Autor machte einen Fehler -It appears to originate from the mod “%s”, which is enabled. = Es scheint von der Mod »%s« zu stammen. Sie ist aktiv. -It appears to originate from the mod “%s”, which is not enabled! = Es scheint von der Mod »%s« zu stammen. Sie ist nicht aktiv! -Its identifier is “%s”. = Der Identifkator ist »%s«. -Lookup Tool = Nachschlagewerkzeug -No help entry for this block could be found. = Für diesen Block konnte kein Hilfseintrag gefunden werden. -No help entry for this item could be found. = Für diesen Gegenstand konnte kein Hilfseintrag gefunden werden. -No help entry for this object could be found. = Für dieses Objekt konnte kein Hilfseintrag gefunden werden. -OK = OK -Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid. = Schlagen Sie einen beliebigen Block, Gegenstand oder irgendwas, worüber Sie mehr erfahren wollen. Das wird den passenden Hilfseintrag öffnen. Das Werkzeug hat zwei Modi, welcher mit einem Rechtsklick gewechselt werden kann. Im Flüssigmodus (blau) zeigt das Werkzeug auch auf Flüssigkeiten. Im Festmodus (rot) ist das nicht der Fall. Der Flüssigmodis ist notwendig, wenn Sie eine Flüssigkeit identifizieren wollen. -This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds. = Dieser Block kann nicht identifiziert werden, weil sich die Welt an dieser Stelle noch nicht materialisiert hat. Versuch es in ein paar Sekunden erneut. -This is a player. = Dies ist ein Spieler. -This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used. = Dieser nützliche kleine Helfer kann benutzt werden, um schnell etwas über die nähere Umgebung zu erfahren. Er identifiziert und analysiert Blöcke, Gegenstände und andere Dinge und zeigt ausführliche Informationen über all das, worauf man ihn anwendet. diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.de.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.de.tr new file mode 100644 index 00000000..26fa3552 --- /dev/null +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.de.tr @@ -0,0 +1,18 @@ +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.=Fehler: Dieser Node, Gegenstand oder dieses Objekt ist nicht definiert. Das ist immer ein Fehler. +This can happen for the following reasons:=Dies kann aus folgenden Gründen passieren: +• The mod which is required for it is not enabled=• Die Mod, die dafür benötigt wird, ist nicht aktiv +• The author of the game or a mod has made a mistake=• Der Spiel-Autor oder ein Mod-Autor machte einen Fehler +It appears to originate from the mod “@1”, which is enabled.=Es scheint von der Mod „@1“ zu stammen. Sie ist aktiv. +It appears to originate from the mod “@1”, which is not enabled!=Es scheint von der Mod „@1“ zu stammen. Sie ist nicht aktiv! +Its identifier is “@1”.=Der Identifikator ist „@1“. +Lookup Tool=Nachschlagewerkzeug +No help entry for this block could be found.=Für diesen Block konnte kein Hilfseintrag gefunden werden. +No help entry for this item could be found.=Für diesen Gegenstand konnte kein Hilfseintrag gefunden werden. +No help entry for this object could be found.=Für dieses Objekt konnte kein Hilfseintrag gefunden werden. +OK=OK +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Schlagen Sie einen beliebigen Block, Gegenstand oder irgendwas, worüber Sie mehr erfahren wollen. Das wird den passenden Hilfseintrag öffnen. Das Werkzeug hat zwei Modi, welcher mit Benutzen gewechselt werden kann. Im Flüssigmodus zeigt das Werkzeug auch auf Flüssigkeiten. Im Festmodus ist das nicht der Fall. +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Dieser Block kann nicht identifiziert werden, weil sich die Welt an dieser Stelle noch nicht materialisiert hat. Versuchen Sie es in ein paar Sekunden erneut. +This is a player.=Dies ist ein Spieler. +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Dieser nützliche kleine Helfer kann benutzt werden, um schnell etwas über die nähere Umgebung zu erfahren. Er identifiziert und analysiert Blöcke, Gegenstände und andere Dinge und zeigt ausführliche Informationen über all das, worauf man ihn anwendet. +Show help for pointed thing=Hilfe für gezeigtes Ding anzeigen diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.es.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.es.tr new file mode 100644 index 00000000..66c272f7 --- /dev/null +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.es.tr @@ -0,0 +1,17 @@ +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.=Error: este nodo, elemento u objeto no está definido. Esto siempre es un error. +This can happen for the following reasons:=Esto puede suceder por los siguientes motivos: +• The mod which is required for it is not enabled=• El mod que se requiere para ello no está habilitado +• The author of the game or a mod has made a mistake=• El autor del juego o un mod ha cometido un error +It appears to originate from the mod “@1”, which is enabled.=Parece originarse del mod "@1", que está habilitado. +It appears to originate from the mod “@1”, which is not enabled!=¡Parece originarse del mod "@1", que no está habilitado! +Its identifier is “@1”.=Su identificador es "@1“. +Lookup Tool=Herramienta lupa +No help entry for this block could be found.=No se encontró ninguna entrada de ayuda para este bloque. +No help entry for this item could be found.=No se pudo encontrar ninguna entrada de ayuda para este artículo. +No help entry for this object could be found.=No se pudo encontrar ninguna entrada de ayuda para este objeto. +OK=Aceptar +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Perfore cualquier bloque, elemento u otra cosa sobre la que desee obtener más información. Esto abrirá la entrada de ayuda apropiada. La herramienta viene en dos modos que se cambian mediante el uso. En modo líquido, esta herramienta también apunta a líquidos, mientras que en modo sólido este no es el caso. +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Este bloque no se puede identificar porque el mundo aún no se ha materializado en este momento. Inténtalo de nuevo en unos segundos. +This is a player.=Este es un jugador. +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Este útil pequeño ayudante se puede utilizar para aprender rápidamente sobre el entorno más cercano. Identifica y analiza bloques, elementos y otras cosas y muestra información extensa sobre la cosa en la que se utiliza. diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.fr.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.fr.tr new file mode 100644 index 00000000..2b1f3729 --- /dev/null +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.fr.tr @@ -0,0 +1,18 @@ +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.=Erreur: ce nœud, élément ou objet n'est pas défini. C'est toujours une erreur. +This can happen for the following reasons:=Cela peut se produire pour les raisons suivantes: +• The mod which is required for it is not enabled=• Le mod qui lui est nécessaire n'est pas activé +• The author of the game or a mod has made a mistake=• L'auteur du jeu ou d'un mod a fait une erreur +It appears to originate from the mod “@1”, which is enabled.=Cela semble provenir du mod “@1”, qui est activé. +It appears to originate from the mod “@1”, which is not enabled!=Cela semble provenir du mod “@1”, qui n'est pas activé!. +Its identifier is “@1”.=Son identifiant est “@1” +Lookup Tool=Outil de recherche +No help entry for this block could be found.=Aucune entrée d'aide pour ce bloc n'a pu être trouvée. +No help entry for this item could be found.=Aucune entrée d'aide pour cet élément n'a pu être trouvée. +No help entry for this object could be found.=Aucune entrée d'aide pour cet objet n'a pu être trouvée. +OK=OK +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Frappez n'importe quel bloc, élément ou autre chose sur lequel vous souhaitez en savoir plus. Cela ouvrira l'entrée d'aide appropriée. L'outil est disponible en deux modes qui changent suivant l'usage. En mode liquide, cet outil pointe également sur les liquides tandis qu'en mode solide, ce n'est pas le cas. +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Ce bloc ne peut pas être identifié car le monde ne s'est pas encore matérialisé à ce stade. Réessayez dans quelques secondes. +This is a player.=Ceci est un joueur. +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Ce pratique petit assistant peut être utilisé pour en savoir plus rapidement sur son environnement proche. Il identifie et analyse les blocs, articles et autres choses et il affiche des informations détaillées sur la chose sur laquelle il est utilisé. +Show help for pointed thing=Affiche l'aide des choses pointées diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt.tr new file mode 100644 index 00000000..cb013c94 --- /dev/null +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt.tr @@ -0,0 +1,14 @@ +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.\\nThis can happen for the following reasons:\\n• The mod which is required for it is not enabled\\n• The author of the game or a mod has made a mistake=Erro: Esse bloco, item ou objeto é indefinido. Isso é sempre um erro.\\n Isso pode ter acontecido pelas seguintes rasões:\\n• O mod o qual ele precisa não está habilitado\\n• O autor do jogo ou mod comoteu um erro +It appears to originate from the mod “%s”, which is enabled.=Parece originar do mod “%s”, que está habilitado. +It appears to originate from the mod “%s”, which is not enabled!=Parece originar do mod “%s”, que não está habilitado. +Its identifier is “%s”.=Seu identificador é “%s”. +Lookup tool=Ferramenta de Pesquisa +No help entry for this block could be found.=Nenhuma entrada de ajuda para esse bloco pode ser encontrada. +No help entry for this item could be found.=Nenhuma entrada de ajuda para esse item pode ser encontrada. +No help entry for this object could be found.=Nenhuma entrada de ajuda para esse objeto pode ser encontrada. +OK=OK +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid.=Soque qualquer bloco, item ou outra coisa sobre a qual você deseja aprender mais. Isso abrirá a entrada de ajuda apropriada. A ferramenta vem em dois modos que são alterados por um clique direito. No modo líquido (azul), esta ferramenta também aponta para líquidos, enquanto no modo sólido (vermelho) não é esse o caso. O modo líquido é necessário se você quiser identificar um líquido. +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Este bloco não pode ser identificado porque o mundo ainda não se materializou neste momento. Tente novamente em alguns segundos. +This is a player.=Este é um jogador. +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Esse pequeno e útil ajudante pode ser usado para aprender rapidamente sobre as coisas em sua volta. Ele identifica e analisa blocos, itens e outras coisas e mostra informações abrangentes sobre a coisa na qual é usado. diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt_BR.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt_BR.tr new file mode 100644 index 00000000..cb013c94 --- /dev/null +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt_BR.tr @@ -0,0 +1,14 @@ +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.\\nThis can happen for the following reasons:\\n• The mod which is required for it is not enabled\\n• The author of the game or a mod has made a mistake=Erro: Esse bloco, item ou objeto é indefinido. Isso é sempre um erro.\\n Isso pode ter acontecido pelas seguintes rasões:\\n• O mod o qual ele precisa não está habilitado\\n• O autor do jogo ou mod comoteu um erro +It appears to originate from the mod “%s”, which is enabled.=Parece originar do mod “%s”, que está habilitado. +It appears to originate from the mod “%s”, which is not enabled!=Parece originar do mod “%s”, que não está habilitado. +Its identifier is “%s”.=Seu identificador é “%s”. +Lookup tool=Ferramenta de Pesquisa +No help entry for this block could be found.=Nenhuma entrada de ajuda para esse bloco pode ser encontrada. +No help entry for this item could be found.=Nenhuma entrada de ajuda para esse item pode ser encontrada. +No help entry for this object could be found.=Nenhuma entrada de ajuda para esse objeto pode ser encontrada. +OK=OK +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid.=Soque qualquer bloco, item ou outra coisa sobre a qual você deseja aprender mais. Isso abrirá a entrada de ajuda apropriada. A ferramenta vem em dois modos que são alterados por um clique direito. No modo líquido (azul), esta ferramenta também aponta para líquidos, enquanto no modo sólido (vermelho) não é esse o caso. O modo líquido é necessário se você quiser identificar um líquido. +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Este bloco não pode ser identificado porque o mundo ainda não se materializou neste momento. Tente novamente em alguns segundos. +This is a player.=Este é um jogador. +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Esse pequeno e útil ajudante pode ser usado para aprender rapidamente sobre as coisas em sua volta. Ele identifica e analisa blocos, itens e outras coisas e mostra informações abrangentes sobre a coisa na qual é usado. diff --git a/mods/HELP/doc/doc_identifier/locale/template.txt b/mods/HELP/doc/doc_identifier/locale/template.txt index e1dafd34..104f0ea1 100644 --- a/mods/HELP/doc/doc_identifier/locale/template.txt +++ b/mods/HELP/doc/doc_identifier/locale/template.txt @@ -1,13 +1,18 @@ -Error: This node, item or object is undefined. This is always an error.\\nThis can happen for the following reasons:\\n• The mod which is required for it is not enabled\\n• The author of the subgame or a mod has made a mistake = -It appears to originate from the mod “%s”, which is enabled. = -It appears to originate from the mod “%s”, which is not enabled! = -Its identifier is “%s”. = -Lookup Tool = -No help entry for this block could be found. = -No help entry for this item could be found. = -No help entry for this object could be found. = -OK = -Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid. = -This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds. = -This is a player. = -This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used. = +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.= +This can happen for the following reasons:= +• The mod which is required for it is not enabled= +• The author of the game or a mod has made a mistake= +It appears to originate from the mod “@1”, which is enabled.= +It appears to originate from the mod “@1”, which is not enabled!= +Its identifier is “@1”.= +Lookup Tool= +No help entry for this block could be found.= +No help entry for this item could be found.= +No help entry for this object could be found.= +OK= +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.= +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.= +This is a player.= +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.= +Show help for pointed thing= diff --git a/mods/HELP/doc/doc_identifier/mod.conf b/mods/HELP/doc/doc_identifier/mod.conf index df963a0c..4a7626a4 100644 --- a/mods/HELP/doc/doc_identifier/mod.conf +++ b/mods/HELP/doc/doc_identifier/mod.conf @@ -1 +1,4 @@ name = doc_identifier +depends = doc, doc_items +optional_depends = doc_basics, mcl_core +description = Adds a tool which shows help entries about almost anything which it punches. diff --git a/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier.png b/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier.png index 5e70ec84..00b3147a 100644 Binary files a/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier.png and b/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier.png differ diff --git a/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier_liquid.png b/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier_liquid.png index 5d8da11d..d3689ec6 100644 Binary files a/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier_liquid.png and b/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier_liquid.png differ diff --git a/mods/HELP/doc/doc_items/API.md b/mods/HELP/doc/doc_items/API.md index a683771c..ca795956 100644 --- a/mods/HELP/doc/doc_items/API.md +++ b/mods/HELP/doc/doc_items/API.md @@ -42,7 +42,7 @@ easy and quick manipulation of the item help entries. All fields are optional. * `_doc_items_hidden`: Whether entry is hidden (default: `false` for air and hand, `true` for everything else) * `_doc_items_create_entry`: Whether to create an entry for this item (default: `true`) * `_doc_items_entry_name`: The title of the entry. By default, this is the same as the `description` field - of the item. This field is required if the `description` is empty + of the item (discarding text after the first newline). This field is required if the `description` is empty * `_doc_items_durability`: This field is for describing how long a tool can be used before it breaks. Choose one data type: * It it is a `number`: Fixed number of uses before it breaks * If it is a `string`: Free-form text which explains how the durability works. Try to keep it short and only use it if the other types won't work @@ -179,7 +179,7 @@ explicitly). ### Hand and air The mod adds some default help texts for the hand and the air which are -written in a way that they probably are true for most subgames out of the +written in a way that they probably are true for most games out of the box, but especially the hand help text is kept intentionally vague. If you want to change these help texts or the entry names or other attributes, just add `_doc_items_*` fields to the item definition, either @@ -271,7 +271,7 @@ entry then. #### Background Normally, the core factoids are written in a very general-purpose style, so this function might -not be needed at all. But it might be useful for subgames and mods which radically break with +not be needed at all. But it might be useful for games and mods which radically break with some of the underlying core assumptions in Minetest. For example, if your mod completely changes the digging system, the help texts provided by `doc_items` are probably incorrect, so you can disable `node_mining` and register a custom factoid as a replacement. @@ -351,6 +351,13 @@ definitions are already automatically added to this factoid. * `dig_immediate`: This group is already covered by the default factoids of this mod + +## Groups interpretations +Nodes which are technically a liquid will not be considered liquids by this mod +if the group `fake_liquid=1` is used. Useful for stuff like cobwebs. + + + ## Dependencies If you only add the custom fields to your items, you do *not* need to depend on this mod. If you use anything else from this mod (e.g. a function), you diff --git a/mods/HELP/doc/doc_items/README.md b/mods/HELP/doc/doc_items/README.md index c163fea8..f361adb1 100644 --- a/mods/HELP/doc/doc_items/README.md +++ b/mods/HELP/doc/doc_items/README.md @@ -1,4 +1,4 @@ -# Item Help [`doc_items`] (Version 1.1.1) +# Item Help [`doc_items`] (Version 1.2.0) ## Description Automatically generated help texts of blocks, tools, weapons, crafting items and other items. @@ -66,3 +66,8 @@ Read `API.md` to learn more. ## License Everything in this mod is licensed under the MIT License. + +## Translation credits +French: Karamel +German: Wuzzy +Portuguese: BrunoMine diff --git a/mods/HELP/doc/doc_items/depends.txt b/mods/HELP/doc/doc_items/depends.txt deleted file mode 100644 index 31aa3903..00000000 --- a/mods/HELP/doc/doc_items/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -doc -intllib? diff --git a/mods/HELP/doc/doc_items/description.txt b/mods/HELP/doc/doc_items/description.txt deleted file mode 100644 index 7291077e..00000000 --- a/mods/HELP/doc/doc_items/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds automatically generated help texts for items. diff --git a/mods/HELP/doc/doc_items/init.lua b/mods/HELP/doc/doc_items/init.lua index ec1bbf9f..b0be3e12 100644 --- a/mods/HELP/doc/doc_items/init.lua +++ b/mods/HELP/doc/doc_items/init.lua @@ -1,10 +1,5 @@ --- Boilerplate to support localized strings if intllib mod is installed. -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end -end +local S = minetest.get_translator("doc_items") +local N = function(s) return s end doc.sub.items = {} @@ -19,16 +14,8 @@ doc.sub.items.temp.eat_bad = S("Hold it in your hand, then leftclick to eat it. doc.sub.items.temp.rotate_node = S("This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.") doc.sub.items.settings = {} -doc.sub.items.settings.friendly_group_names = false -local setting = minetest.settings:get_bool("doc_items_friendly_group_names") -if setting ~= nil then - doc.sub.items.settings.friendly_group_names = setting -end -doc.sub.items.settings.itemstring = false -setting = minetest.settings:get_bool("doc_items_show_itemstrings") -if setting ~= nil then - doc.sub.items.settings.itemstring = setting -end +doc.sub.items.settings.friendly_group_names = minetest.settings:get_bool("doc_items_friendly_group_names", false) +doc.sub.items.settings.itemstring = minetest.settings:get_bool("doc_items_show_itemstrings", false) -- Local stuff local groupdefs = {} @@ -78,10 +65,14 @@ local groups_to_string = function(grouptable, filter) end end --- Replaces all newlines with spaces +-- Removes all text after the first newline (including the newline) local scrub_newlines = function(text) - local new, x = string.gsub(text, "\n", " ") - return new + local spl = string.split(text, "\n") + if spl and #spl > 0 then + return spl[1] + else + return text + end end --[[ Append a newline to text, unless it already ends with a newline. ]] @@ -592,7 +583,7 @@ doc.add_category("nodes", { formstring = entry_image(data) datastring = factoids_header(data, "nodes") - local liquid = data.def.liquidtype ~= "none" + local liquid = data.def.liquidtype ~= "none" and minetest.get_item_group(data.itemstring, "fake_liquid") == 0 if not forbidden_core_factoids.basics then datastring = datastring .. S("Collidable: @1", yesno(data.def.walkable)) .. "\n" if data.def.pointable == true then @@ -642,7 +633,7 @@ doc.add_category("nodes", { end end local fdap = data.def.groups.fall_damage_add_percent - if fdap ~= nil then + if fdap ~= nil and fdap ~= 0 then if fdap > 0 then datastring = datastring .. S("The fall damage on this block is increased by @1%.", fdap) .. "\n" elseif fdap <= -100 then @@ -664,9 +655,13 @@ doc.add_category("nodes", { datastring = datastring .. S("This block can be climbed.").."\n" end local bouncy = data.def.groups.bouncy - if bouncy ~= nil then + if bouncy ~= nil and bouncy ~= 0 then datastring = datastring .. S("This block will make you bounce off with an elasticity of @1%.", bouncy).."\n" end + local slippery = data.def.groups.slippery + if slippery ~= nil and slippery ~= 0 then + datastring = datastring .. S("This block is slippery.") .. "\n" + end datastring = datastring .. factoid_custom("nodes", "movement", data) datastring = newline2(datastring) end @@ -841,15 +836,15 @@ doc.add_category("nodes", { local dropstring = "" local dropstring_base = "" if max == nil then - dropstring_base = S("This block will drop the following items when mined: %s.") + dropstring_base = N("This block will drop the following items when mined: @1.") elseif max == 1 then if #data.def.drop.items == 1 then - dropstring_base = S("This block will drop the following when mined: %s.") + dropstring_base = N("This block will drop the following when mined: @1.") else - dropstring_base = S("This block will randomly drop one of the following when mined: %s.") + dropstring_base = N("This block will randomly drop one of the following when mined: @1.") end else - dropstring_base = S("This block will randomly drop up to %d drops of the following possible drops when mined: %s.") + dropstring_base = N("This block will randomly drop up to @1 drops of the following possible drops when mined: @2.") end -- Save calculated probabilities into a table for later output local probtables = {} @@ -932,7 +927,7 @@ doc.add_category("nodes", { -- Final list seperator dropstring_this = dropstring_this .. S(" and ") end - local desc = S(itemtable.desc) + local desc = itemtable.desc local count = itemtable.count if count ~= 1 then desc = S("@1×@2", count, desc) @@ -963,9 +958,9 @@ doc.add_category("nodes", { pcount = pcount + 1 end if max ~= nil and max > 1 then - datastring = datastring .. string.format(dropstring_base, max, dropstring) + datastring = datastring .. S(dropstring_base, max, dropstring) else - datastring = datastring .. string.format(dropstring_base, dropstring) + datastring = datastring .. S(dropstring_base, dropstring) end datastring = newline(datastring) end @@ -1369,6 +1364,18 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv end end) +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + if player == nil then return end + local playername = player:get_player_name() + local itemstack + if action == "take" or action == "put" then + itemstack = inventory_info.stack + end + if itemstack ~= nil and playername ~= nil and playername ~= "" and (not itemstack:is_empty()) then + reveal_item(playername, itemstack:get_name()) + end +end) + minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing) if user == nil then return end local playername = user:get_player_name() @@ -1402,4 +1409,4 @@ minetest.register_globalstep(function(dtime) end end) -minetest.after(0, gather_descs) +minetest.register_on_mods_loaded(gather_descs) diff --git a/mods/HELP/doc/doc_items/locale/de.txt b/mods/HELP/doc/doc_items/locale/de.txt deleted file mode 100644 index 8bc67ad7..00000000 --- a/mods/HELP/doc/doc_items/locale/de.txt +++ /dev/null @@ -1,140 +0,0 @@ -\sUsing it as fuel turns it into: @1. = \sWird dieser Gegenstand als Brennstoff verwendet, verwandelt er sich zu: @1. -@1 seconds = @1 Sekunden -# Item count times item name -@1×@2 = @1×@2 -# Itemname (25%) -@1 (@2%) = @1 (@2%) -# Itemname (<0.5%) -@1 (<0.5%) = @1 (<0,5%) -# Itemname (ca. 25%) -@1 (ca. @2%) = @1 (ca. @2%) -# List separator (e.g. “one, two, three”) -,\s = ,\s -# Final list separator (e.g. “One, two and three”) -\sand\s = \sund\s -1 second = 1 Sekunde -A transparent block, basically empty space. It is usually left behind after digging something. = Ein transparenter Block, praktisch leerer Raum. Er wird üblicherweise hinterlassen, nachdem man etwas ausgegraben hat. -Air = Luft -Blocks = Blöcke -Building another block at this block will place it inside and replace it. = Wird ein anderer Block an diesem Block gebaut, wird dieser andere Block seine Stelle einnehmen. -Building this block is completely silent. = Das Bauen dieses Blocks ist völlig lautlos. -Collidable: @1 = Kollidiert: @1 -Description: @1 = Beschreibung: @1 -Falling blocks can go through this block; they destroy it when doing so. = Fallende Blöcke können diesen Block durchdringen; sie zerstören ihn dabei. -Full punch interval: @1 s = Schlagintervall: @1 s -Hand = Hand -Hold it in your hand, then leftclick to eat it. = Halten Sie es in Ihrer Hand, dann klicken Sie mit der linken Maustaste, um es zu essen. -Hold it in your hand, then leftclick to eat it. But why would you want to do this? = Halten Sie es in Ihrer Hand, dann klicken Sie mit der linken Maustaste, um es zu essen. Aber warum sollten Sie das tun wollen? -Item reference of all wieldable tools and weapons = Gegenstandsreferenz aller tragbaren Werkzeugen und Waffen -Item reference of blocks and other things which are capable of occupying space = Gegenstandsreferenz aller Blöcke und anderen Dingen, die Raum belegen -Item reference of items which are neither blocks, tools or weapons (esp. crafting items) = Gegenstandsreferenz aller Gegenstände, welche weder Blöcke, Werkzeuge oder Waffen sind (insb. Fertigungsgegenstände) -Liquids can flow into this block and destroy it. = Flüssigkeiten können in diesen Block hereinfließen und ihn zerstören. -Maximum stack size: @1 = Maximale Stapelgröße: @1 -Mining level: @1 = Grabestufe: @1 -Mining ratings: = Grabewertungen: -• @1, rating @2: @3 s - @4 s = • @1, Wertung @2: @3 s - @4 s -• @1, rating @2: @3 s = • @1, Wertung @2: @3 s -Mining times: = Grabezeiten: -Mining this block is completely silent. = Das Abbauen dieses Blocks ist völlig lautlos. -Miscellaneous items = Sonstige Gegenstände -No = Nein -Pointable: No = Zeigbar: Nein -Pointable: Only by special items = Zeigbar: Nur von besonderen Gegenständen -Pointable: Yes = Zeigbar: Ja -Punches with this block don't work as usual; melee combat and mining are either not possible or work differently. = Schläge mit diesem Block funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. -Punches with this item don't work as usual; melee combat and mining are either not possible or work differently. = Schläge mit diesem Gegenstand funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. -Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently. = Schläge mit diesem Werkzeug funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. -Range: @1 = Reichweite: @1 -# Range: () -Range: @1 (@2) = Reichweite: @1 (@2) -Range: 4 = Reichweite: 4 -# Rating used for digging times -Rating @1 = Wertung @1 -Rating @1-@2 = Wertung @1-@2 -The fall damage on this block is increased by @1%. = Der Fallschaden auf diesem Block ist um @1% erhöht. -The fall damage on this block is reduced by @1%. = Der Fallschaden auf diesem Block ist um @1% reduziert. -This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly. = Dieser Block ist lichtdurchlässig mit einen geringfügigen Helligkeitsverlust; Sonnenlicht passiert jedoch ohne Verlust. -This block allows light to propagate with a small loss of brightness. = Dieser Block ist lichtdurchlässig mit einen geringfügigen Helligkeitsverlust. -This block allows sunlight to propagate without loss in brightness. = Dieser Block ist vollkommen durchlässig für Sonnenlicht. -This block belongs to the @1 group. = Dieser Block gehört zur Gruppe »@1«. -This block belongs to these groups: @1. = Dieser Block gehört zu den folgenden Gruppen: @1. -This block can be climbed. = Dieser Block kann beklettert werden. -This block can be destroyed by any mining tool immediately. = Dieser Block kann von einem beliebigen Grabewerkzeug sofort zerstört werden. -This block can be destroyed by any mining tool in half a second. = Dieser Block kann von einem beliebigen Grabewerkzeug in einer halben Sekunde zerstört werden. -This block can be mined by any mining tool immediately. = Dieser Block kann von einem beliebigen Grabewerkzeug sofort abgebaut werden. -This block can be mined by any mining tool in half a second. = Dieser Block kann von einem beliebigen Grabewerkzeug in einer halben Sekunde abgebaut werden. -This block can be mined by mining tools which match any of the following mining ratings and its toughness level. = Dieser Block kann von Grabewerkzeugen abgebaut werden, falls sie auf eine der folgenden Grabewertungen sowie seinem Härtegrad passen. -This block can not be destroyed by ordinary mining tools. = Dieser Block kann nicht von Grabewerkzeugen zerstört werden. -This block can not be mined by ordinary mining tools. = Dieser Block kann nicht von gewöhnlichen Grabewerkzeugen abgebaut werden. -This block can serve as a smelting fuel with a burning time of @1. = Dieser Block kann als Brennstoff mit einer Brenndauer von @1 dienen. -This block causes a damage of @1 hit point per second. = Dieser Block richtet einen Schaden von @1 Trefferpunkt pro Sekunde an. -This block causes a damage of @1 hit points per second. = Dieser Block richtet einen Schaden von @1 Trefferpunkten pro Sekunde an. -This block connects to blocks of the @1 group. = Dieser Block verbindet sich mit Blöcken der Gruppe »@1«. -This block connects to blocks of the following groups: @1. = Dieser Block verbindet sich mit Blöcken der folgenden Gruppen: @1. -This block connects to these blocks: @1. = Dieser Block verbindet sich mit den folgenden Blöcken: @1. -This block connects to this block: @1. = Dieser Block verbindet sich mit diesem Block: @1. -This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds. = Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkt alle 2 Sekunden. -This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds. = Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkten alle 2 Sekunden. -This block glows faintly. It is barely noticable. = Dieser Block leuchtet schwach. Es ist kaum merklich. -This block is a light source with a light level of @1. = Dieser Block ist eine Lichtquelle mit einer Helligkeitsstufe von @1. -This block glows faintly with a light level of @1. = Dieser Block leuchtet schwach mit einer Helligkeitsstufe von @1. -This block is a building block for creating various buildings. = Dieser Block ist für den Bau diverser Gebäude vorgesehen. -This block is a liquid with these properties: = Dieser Block ist eine Flüssigkeit mit folgenden Eigenschaften: -This block is affected by gravity and can fall. = Dieser Block wird von der Schwerkraft beeinflusst und kann fallen. -This block is completely silent when mined or built. = Dieser Block kann vollkommen lautlos gebaut oder abgebaut werden. -This block is completely silent when walked on, mined or built. = Es ist vollkommen lautlos, wenn man auf diesen Block geht, ihn baut oder abbaut. -This block is destroyed when a falling block ends up inside it. = Dieser Block wird zerstört, wenn ein fallender Block in ihm landet. -This block negates all fall damage. = Auf diesem Block gibt es keinen Fallschaden. -This block points to liquids. = Mit diesem Block zeigt man auf Flüssigkeiten. -This block will drop as an item when a falling block ends up inside it. = Dieser Block wird sich als Gegenstand abwerfen, wenn ein fallender Block in ihn landet. -This block will drop as an item when it is not attached to a surrounding block. = Dieser Block wird sich als Gegenstand abwerfen, wenn er nicht an einen benachbarten Block befestigt ist. -This block will drop as an item when no collidable block is below it. = Dieser Block wird sich als Gegenstand abwerfen, wenn kein kollidierender Block unter ihn liegt. -This block will drop the following items when mined: %s. = Dieser Block wird nach dem Abbauen die folgenden Gegenstände abwerfen: %s. -This block will drop the following when mined: @1×@2. = Dieser Block wird nach dem Abbauen folgendes abwerfen: @1×@2. -This block will drop the following when mined: @1. = Dieser Block wird nach dem Abbauen folgendes abwerfen: @1. -This block will drop the following when mined: %s. = Dieser Block wird nach dem Abbauen folgendes abwerfen: %s. -This block will make you bounce off with an elasticity of @1%. = Dieser Block wird Sie mit einer Elastizität von @1% abprallen lassen. -This block will randomly drop one of the following when mined: %s. = Dieser Block wird nach dem Abbauen zufällig eines von den folgenden Dingen abwerfen: %s. -This block will randomly drop up to %d drops of the following possible drops when mined: %s. = Dieser Block nach dem Abbauen wird zufällig bis zu %d Abwürfe von den folgenden möglichen Abwürfen abwerfen: %s. -This block won't drop anything when mined. = Dieser Block wird nach dem Abbauen nichts abwerfen. -This is a decorational block. = Dieser Block dient zur Dekoration. -This is a melee weapon which deals damage by punching. = Dies ist eine Nahkampfwaffe, welche Schaden durch Schläge verursacht. -Maximum damage per hit: = Maximaler Schaden pro Treffer: -This item belongs to the @1 group. = Dieser Gegenstand gehört zur Gruppe »@1«. -This item belongs to these groups: @1. = Dieser Gegenstand gehört zu den folgenden Gruppen: @1. -This item can serve as a smelting fuel with a burning time of @1. = Dieser Gegenstand kann als Brennstoff mit einer Brenndauer von @1 dienen. -This item is primarily used for crafting other items. = Dieser Gegenstand wird primär für die Fertigung von anderen Gegenständen benutzt. -This item points to liquids. = Mit diesem Gegenstand zeigt man auf Flüssigkeiten. -This tool belongs to the @1 group. = Dieses Werkzeug gehört zur Gruppe »@1«. -This tool belongs to these groups: @1. = Dieses Werkzeug gehört zu den folgenden Gruppen: @1. -This tool can serve as a smelting fuel with a burning time of @1. = Dieses Werkzeug kann als Brennstoff mit einer Brenndauer von @1 dienen. -This tool is capable of mining. = Dies ist ein Grabewerkzeug. -Maximum toughness levels: = Maximale Härtegrade: -This tool points to liquids. = Mit diesem Werkzeug zeigt man auf Flüssigkeiten. -Tools and weapons = Werkzeuge und Waffen -Unknown Node = Unbekannter Node -Usage help: @1 = Benutzung: @1 -Walking on this block is completely silent. = Auf diesem Block sind Schritte lautlos. -Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand. = Wenn Sie keinen Gegenstand halten, benutzen Sie die Hand, welches als ein Werkzeug mit seinen eigenen Fägihkeiten dient. Wenn Sie einen Gegenstand halten, der kein Grabewerkzeug oder eine Waffe ist, wird er sich verhalten als wäre er die Hand. -Yes = Ja -You can not jump while standing on this block. = Man kann von diesem Block nicht abspringen. -any level = beliebige Stufe -level 0 = Stufe 0 -level 0-@1 = Stufen 0-@1 -unknown = unbekannt -Unknown item (@1) = Unbekannter Gegenstand (@1) -• @1: @2 = • @1: @2 -• @1: @2 HP = • @1: @2 TP -• @1: @2, @3 = • @1: @2, @3 -• Flowing range: @1 = • Fließweite: @1 -• No flowing = • Kein Fließen -• Not renewable = • Nicht erneuerbar -• Renewable = • Erneuerbar -• Viscosity: @1 = • Zähflüssigkeit: @1 -Itemstring: "@1" = Itemstring: »@1« -Durability: @1 uses = Haltbarkeit: @1 Benutzungen -Durability: @1 = Haltbarkeit: @1 -Mining durability: = Grabehaltbarkeit: -• @1, level @2: @3 uses = • @1, Stufe @2: @3 Benutzungen -• @1, level @2: Unlimited = • @1, Stufe @2: Unbegrenzt -This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead. = Die Rotation dieses Blocks hängt davon ab, wie sie ihn platzieren: Platzieren Sie ihn auf den Boden oder an die Decke, um ihn vertikal aufzustellen; platzieren Sie in an der Seite für eine horizontale Ausrichtung. Wenn Sie während des Bauens schleichen, wird der Block stattdessen senkrecht zur üblichen Ausrichtung rotiert. diff --git a/mods/HELP/doc/doc_items/locale/doc_items.de.tr b/mods/HELP/doc/doc_items/locale/doc_items.de.tr new file mode 100644 index 00000000..90747c38 --- /dev/null +++ b/mods/HELP/doc/doc_items/locale/doc_items.de.tr @@ -0,0 +1,143 @@ +# textdomain:doc_items + Using it as fuel turns it into: @1.= Wird dieser Gegenstand als Brennstoff verwendet, verwandelt er sich zu: @1. +@1 seconds=@1 Sekunden +# Item count times item name +@1×@2=@1×@2 +# Itemname (25%) +@1 (@2%)=@1 (@2%) +# Itemname (<0.5%) +@1 (<0.5%)=@1 (<0,5%) +# Itemname (ca. 25%) +@1 (ca. @2%)=@1 (ca. @2%) +# List separator (e.g. “one, two, three”) +, =, +# Final list separator (e.g. “One, two and three”) + and = und +1 second=1 Sekunde +A transparent block, basically empty space. It is usually left behind after digging something.=Ein transparenter Block, praktisch leerer Raum. Er wird üblicherweise hinterlassen, nachdem man etwas ausgegraben hat. +Air=Luft +Blocks=Blöcke +Building another block at this block will place it inside and replace it.=Wird ein anderer Block an diesem Block gebaut, wird dieser andere Block seine Stelle einnehmen. +Building this block is completely silent.=Das Bauen dieses Blocks ist völlig lautlos. +Collidable: @1=Kollidiert: @1 +Description: @1=Beschreibung: @1 +Falling blocks can go through this block; they destroy it when doing so.=Fallende Blöcke können diesen Block durchdringen; sie zerstören ihn dabei. +Full punch interval: @1 s=Schlagintervall: @1 s +Hand=Hand +Hold it in your hand, then leftclick to eat it.=Halten Sie es in Ihrer Hand, dann klicken Sie mit der linken Maustaste, um es zu essen. +Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Halten Sie es in Ihrer Hand, dann klicken Sie mit der linken Maustaste, um es zu essen. Aber warum sollten Sie das tun wollen? +Item reference of all wieldable tools and weapons=Gegenstandsreferenz aller tragbaren Werkzeugen und Waffen +Item reference of blocks and other things which are capable of occupying space=Gegenstandsreferenz aller Blöcke und anderen Dingen, die Raum belegen +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Gegenstandsreferenz aller Gegenstände, welche weder Blöcke, Werkzeuge oder Waffen sind (insb. Fertigungsgegenstände) +Liquids can flow into this block and destroy it.=Flüssigkeiten können in diesen Block hereinfließen und ihn zerstören. +Maximum stack size: @1=Maximale Stapelgröße: @1 +Mining level: @1=Grabestufe: @1 +Mining ratings:=Grabewertungen: +• @1, rating @2: @3 s - @4 s=• @1, Wertung @2: @3 s - @4 s +• @1, rating @2: @3 s=• @1, Wertung @2: @3 s +Mining times:=Grabezeiten: +Mining this block is completely silent.=Das Abbauen dieses Blocks ist völlig lautlos. +Miscellaneous items=Sonstige Gegenstände +No=Nein +Pointable: No=Zeigbar: Nein +Pointable: Only by special items=Zeigbar: Nur von besonderen Gegenständen +Pointable: Yes=Zeigbar: Ja +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Schläge mit diesem Block funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Schläge mit diesem Gegenstand funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Schläge mit diesem Werkzeug funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. +Range: @1=Reichweite: @1 +# Range: () +Range: @1 (@2)=Reichweite: @1 (@2) +Range: 4=Reichweite: 4 +# Rating used for digging times +Rating @1=Wertung @1 +Rating @1-@2=Wertung @1-@2 +The fall damage on this block is increased by @1%.=Der Fallschaden auf diesem Block ist um @1% erhöht. +The fall damage on this block is reduced by @1%.=Der Fallschaden auf diesem Block ist um @1% reduziert. +This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Dieser Block ist lichtdurchlässig mit einen geringfügigen Helligkeitsverlust; Sonnenlicht passiert jedoch ohne Verlust. +This block allows light to propagate with a small loss of brightness.=Dieser Block ist lichtdurchlässig mit einen geringfügigen Helligkeitsverlust. +This block allows sunlight to propagate without loss in brightness.=Dieser Block ist vollkommen durchlässig für Sonnenlicht. +This block belongs to the @1 group.=Dieser Block gehört zur Gruppe „@1“. +This block belongs to these groups: @1.=Dieser Block gehört zu den folgenden Gruppen: @1. +This block can be climbed.=Dieser Block kann beklettert werden. +This block can be destroyed by any mining tool immediately.=Dieser Block kann von einem beliebigen Grabewerkzeug sofort zerstört werden. +This block can be destroyed by any mining tool in half a second.=Dieser Block kann von einem beliebigen Grabewerkzeug in einer halben Sekunde zerstört werden. +This block can be mined by any mining tool immediately.=Dieser Block kann von einem beliebigen Grabewerkzeug sofort abgebaut werden. +This block can be mined by any mining tool in half a second.=Dieser Block kann von einem beliebigen Grabewerkzeug in einer halben Sekunde abgebaut werden. +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Dieser Block kann von Grabewerkzeugen abgebaut werden, falls sie auf eine der folgenden Grabewertungen sowie seinem Härtegrad passen. +This block can not be destroyed by ordinary mining tools.=Dieser Block kann nicht von Grabewerkzeugen zerstört werden. +This block can not be mined by ordinary mining tools.=Dieser Block kann nicht von gewöhnlichen Grabewerkzeugen abgebaut werden. +This block can serve as a smelting fuel with a burning time of @1.=Dieser Block kann als Brennstoff mit einer Brenndauer von @1 dienen. +This block causes a damage of @1 hit point per second.=Dieser Block richtet einen Schaden von @1 Trefferpunkt pro Sekunde an. +This block causes a damage of @1 hit points per second.=Dieser Block richtet einen Schaden von @1 Trefferpunkten pro Sekunde an. +This block connects to blocks of the @1 group.=Dieser Block verbindet sich mit Blöcken der Gruppe „@1“. +This block connects to blocks of the following groups: @1.=Dieser Block verbindet sich mit Blöcken der folgenden Gruppen: @1. +This block connects to these blocks: @1.=Dieser Block verbindet sich mit den folgenden Blöcken: @1. +This block connects to this block: @1.=Dieser Block verbindet sich mit diesem Block: @1. +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkt alle 2 Sekunden. +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkten alle 2 Sekunden. +This block glows faintly. It is barely noticable.=Dieser Block leuchtet schwach. Es ist kaum merklich. +This block is a light source with a light level of @1.=Dieser Block ist eine Lichtquelle mit einer Helligkeitsstufe von @1. +This block glows faintly with a light level of @1.=Dieser Block leuchtet schwach mit einer Helligkeitsstufe von @1. +This block is a building block for creating various buildings.=Dieser Block ist für den Bau diverser Gebäude vorgesehen. +This block is a liquid with these properties:=Dieser Block ist eine Flüssigkeit mit folgenden Eigenschaften: +This block is affected by gravity and can fall.=Dieser Block wird von der Schwerkraft beeinflusst und kann fallen. +This block is completely silent when mined or built.=Dieser Block kann vollkommen lautlos gebaut oder abgebaut werden. +This block is completely silent when walked on, mined or built.=Es ist vollkommen lautlos, wenn man auf diesen Block geht, ihn baut oder abbaut. +This block is destroyed when a falling block ends up inside it.=Dieser Block wird zerstört, wenn ein fallender Block in ihm landet. +This block negates all fall damage.=Auf diesem Block gibt es keinen Fallschaden. +This block points to liquids.=Mit diesem Block zeigt man auf Flüssigkeiten. +This block will drop as an item when a falling block ends up inside it.=Dieser Block wird sich als Gegenstand abwerfen, wenn ein fallender Block in ihn landet. +This block will drop as an item when it is not attached to a surrounding block.=Dieser Block wird sich als Gegenstand abwerfen, wenn er nicht an einen benachbarten Block befestigt ist. +This block will drop as an item when no collidable block is below it.=Dieser Block wird sich als Gegenstand abwerfen, wenn kein kollidierender Block unter ihn liegt. +This block will drop the following items when mined: @1.=Dieser Block wird nach dem Abbauen die folgenden Gegenstände abwerfen: @1. +This block will drop the following when mined: @1×@2.=Dieser Block wird nach dem Abbauen folgendes abwerfen: @1×@2. +This block will drop the following when mined: @1.=Dieser Block wird nach dem Abbauen folgendes abwerfen: @1. +This block will drop the following when mined: @1.=Dieser Block wird nach dem Abbauen folgendes abwerfen: @1. +This block will make you bounce off with an elasticity of @1%.=Dieser Block wird Sie mit einer Elastizität von @1% abprallen lassen. +This block will randomly drop one of the following when mined: @1.=Dieser Block wird nach dem Abbauen zufällig eines von den folgenden Dingen abwerfen: @1. +This block will randomly drop up to @1 drops of the following possible drops when mined: @2.=Dieser Block nach dem Abbauen wird zufällig bis zu @1 Abwürfe von den folgenden möglichen Abwürfen abwerfen: @2. +This block won't drop anything when mined.=Dieser Block wird nach dem Abbauen nichts abwerfen. +This is a decorational block.=Dieser Block dient zur Dekoration. +This is a melee weapon which deals damage by punching.=Dies ist eine Nahkampfwaffe, welche Schaden durch Schläge verursacht. +Maximum damage per hit:=Maximaler Schaden pro Treffer: +This item belongs to the @1 group.=Dieser Gegenstand gehört zur Gruppe „@1“. +This item belongs to these groups: @1.=Dieser Gegenstand gehört zu den folgenden Gruppen: @1. +This item can serve as a smelting fuel with a burning time of @1.=Dieser Gegenstand kann als Brennstoff mit einer Brenndauer von @1 dienen. +This item is primarily used for crafting other items.=Dieser Gegenstand wird primär für die Fertigung von anderen Gegenständen benutzt. +This item points to liquids.=Mit diesem Gegenstand zeigt man auf Flüssigkeiten. +This tool belongs to the @1 group.=Dieses Werkzeug gehört zur Gruppe „@1“. +This tool belongs to these groups: @1.=Dieses Werkzeug gehört zu den folgenden Gruppen: @1. +This tool can serve as a smelting fuel with a burning time of @1.=Dieses Werkzeug kann als Brennstoff mit einer Brenndauer von @1 dienen. +This tool is capable of mining.=Dies ist ein Grabewerkzeug. +Maximum toughness levels:=Maximale Härtegrade: +This tool points to liquids.=Mit diesem Werkzeug zeigt man auf Flüssigkeiten. +Tools and weapons=Werkzeuge und Waffen +Unknown Node=Unbekannter Node +Usage help: @1=Benutzung: @1 +Walking on this block is completely silent.=Auf diesem Block sind Schritte lautlos. +Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.=Wenn Sie keinen Gegenstand halten, benutzen Sie die Hand, welches als ein Werkzeug mit seinen eigenen Fägihkeiten dient. Wenn Sie einen Gegenstand halten, der kein Grabewerkzeug oder eine Waffe ist, wird er sich verhalten als wäre er die Hand. +Yes=Ja +You can not jump while standing on this block.=Man kann von diesem Block nicht abspringen. +any level=beliebige Stufe +level 0=Stufe 0 +level 0-@1=Stufen 0-@1 +unknown=unbekannt +Unknown item (@1)=Unbekannter Gegenstand (@1) +• @1: @2=• @1: @2 +• @1: @2 HP=• @1: @2 TP +• @1: @2, @3=• @1: @2, @3 +• Flowing range: @1=• Fließweite: @1 +• No flowing=• Kein Fließen +• Not renewable=• Nicht erneuerbar +• Renewable=• Erneuerbar +• Viscosity: @1=• Zähflüssigkeit: @1 +Itemstring: "@1"=Itemstring: „@1“ +Durability: @1 uses=Haltbarkeit: @1 Benutzungen +Durability: @1=Haltbarkeit: @1 +Mining durability:=Grabehaltbarkeit: +• @1, level @2: @3 uses=• @1, Stufe @2: @3 Benutzungen +• @1, level @2: Unlimited=• @1, Stufe @2: Unbegrenzt +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.=Die Rotation dieses Blocks hängt davon ab, wie sie ihn platzieren: Platzieren Sie ihn auf den Boden oder an die Decke, um ihn vertikal aufzustellen; platzieren Sie in an der Seite für eine horizontale Ausrichtung. Wenn Sie während des Bauens schleichen, wird der Block stattdessen senkrecht zur üblichen Ausrichtung rotiert. +Toughness level: @1=Härtegrad: @1 +This block is slippery.=Dieser Block ist rutschig. diff --git a/mods/HELP/doc/doc_items/locale/doc_items.fr.tr b/mods/HELP/doc/doc_items/locale/doc_items.fr.tr new file mode 100644 index 00000000..5d655404 --- /dev/null +++ b/mods/HELP/doc/doc_items/locale/doc_items.fr.tr @@ -0,0 +1,143 @@ +# textdomain:doc_items +Using it as fuel turns it into: @1.=L'utiliser comme combustible le transforme en : @1. +@1 seconds=@1 secondes +# Item count times item name +%@1×@2=%@1×@ +# Itemname (25%) +@1 (@2%)=@1 (@2%) +# Itemname (<0.5%) +@1 (<0.5%)=@1 (<0.5%) +# Itemname (ca. 25%) +@1 (ca. @2%)=@1 (ca. @2%) +# List separator (e.g. “one, two, three”) +, =, +# Final list separator (e.g. “One, two and three”) + and = et +1 second=1 seconde +A transparent block, basically empty space. It is usually left behind after digging something.=Un bloc transparent, tout simplement un espace vide. Il apparaît généralement après avoir creusé quelque chose. +Air=Air +Blocks=Blocs +Building another block at this block will place it inside and replace it.=Construire un autre bloc sur ce bloc le placera à l'intérieur et le remplacera. +Building this block is completely silent.=Construire ce bloc est complètement silentieux +Collidable: @1=Percutable : @1 +Description: @1=Description : @1 +Falling blocks can go through this block; they destroy it when doing so.=Les blocs en chute peuvent traverser ce bloc; ils le détruisent en faisant cela. +Full punch interval: @1 s=Intervalle de frappe : @1 +Hand=Main +Hold it in your hand, then leftclick to eat it.=Tenez-le en main, puis cliquez-gauche pour le manger. +Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Tenez-le en main, puis cliquez-gauche pour le manger. Mais pourquoi feriez-vous cela ? +Item reference of all wieldable tools and weapons=L'index des outils et armes manipulables +Item reference of blocks and other things which are capable of occupying space=L'index des blocs et autres choses qui peuvent occuper l'espace +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=L'index des choses qui ne sont ni des blocs, ni des outils ou armes (particulièrement les objets d'assemblage) +Liquids can flow into this block and destroy it.=Les liquides peuvent couler sur ce bloc et le détruire. +Maximum stack size: @1=Taille maximum de pile : @1 +Mining level: @1=Niveau de minage : @1 +Mining ratings:=Notes de minage : +• @1, rating @2: @3 s - @4 s=• @1, note @2 : @3s - @4s +• @1, rating @2: @3 s=• @1, note @2 : @3s +Mining times:=Temps de minage : +Mining this block is completely silent.=Miner ce bloc est complètement silencieux. +Miscellaneous items=Objets divers +No=Non +Pointable: No=Pointable : Non +Pointable: Only by special items=Pointable : Seulement avec des objets spéciaux +Pointable: Yes=Pointable : Oui +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Les frappes avec ce bloc ne fonctionnent pas de la manière usuelle ; le combat au corps à corps et le minage ne sont soit pas possible ou fonctionnent différemment. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Les frappes avec cet objet ne fonctionnent pas de la manière usuelle ; le combat au corps à corps et le minage ne sont soit pas possible ou fonctionnent différemment. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Les frappes avec cet outil ne fonctionnent pas de la manière usuelle ; le combat au corps à corps et le minage ne sont soit pas possible ou fonctionnent différemment. +Range: @1=Portée : @1 +# Range: () +Range: @1 (@2)=Portée : @1 (@2) +Range: 4=Portée : 4 +# Rating used for digging times +Rating @1=Note @1 +# @1 is minimal rating, @2 is maximum rating +Rating @1-@2=Note @1-@2 +The fall damage on this block is increased by @1%.=Les domages de chute sur ce bloc sont augmentés de @1%. +The fall damage on this block is reduced by @1%.=Les domages de chute sur ce bloc sont réduits de @1%. +This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Ce bloc laisse passer la lumière avec une petite perte de luminosité, et la lumière du soleil peut la traverser sans perte. +This block allows light to propagate with a small loss of brightness.=Ce bloc laisse passer la lumière avec une petite perte de luminosité. +This block allows sunlight to propagate without loss in brightness.=The bloc laisse passer la lumière du soleil sans perte de luminosité. +This block belongs to the @1 group.=Ce bloc appartient au groupe @1. +This block belongs to these groups: @1.=Ce bloc appartient aux groupes : @1. +This block can be climbed.=Ce bloc peut être escaladé. +This block can be destroyed by any mining tool immediately.=Ce bloc peut être détruit pas n'importe quel outil de minage instantanément. +This block can be destroyed by any mining tool in half a second.=Ce bloc peut être détruit pas n'importe quel outil de minage en une demi-seconde. +This block can be mined by any mining tool immediately.=Ce bloc peut être miné avec n'importe quel outil de minage instantanément. +This block can be mined by any mining tool in half a second.=Ce bloc peut être miné avec n'importe quel outil de minage en une demi-seconde. +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Ce bloc peut être miné avec les outils de minages qui ont les notes de minage et les niveaux de robustesse suivants : +This block can not be destroyed by ordinary mining tools.=Ce bloc ne peut pas être détruit avec les outils de minage ordinaires. +This block can not be mined by ordinary mining tools.=Ce bloc ne peut pas être miné avec les outils de minage ordinaires. +This block can serve as a smelting fuel with a burning time of @1.=Ce bloc peut servir de combustible pendant @1. +This block causes a damage of @1 hit point per second.=Ce bloc cause des domages de @1 point de vie par seconde. +This block causes a damage of @1 hit points per second.=Ce bloc cause des domages de @1 points de vie par seconde. +This block connects to blocks of the @1 group.=Ce bloc se connecte aux blocs du groupe @1. +This block connects to blocks of the following groups: @1.=Ce bloc se connecte aux blocs des groupes suivants : @1 +This block connects to these blocks: @1.=Ce bloc se connecte à ces blocs : @1 +This block connects to this block: @1.=Ce bloc se connecte à ce bloc : @1. +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Ce bloc réduit votre souffle et cause des domages de noyade de @1 point de vie toutes les 2 secondes. +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Ce bloc réduit votre souffle et cause des domages de noyade de @1 points de vie toutes les 2 secondes. +This block is a light source with a light level of @1.=Ce bloc est une source de lumière de niveau @1. +This block glows faintly with a light level of @1.=Ce bloc brille xxx avec une lumière de niveau @1. +This block is a building block for creating various buildings.=Ce bloc est un bloc de construction pour créer différentes bâtisses. +This block is a liquid with these properties:=Ce bloc est un liquide aux proprités suivantes : +This block is affected by gravity and can fall.=Ce bloc est affecté par la gravité et peut tomber. +This block is completely silent when mined or built.=Ce bloc ne fait pas de bruit lorsque l'on le mine ou le construit. +This block is completely silent when walked on, mined or built.=Ce bloc ne fait pas de bruit lorsque l'on marche dessus, le mine ou le construit. +This block is destroyed when a falling block ends up inside it.=Ce bloc est détruit lorsqu'un autre bloc tombe dessus. +This block negates all fall damage.=Ce bloc annule tous les domages de chute. +This block points to liquids.=Ce bloc peut pointer les liquides. +This block will drop as an item when a falling block ends up inside it.=Ce bloc se transformera en objet lorsqu'un autre bloc tombe dessus. +This block will drop as an item when it is not attached to a surrounding block.=Ce bloc se transformera en objet lorsqu'il n'est plus rattaché à un bloc alentour. +This block will drop as an item when no collidable block is below it.=Ce bloc se transformera en objet lorsqu'il n'y aura plus de bloc percutable en dessous. +This block will drop the following items when mined: @1.=Ce bloc donnera les objets suivant lorsque miné : @1. +This block will drop the following when mined: @1×@2.=Ce bloc donnera les objets suivant lorsque miné : @1×@2. +This block will drop the following when mined: @1.=Ce bloc donnera les objets suivant lorsque miné : @1. +This block will drop the following when mined: @1.=Ce bloc donnera les objets suivant lorsque miné : @1. +This block will make you bounce off with an elasticity of @1%.=Ce bloc vous fera rebondir avec une élasticité de @1%. +This block will randomly drop one of the following when mined: @1.=Ce bloc laissera tomber de manière aléatoire un des éléments suivants lorsque miné : @1. +This block will randomly drop up to @1 drops of the following possible drops when mined: @2.=Ce bloc laissera tomber de manière aléatoire jusqu'à @1 des éléments suivants lorque miné : +This block won't drop anything when mined.=Ce bloc ne donnera rien lorsque miné. +This is a decorational block.=C'est un bloc de décoration. +This is a melee weapon which deals damage by punching.=C'est une arme de mêlée qui inflige des dommages en frappant. +Maximum damage per hit:=Dommages maximaux par frappe : +This item belongs to the @1 group.=Cet objet appartient au groupe @1. +This item belongs to these groups: @1.=Cet objet appartient aux groupes suivants : @1 +This item can serve as a smelting fuel with a burning time of @1.=Cet objet peut servir de combustible pendant @1. +This item is primarily used for crafting other items.=Cet objet est principalement utilisé pour fabriquer d'autres objets. +This item points to liquids.=Cet objet peut pointer les liquides. +This tool belongs to the @1 group.=Cet outil appartient au groupe @1. +This tool belongs to these groups: @1.=Cet outil appartient aux groupes suivants : @1. +This tool can serve as a smelting fuel with a burning time of @1.=Cet outil peut servir de combustible pendant @1. +This tool is capable of mining.=Cet outil peut miner. +Maximum toughness levels:=Niveau de robustesse maximum : +This tool points to liquids.=Cet outil peut pointer les liquides. +Tools and weapons=Outils et armes +Unknown Node=Nœud inconnu +Usage help: @1=Aide d'utilisation : @1 +Walking on this block is completely silent.=Marcher sur ce bloc est silencieux. +Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.=Quand vous ne maniez aucun objet, vous utilisez la main qui se comporte comme un outil avec ses propres capacités. Lorsque vous maniez un objet qui n'est pas un outil ou une arme il se comportera comme si c'était la main. +Yes=Oui +You can not jump while standing on this block.=Vous ne pouvez pas sauter en étant sur ce bloc. +any level=Tous les niveaux +level 0=Niveau 0 +level 0-@1=Niveau 0-@1 +unknown=inconnu +Unknown item (@1)=Objet inconnu (@1) +• @1: @2=• @1 : @2 +• @1: @2 HP=• @1 : @2 PV +• @1: @2, @3=• @1 : @2, @3 +• Flowing range: @1=• Distance de flux : @1 +• No flowing=• Ne coule pas +• Not renewable=• Ne se renouvelle pas +• Renewable=• Renouvelable +• Viscosity: @1=• Viscosité : @1 +Itemstring: "@1"=Identifiant d'objet : "@1" +Durability: @1 uses=Durabilité : @1 utilisations +Durability: @1=Durabilité : @1 +Mining durability:=Durabilité de minage : +• @1, level @2: @3 uses=• @1, niveau @2 : @3 utilisations +• @1, level @2: Unlimited=• @1, niveau @2 : Illimité +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.=La manière dont vous placez ce bloc affecte sa rotation : placez-le au sol ou au plafond pour une orientation verticale ; placez-le sur un coté pour une orientation horizontale. Pour le placer de manière perpendiculaire, utilisez la touche déplacement discrêt en le plaçant. +Toughness level: @1=Niveau de robustesse : @1 +This block is slippery.=Ce bloc est glissant. diff --git a/mods/HELP/doc/doc_items/locale/doc_items.pt.tr b/mods/HELP/doc/doc_items/locale/doc_items.pt.tr new file mode 100644 index 00000000..648e1456 --- /dev/null +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt.tr @@ -0,0 +1,141 @@ +# textdomain:doc_items + Using it as fuel turns it into: @1.= Usar isso como combustivel o transforma em: @1. +@1 seconds=@1 segundos +# Item count times item name +%@1×@2=%@1×@2 +# Itemname (25%) +@1 (@2%)=@1 (@2%) +# Itemname (<0.5%) +@1 (<0.5%)=@1 (<0.5%) +# Itemname (ca. 25%) +@1 (ca. @2%)= +# List separator (e.g. “one, two, three”) +, =, +# Final list separator (e.g. “One, two and three”) + and = e +1 second=1 segundo +A transparent block, basically empty space. It is usually left behind after digging something.=Um bloco transparente, basicamente um vazio. Isso geralmente fica no lugar de um bloco removido. +Air=Ár +Blocks=Blocos +Building another block at this block will place it inside and replace it.=Construir outro bloco nesse bloco vai subistitui-lo. +Building this block is completely silent.=Construir esse bloco é completamente silencioso. +Collidable: @1=Coledível: @1 +Description: @1=Descrição: @1 +Falling blocks can go through this block; they destroy it when doing so.=Blocos caindo podem atravessar esse bloco destruindo-o. +Full punch interval: @1 s=Intervalo completo de golpe: @1 s +Hand=Mão +Hold it in your hand, then leftclick to eat it.=Segure-o na sua mão, depois clique com o botão esquerdo para comer. +Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Segure-o na sua mão, depois clique com o botão esquerdo para comer. Mas por que você quer fazer isso? +Item reference of all wieldable tools and weapons=Referência de item de todas as ferramentas e armas que podem ser usadas +Item reference of blocks and other things which are capable of occupying space=Referência de item de blocos e outras coisas que são capazes de ocupar espaço +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Referência de itens que não são blocos, ferramentas ou armas (especialmente itens de criação) +Liquids can flow into this block and destroy it.=Líquidos podem fluir por esse bloco destruindo-o. +Maximum stack size: @1=Tamanho máximo de empilhamento: @1 +Mining level: @1=Nível de mineração: @1 +Mining ratings:=Classificações de mineração: +• @1, rating @2: @3 s - @4 s= +• @1, rating @2: @3 s= +Mining times:=Tempos de mineração: +Mining this block is completely silent.=Minerar esse bloco é completamente silencioso. +Miscellaneous items=Itens variados +No=Não +Pointable: No=Apontável: Não +Pointable: Only by special items=Apontável: Apenas por itens especiais +Pointable: Yes=Apontável: Sim +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Socos com esse bloco não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Socos com esse item não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Socos com essa ferramenta não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Range: @1=Alcance: @1 +# Range: () +Range: @1 (@2)=Alcance: @1 (@2) +Range: 4=Range: 4 +# Rating used for digging times +Rating @1=Classificação @1 +# @1 is minimal rating, @2 is maximum rating +Rating @1-@2=Classificação @1-@2 +The fall damage on this block is increased by @1%.=O dano por queda nesse bloco é aumentado em @ 1%. +The fall damage on this block is reduced by @1%.=O dano por queda nesse bloco é reduzido em @ 1%. +This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Esse bloco permite que a luz se propague com uma pequena perda de brilho, e a luz solar pode até passar sem perdas. +This block allows light to propagate with a small loss of brightness.=Esse bloco permite que a luz se propague com uma pequena perda de brilho. +This block allows sunlight to propagate without loss in brightness.=Esse bloco permite que a luz solar se propague sem perda de brilho. +This block belongs to the @1 group.=Esse bloco pertence ao grupo @1. +This block belongs to these groups: @1.=Esse bloco pertence a estes grupos: @1. +This block can be climbed.=Esse bloco pode ser escalado. +This block can be destroyed by any mining tool immediately.=Esse bloco pode ser destruído de forma imediata por qualquer ferramenta de mineração. +This block can be destroyed by any mining tool in half a second.=Esse bloco pode ser destruído em meio segundo por qualquer ferramenta de mineração. +This block can be mined by any mining tool immediately.=Esse bloco pode ser extraído de forma imediata por qualquer ferramenta de mineração. +This block can be mined by any mining tool in half a second.=Esse bloco pode ser extraído em meio segundo por qualquer ferramenta de mineração. +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Esse bloco pode ser extraído por ferramentas de mineração que correspondem a qualquer uma das seguintes classificações de mineração e seu nível de resistência. +This block can not be destroyed by ordinary mining tools.=Esse bloco não pode ser destruído por ferramentas de mineração comuns. +This block can not be mined by ordinary mining tools.=Esse bloco não pode ser extraído por ferramentas de mineração comuns. +This block can serve as a smelting fuel with a burning time of @1.=Esse bloco pode servir como combustível de fundição com um tempo de queima de @1. +This block causes a damage of @1 hit point per second.=Esse bloco causa um dano de @1 ponto de impacto por segundo. +This block causes a damage of @1 hit points per second.=Esse bloco causa um dano de @1 pontos de impacto por segundo. +This block connects to blocks of the @1 group.=Esse bloco se conecta a blocos do grupo @1. +This block connects to blocks of the following groups: @1.=Esse bloco se conecta a dos seguintes grupos: @1. +This block connects to these blocks: @1.=Esse bloco se conecta aos seguintes blocos: @1. +This block connects to this block: @1.=Esse bloco se conecta a esse bloco: @1. +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Esse bloco diminui a sua respiração e causa um dano por afogamento de @1 ponto de vida a cada 2 segundos. +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Esse bloco diminui a sua respiração e causa um dano por afogamento de @1 pontos de vida a cada 2 segundos. +This block is a light source with a light level of @1.=Esse bloco é uma fonte de luz com um nível de luz de @1. +This block glows faintly with a light level of @1.=Esse bloco tem um brilho fraco com um nível de luz de @ 1. +This block is a building block for creating various buildings.=Esse bloco é um bloco de construção para criar vários edifícios. +This block is a liquid with these properties:=Esse bloco é um líquido com as seguintes propriedades: +This block is affected by gravity and can fall.=Esse bloco é afetado pela gravidade e pode cair. +This block is completely silent when mined or built.=Esse bloco é completamente silencioso quando extraído ou construído. +This block is completely silent when walked on, mined or built.=Esse bloco é completamente silencioso quando pisado, extraído ou construído. +This block is destroyed when a falling block ends up inside it.=Esse bloco é destruído quando um bloco em queda acaba dentro dele. +This block negates all fall damage.=Esse bloco nega todos os danos por queda. +This block points to liquids.=Esse bloco pode ser apontado para líquidos. +This block will drop as an item when a falling block ends up inside it.=Esse bloco vai cair como um item quando um bloco caindo acaba dentro dele. +This block will drop as an item when it is not attached to a surrounding block.=Esse bloco irá cair como um item quando não estiver anexado a um bloco adjacente. +This block will drop as an item when no collidable block is below it.=Esse bloco irá cair como um item quando nenhum bloco colidível estiver abaixo dele. +This block will drop the following items when mined: %s.=Esse bloco soltará os seguintes itens quando minerados: %s. +This block will drop the following when mined: @1×@2.=Esse bloco irá deixar cair o seguinte quando extraído: @1×@2. +This block will drop the following when mined: @1.=Esse bloco irá deixar cair o seguinte quando extraído: @1. +This block will drop the following when mined: %s.=Esse bloco irá deixar cair o seguinte quando extraído: %s. +This block will make you bounce off with an elasticity of @1%.=Esse bloco fará você saltar com uma elasticidade de @1%. +This block will randomly drop one of the following when mined: %s.=Esse bloco irá deixar cair aleatoriamente um dos seguintes quando extraído: %s. +This block will randomly drop up to %d drops of the following possible drops when mined: %s.=Esse bloco irá cair aleatoriamente %d vezes das seguintes possíveis formas quando extraído: %s. +This block won't drop anything when mined.=Esse bloco não vai deixar cair nada quando extraído. +This is a decorational block.=Esse é um bloco decorativo. +This is a melee weapon which deals damage by punching.=Essa é uma arma corpo-a-corpo que causa dano ao socar. +Maximum damage per hit:=Dano máximo por acerto: +This item belongs to the @1 group.=Esse item pertence ao grupo @1. +This item belongs to these groups: @1.=Esse item pertence aos seguintes grupos: @1. +This item can serve as a smelting fuel with a burning time of @1.=Esse item pode servir como combustível de fundição com um tempo de queima de @1. +This item is primarily used for crafting other items.=Esse item é usado principalmente para criar outros itens. +This item points to liquids.=Esse item pode ser apontado para líquidos. +This tool belongs to the @1 group.=Essa ferramenta pertence ao grupo @1. +This tool belongs to these groups: @1.=Essa ferramenta pertence aos seguintes grupos: @1. +This tool can serve as a smelting fuel with a burning time of @1.=Essa ferramenta pode servir como combustível de fundição com um tempo de queima de @1. +This tool is capable of mining.=Essa ferramenta é capaz de minerar. +Maximum toughness levels:=Níveis máximos de dureza: +This tool points to liquids.=Essa ferramenta pode ser apontada para líquidos. +Tools and weapons=Ferramentas e armas +Unknown Node=Bloco Desconhecido +Usage help: @1=Como usar: @1 +Walking on this block is completely silent.= +Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.=Sempre que você não estiver empunhando nenhum item, você usa a mão que atua como uma ferramentacom caracteristicas próprias. Quando você está empunhando um item que não é uma ferramenta de mineração ou uma arma, ele se comportará como se fosse a mão. +Yes=Sim +You can not jump while standing on this block.= Você não pode pular enquanto estiver neste bloco. +any level=qualquer nível +level 0=nível 0 +level 0-@1=nivel 0-@1 +unknown=desconhecido +Unknown item (@1)=Item desconhecido +• @1: @2= +• @1: @2 HP= +• @1: @2, @3= +• Flowing range: @1= +• No flowing= +• Not renewable= +• Renewable= +• Viscosity: @1= +Itemstring: "@1"= +Durability: @1 uses= +Durability: @1= +Mining durability:= +• @1, level @2: @3 uses= +• @1, level @2: Unlimited= +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.= diff --git a/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr new file mode 100644 index 00000000..648e1456 --- /dev/null +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr @@ -0,0 +1,141 @@ +# textdomain:doc_items + Using it as fuel turns it into: @1.= Usar isso como combustivel o transforma em: @1. +@1 seconds=@1 segundos +# Item count times item name +%@1×@2=%@1×@2 +# Itemname (25%) +@1 (@2%)=@1 (@2%) +# Itemname (<0.5%) +@1 (<0.5%)=@1 (<0.5%) +# Itemname (ca. 25%) +@1 (ca. @2%)= +# List separator (e.g. “one, two, three”) +, =, +# Final list separator (e.g. “One, two and three”) + and = e +1 second=1 segundo +A transparent block, basically empty space. It is usually left behind after digging something.=Um bloco transparente, basicamente um vazio. Isso geralmente fica no lugar de um bloco removido. +Air=Ár +Blocks=Blocos +Building another block at this block will place it inside and replace it.=Construir outro bloco nesse bloco vai subistitui-lo. +Building this block is completely silent.=Construir esse bloco é completamente silencioso. +Collidable: @1=Coledível: @1 +Description: @1=Descrição: @1 +Falling blocks can go through this block; they destroy it when doing so.=Blocos caindo podem atravessar esse bloco destruindo-o. +Full punch interval: @1 s=Intervalo completo de golpe: @1 s +Hand=Mão +Hold it in your hand, then leftclick to eat it.=Segure-o na sua mão, depois clique com o botão esquerdo para comer. +Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Segure-o na sua mão, depois clique com o botão esquerdo para comer. Mas por que você quer fazer isso? +Item reference of all wieldable tools and weapons=Referência de item de todas as ferramentas e armas que podem ser usadas +Item reference of blocks and other things which are capable of occupying space=Referência de item de blocos e outras coisas que são capazes de ocupar espaço +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Referência de itens que não são blocos, ferramentas ou armas (especialmente itens de criação) +Liquids can flow into this block and destroy it.=Líquidos podem fluir por esse bloco destruindo-o. +Maximum stack size: @1=Tamanho máximo de empilhamento: @1 +Mining level: @1=Nível de mineração: @1 +Mining ratings:=Classificações de mineração: +• @1, rating @2: @3 s - @4 s= +• @1, rating @2: @3 s= +Mining times:=Tempos de mineração: +Mining this block is completely silent.=Minerar esse bloco é completamente silencioso. +Miscellaneous items=Itens variados +No=Não +Pointable: No=Apontável: Não +Pointable: Only by special items=Apontável: Apenas por itens especiais +Pointable: Yes=Apontável: Sim +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Socos com esse bloco não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Socos com esse item não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Socos com essa ferramenta não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Range: @1=Alcance: @1 +# Range: () +Range: @1 (@2)=Alcance: @1 (@2) +Range: 4=Range: 4 +# Rating used for digging times +Rating @1=Classificação @1 +# @1 is minimal rating, @2 is maximum rating +Rating @1-@2=Classificação @1-@2 +The fall damage on this block is increased by @1%.=O dano por queda nesse bloco é aumentado em @ 1%. +The fall damage on this block is reduced by @1%.=O dano por queda nesse bloco é reduzido em @ 1%. +This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Esse bloco permite que a luz se propague com uma pequena perda de brilho, e a luz solar pode até passar sem perdas. +This block allows light to propagate with a small loss of brightness.=Esse bloco permite que a luz se propague com uma pequena perda de brilho. +This block allows sunlight to propagate without loss in brightness.=Esse bloco permite que a luz solar se propague sem perda de brilho. +This block belongs to the @1 group.=Esse bloco pertence ao grupo @1. +This block belongs to these groups: @1.=Esse bloco pertence a estes grupos: @1. +This block can be climbed.=Esse bloco pode ser escalado. +This block can be destroyed by any mining tool immediately.=Esse bloco pode ser destruído de forma imediata por qualquer ferramenta de mineração. +This block can be destroyed by any mining tool in half a second.=Esse bloco pode ser destruído em meio segundo por qualquer ferramenta de mineração. +This block can be mined by any mining tool immediately.=Esse bloco pode ser extraído de forma imediata por qualquer ferramenta de mineração. +This block can be mined by any mining tool in half a second.=Esse bloco pode ser extraído em meio segundo por qualquer ferramenta de mineração. +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Esse bloco pode ser extraído por ferramentas de mineração que correspondem a qualquer uma das seguintes classificações de mineração e seu nível de resistência. +This block can not be destroyed by ordinary mining tools.=Esse bloco não pode ser destruído por ferramentas de mineração comuns. +This block can not be mined by ordinary mining tools.=Esse bloco não pode ser extraído por ferramentas de mineração comuns. +This block can serve as a smelting fuel with a burning time of @1.=Esse bloco pode servir como combustível de fundição com um tempo de queima de @1. +This block causes a damage of @1 hit point per second.=Esse bloco causa um dano de @1 ponto de impacto por segundo. +This block causes a damage of @1 hit points per second.=Esse bloco causa um dano de @1 pontos de impacto por segundo. +This block connects to blocks of the @1 group.=Esse bloco se conecta a blocos do grupo @1. +This block connects to blocks of the following groups: @1.=Esse bloco se conecta a dos seguintes grupos: @1. +This block connects to these blocks: @1.=Esse bloco se conecta aos seguintes blocos: @1. +This block connects to this block: @1.=Esse bloco se conecta a esse bloco: @1. +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Esse bloco diminui a sua respiração e causa um dano por afogamento de @1 ponto de vida a cada 2 segundos. +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Esse bloco diminui a sua respiração e causa um dano por afogamento de @1 pontos de vida a cada 2 segundos. +This block is a light source with a light level of @1.=Esse bloco é uma fonte de luz com um nível de luz de @1. +This block glows faintly with a light level of @1.=Esse bloco tem um brilho fraco com um nível de luz de @ 1. +This block is a building block for creating various buildings.=Esse bloco é um bloco de construção para criar vários edifícios. +This block is a liquid with these properties:=Esse bloco é um líquido com as seguintes propriedades: +This block is affected by gravity and can fall.=Esse bloco é afetado pela gravidade e pode cair. +This block is completely silent when mined or built.=Esse bloco é completamente silencioso quando extraído ou construído. +This block is completely silent when walked on, mined or built.=Esse bloco é completamente silencioso quando pisado, extraído ou construído. +This block is destroyed when a falling block ends up inside it.=Esse bloco é destruído quando um bloco em queda acaba dentro dele. +This block negates all fall damage.=Esse bloco nega todos os danos por queda. +This block points to liquids.=Esse bloco pode ser apontado para líquidos. +This block will drop as an item when a falling block ends up inside it.=Esse bloco vai cair como um item quando um bloco caindo acaba dentro dele. +This block will drop as an item when it is not attached to a surrounding block.=Esse bloco irá cair como um item quando não estiver anexado a um bloco adjacente. +This block will drop as an item when no collidable block is below it.=Esse bloco irá cair como um item quando nenhum bloco colidível estiver abaixo dele. +This block will drop the following items when mined: %s.=Esse bloco soltará os seguintes itens quando minerados: %s. +This block will drop the following when mined: @1×@2.=Esse bloco irá deixar cair o seguinte quando extraído: @1×@2. +This block will drop the following when mined: @1.=Esse bloco irá deixar cair o seguinte quando extraído: @1. +This block will drop the following when mined: %s.=Esse bloco irá deixar cair o seguinte quando extraído: %s. +This block will make you bounce off with an elasticity of @1%.=Esse bloco fará você saltar com uma elasticidade de @1%. +This block will randomly drop one of the following when mined: %s.=Esse bloco irá deixar cair aleatoriamente um dos seguintes quando extraído: %s. +This block will randomly drop up to %d drops of the following possible drops when mined: %s.=Esse bloco irá cair aleatoriamente %d vezes das seguintes possíveis formas quando extraído: %s. +This block won't drop anything when mined.=Esse bloco não vai deixar cair nada quando extraído. +This is a decorational block.=Esse é um bloco decorativo. +This is a melee weapon which deals damage by punching.=Essa é uma arma corpo-a-corpo que causa dano ao socar. +Maximum damage per hit:=Dano máximo por acerto: +This item belongs to the @1 group.=Esse item pertence ao grupo @1. +This item belongs to these groups: @1.=Esse item pertence aos seguintes grupos: @1. +This item can serve as a smelting fuel with a burning time of @1.=Esse item pode servir como combustível de fundição com um tempo de queima de @1. +This item is primarily used for crafting other items.=Esse item é usado principalmente para criar outros itens. +This item points to liquids.=Esse item pode ser apontado para líquidos. +This tool belongs to the @1 group.=Essa ferramenta pertence ao grupo @1. +This tool belongs to these groups: @1.=Essa ferramenta pertence aos seguintes grupos: @1. +This tool can serve as a smelting fuel with a burning time of @1.=Essa ferramenta pode servir como combustível de fundição com um tempo de queima de @1. +This tool is capable of mining.=Essa ferramenta é capaz de minerar. +Maximum toughness levels:=Níveis máximos de dureza: +This tool points to liquids.=Essa ferramenta pode ser apontada para líquidos. +Tools and weapons=Ferramentas e armas +Unknown Node=Bloco Desconhecido +Usage help: @1=Como usar: @1 +Walking on this block is completely silent.= +Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.=Sempre que você não estiver empunhando nenhum item, você usa a mão que atua como uma ferramentacom caracteristicas próprias. Quando você está empunhando um item que não é uma ferramenta de mineração ou uma arma, ele se comportará como se fosse a mão. +Yes=Sim +You can not jump while standing on this block.= Você não pode pular enquanto estiver neste bloco. +any level=qualquer nível +level 0=nível 0 +level 0-@1=nivel 0-@1 +unknown=desconhecido +Unknown item (@1)=Item desconhecido +• @1: @2= +• @1: @2 HP= +• @1: @2, @3= +• Flowing range: @1= +• No flowing= +• Not renewable= +• Renewable= +• Viscosity: @1= +Itemstring: "@1"= +Durability: @1 uses= +Durability: @1= +Mining durability:= +• @1, level @2: @3 uses= +• @1, level @2: Unlimited= +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.= diff --git a/mods/HELP/doc/doc_items/locale/template.txt b/mods/HELP/doc/doc_items/locale/template.txt index 5f71c75a..484e40ec 100644 --- a/mods/HELP/doc/doc_items/locale/template.txt +++ b/mods/HELP/doc/doc_items/locale/template.txt @@ -1,140 +1,143 @@ -\sUsing it as fuel turns it into: @1. = -@1 seconds = +# textdomain:doc_items +Using it as fuel turns it into: @1.= +@1 seconds= # Item count times item name -%@1×@2 = +%@1×@2= # Itemname (25%) -@1 (@2%) = +@1 (@2%)= # Itemname (<0.5%) -@1 (<0.5%) = +@1 (<0.5%)= # Itemname (ca. 25%) -@1 (ca. @2%) = +@1 (ca. @2%)= # List separator (e.g. “one, two, three”) -,\s = +, = # Final list separator (e.g. “One, two and three”) -\sand\s = -1 second = -A transparent block, basically empty space. It is usually left behind after digging something. = -Air = -Blocks = -Building another block at this block will place it inside and replace it. = -Building this block is completely silent. = -Collidable: @1 = -Description: @1 = -Falling blocks can go through this block; they destroy it when doing so. = -Full punch interval: @1 s = -Hand = -Hold it in your hand, then leftclick to eat it. = -Hold it in your hand, then leftclick to eat it. But why would you want to do this? = -Item reference of all wieldable tools and weapons = -Item reference of blocks and other things which are capable of occupying space = -Item reference of items which are neither blocks, tools or weapons (esp. crafting items) = -Liquids can flow into this block and destroy it. = -Maximum stack size: @1 = -Mining level: @1 = -Mining ratings: = -• @1, rating @2: @3 s - @4 s = -• @1, rating @2: @3 s = -Mining times: = -Mining this block is completely silent. = -Miscellaneous items = -No = -Pointable: No = -Pointable: Only by special items = -Pointable: Yes = -Punches with this block don't work as usual; melee combat and mining are either not possible or work differently. = -Punches with this item don't work as usual; melee combat and mining are either not possible or work differently. = -Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently. = -Range: @1 = + and = +1 second= +A transparent block, basically empty space. It is usually left behind after digging something.= +Air= +Blocks= +Building another block at this block will place it inside and replace it.= +Building this block is completely silent.= +Collidable: @1= +Description: @1= +Falling blocks can go through this block; they destroy it when doing so.= +Full punch interval: @1 s= +Hand= +Hold it in your hand, then leftclick to eat it.= +Hold it in your hand, then leftclick to eat it. But why would you want to do this?= +Item reference of all wieldable tools and weapons= +Item reference of blocks and other things which are capable of occupying space= +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)= +Liquids can flow into this block and destroy it.= +Maximum stack size: @1= +Mining level: @1= +Mining ratings:= +• @1, rating @2: @3 s - @4 s= +• @1, rating @2: @3 s= +Mining times:= +Mining this block is completely silent.= +Miscellaneous items= +No= +Pointable: No= +Pointable: Only by special items= +Pointable: Yes= +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.= +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.= +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.= +Range: @1= # Range: () -Range: @1 (@2) = -Range: 4 = +Range: @1 (@2)= +Range: 4= # Rating used for digging times -Rating @1 = +Rating @1= # @1 is minimal rating, @2 is maximum rating -Rating @1-@2 = -The fall damage on this block is increased by @1%. = -The fall damage on this block is reduced by @1%. = -This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly. = -This block allows light to propagate with a small loss of brightness. = -This block allows sunlight to propagate without loss in brightness. = -This block belongs to the @1 group. = -This block belongs to these groups: @1. = -This block can be climbed. = -This block can be destroyed by any mining tool immediately. = -This block can be destroyed by any mining tool in half a second. = -This block can be mined by any mining tool immediately. = -This block can be mined by any mining tool in half a second. = -This block can be mined by mining tools which match any of the following mining ratings and its toughness level. = -This block can not be destroyed by ordinary mining tools. = -This block can not be mined by ordinary mining tools. = -This block can serve as a smelting fuel with a burning time of @1. = -This block causes a damage of @1 hit point per second. = -This block causes a damage of @1 hit points per second. = -This block connects to blocks of the @1 group. = -This block connects to blocks of the following groups: @1. = -This block connects to these blocks: @1. = -This block connects to this block: @1. = -This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds. = -This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds. = -This block is a light source with a light level of @1. = -This block glows faintly with a light level of @1. = -This block is a building block for creating various buildings. = -This block is a liquid with these properties: = -This block is affected by gravity and can fall. = -This block is completely silent when mined or built. = -This block is completely silent when walked on, mined or built. = -This block is destroyed when a falling block ends up inside it. = -This block negates all fall damage. = -This block points to liquids. = -This block will drop as an item when a falling block ends up inside it. = -This block will drop as an item when it is not attached to a surrounding block. = -This block will drop as an item when no collidable block is below it. = -This block will drop the following items when mined: %s. = -This block will drop the following when mined: @1×@2. = -This block will drop the following when mined: @1. = -This block will drop the following when mined: %s. = -This block will make you bounce off with an elasticity of @1%. = -This block will randomly drop one of the following when mined: %s. = -This block will randomly drop up to %d drops of the following possible drops when mined: %s. = -This block won't drop anything when mined. = -This is a decorational block. = -This is a melee weapon which deals damage by punching. = -Maximum damage per hit: = -This item belongs to the @1 group. = -This item belongs to these groups: @1. = -This item can serve as a smelting fuel with a burning time of @1. = -This item is primarily used for crafting other items. = -This item points to liquids. = -This tool belongs to the @1 group. = -This tool belongs to these groups: @1. = -This tool can serve as a smelting fuel with a burning time of @1. = -This tool is capable of mining. = -Maximum toughness levels: = -This tool points to liquids. = -Tools and weapons = -Unknown Node = -Usage help: @1 = -Walking on this block is completely silent. = -Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand. = -Yes = -You can not jump while standing on this block. = -any level = -level 0 = -level 0-@1 = -unknown = -Unknown item (@1) = -• @1: @2 = -• @1: @2 HP = -• @1: @2, @3 = -• Flowing range: @1 = -• No flowing = -• Not renewable = -• Renewable = -• Viscosity: @1 = -Itemstring: "@1" = -Durability: @1 uses = -Durability: @1 = -Mining durability: = -• @1, level @2: @3 uses = -• @1, level @2: Unlimited = -This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead. = +Rating @1-@2= +The fall damage on this block is increased by @1%.= +The fall damage on this block is reduced by @1%.= +This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.= +This block allows light to propagate with a small loss of brightness.= +This block allows sunlight to propagate without loss in brightness.= +This block belongs to the @1 group.= +This block belongs to these groups: @1.= +This block can be climbed.= +This block can be destroyed by any mining tool immediately.= +This block can be destroyed by any mining tool in half a second.= +This block can be mined by any mining tool immediately.= +This block can be mined by any mining tool in half a second.= +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.= +This block can not be destroyed by ordinary mining tools.= +This block can not be mined by ordinary mining tools.= +This block can serve as a smelting fuel with a burning time of @1.= +This block causes a damage of @1 hit point per second.= +This block causes a damage of @1 hit points per second.= +This block connects to blocks of the @1 group.= +This block connects to blocks of the following groups: @1.= +This block connects to these blocks: @1.= +This block connects to this block: @1.= +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.= +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.= +This block is a light source with a light level of @1.= +This block glows faintly with a light level of @1.= +This block is a building block for creating various buildings.= +This block is a liquid with these properties:= +This block is affected by gravity and can fall.= +This block is completely silent when mined or built.= +This block is completely silent when walked on, mined or built.= +This block is destroyed when a falling block ends up inside it.= +This block negates all fall damage.= +This block points to liquids.= +This block will drop as an item when a falling block ends up inside it.= +This block will drop as an item when it is not attached to a surrounding block.= +This block will drop as an item when no collidable block is below it.= +This block will drop the following items when mined: @1.= +This block will drop the following when mined: @1×@2.= +This block will drop the following when mined: @1.= +This block will drop the following when mined: @1.= +This block will make you bounce off with an elasticity of @1%.= +This block will randomly drop one of the following when mined: @1.= +This block will randomly drop up to @1 drops of the following possible drops when mined: @2.= +This block won't drop anything when mined.= +This is a decorational block.= +This is a melee weapon which deals damage by punching.= +Maximum damage per hit:= +This item belongs to the @1 group.= +This item belongs to these groups: @1.= +This item can serve as a smelting fuel with a burning time of @1.= +This item is primarily used for crafting other items.= +This item points to liquids.= +This tool belongs to the @1 group.= +This tool belongs to these groups: @1.= +This tool can serve as a smelting fuel with a burning time of @1.= +This tool is capable of mining.= +Maximum toughness levels:= +This tool points to liquids.= +Tools and weapons= +Unknown Node= +Usage help: @1= +Walking on this block is completely silent.= +Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.= +Yes= +You can not jump while standing on this block.= +any level= +level 0= +level 0-@1= +unknown= +Unknown item (@1)= +• @1: @2= +• @1: @2 HP= +• @1: @2, @3= +• Flowing range: @1= +• No flowing= +• Not renewable= +• Renewable= +• Viscosity: @1= +Itemstring: "@1"= +Durability: @1 uses= +Durability: @1= +Mining durability:= +• @1, level @2: @3 uses= +• @1, level @2: Unlimited= +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.= +Toughness level: @1= +This block is slippery.= diff --git a/mods/HELP/doc/doc_items/mod.conf b/mods/HELP/doc/doc_items/mod.conf index 74fa80df..f1c0fbbc 100644 --- a/mods/HELP/doc/doc_items/mod.conf +++ b/mods/HELP/doc/doc_items/mod.conf @@ -1 +1,3 @@ name = doc_items +depends = doc +description = Adds automatically generated help texts for items. diff --git a/mods/HELP/doc/doc_items/settingtypes.txt b/mods/HELP/doc/doc_items/settingtypes.txt index 8b9d635e..43e66436 100644 --- a/mods/HELP/doc/doc_items/settingtypes.txt +++ b/mods/HELP/doc/doc_items/settingtypes.txt @@ -13,4 +13,4 @@ doc_items_friendly_group_names (Show “friendly” group names) bool false #with the “give” or “debug” privilege. #The itemstring is useful to power users and programmers and #is used e.g. for the /give and /giveme commands. -doc_items_show_itemstrings (Show itemstrings) bool false +doc_items_show_itemstrings (Always show itemstrings) bool false diff --git a/mods/HELP/doc/modpack.conf b/mods/HELP/doc/modpack.conf new file mode 100644 index 00000000..5e2f4308 --- /dev/null +++ b/mods/HELP/doc/modpack.conf @@ -0,0 +1 @@ +name = doc diff --git a/mods/HELP/doc/modpack.txt b/mods/HELP/doc/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/HELP/mcl_craftguide/.luacheckrc b/mods/HELP/mcl_craftguide/.luacheckrc index a21bce1f..5a495c7a 100644 --- a/mods/HELP/mcl_craftguide/.luacheckrc +++ b/mods/HELP/mcl_craftguide/.luacheckrc @@ -4,4 +4,9 @@ allow_defined_top = true read_globals = { "minetest", "default", + "sfinv", + "sfinv_buttons", + "vector", + "string", + "table", } diff --git a/mods/HELP/mcl_craftguide/API.md b/mods/HELP/mcl_craftguide/API.md new file mode 100644 index 00000000..17b42ee7 --- /dev/null +++ b/mods/HELP/mcl_craftguide/API.md @@ -0,0 +1,171 @@ +## API + +### Custom recipes + +#### Registering a custom crafting type (example) + +```Lua +mcl_craftguide.register_craft_type("digging", { + description = "Digging", + icon = "default_tool_steelpick.png", +}) +``` + +#### Registering a custom crafting recipe (example) + +```Lua +mcl_craftguide.register_craft({ + type = "digging", + width = 1, + output = "default:cobble 2", + items = {"default:stone"}, +}) +``` + +--- + +### Recipe filters + +Recipe filters can be used to filter the recipes shown to players. Progressive +mode is implemented as a recipe filter. + +#### `mcl_craftguide.add_recipe_filter(name, function(recipes, player))` + +Adds a recipe filter with the given name. The filter function should return the +recipes to be displayed, given the available recipes and an `ObjectRef` to the +user. Each recipe is a table of the form returned by +`minetest.get_craft_recipe`. + +Example function to hide recipes for items from a mod called "secretstuff": + +```lua +mcl_craftguide.add_recipe_filter("Hide secretstuff", function(recipes) + local filtered = {} + for _, recipe in ipairs(recipes) do + if recipe.output:sub(1,12) ~= "secretstuff:" then + filtered[#filtered + 1] = recipe + end + end + + return filtered +end) +``` + +#### `mcl_craftguide.remove_recipe_filter(name)` + +Removes the recipe filter with the given name. + +#### `mcl_craftguide.set_recipe_filter(name, function(recipe, player))` + +Removes all recipe filters and adds a new one. + +#### `mcl_craftguide.get_recipe_filters()` + +Returns a map of recipe filters, indexed by name. + +--- + +### Search filters + +Search filters are used to perform specific searches inside the search field. +They can be used like so: `+=,,<...>` + +Examples: + +- `+groups=cracky,crumbly`: search for groups `cracky` and `crumbly` in all items. +- `sand+groups=falling_node`: search for group `falling_node` for items which contain `sand` in their names. + +Notes: +- If `optional name` is omitted, the search filter will apply to all items, without pre-filtering. +- Filters can be combined. +- The `groups` filter is currently implemented by default. + +#### `mcl_craftguide.add_search_filter(name, function(item, values))` + +Adds a search filter with the given name. +The search function should return a boolean value (whether the given item should be listed or not). + +Example function to show items which contain at least a recipe of given width(s): + +```lua +mcl_craftguide.add_search_filter("widths", function(item, widths) + local has_width + local recipes = recipes_cache[item] + + if recipes then + for i = 1, #recipes do + local recipe_width = recipes[i].width + for j = 1, #widths do + local width = tonumber(widths[j]) + if width == recipe_width then + has_width = true + break + end + end + end + end + + return has_width +end) +``` + +#### `mcl_craftguide.remove_search_filter(name)` + +Removes the search filter with the given name. + +#### `mcl_craftguide.get_search_filters()` + +Returns a map of search filters, indexed by name. + +--- + +### Custom formspec elements + +#### `mcl_craftguide.add_formspec_element(name, def)` + +Adds a formspec element to the current formspec. +Supported types: `box`, `label`, `image`, `button`, `tooltip`, `item_image`, `image_button`, `item_image_button` + +Example: + +```lua +mcl_craftguide.add_formspec_element("export", { + type = "button", + element = function(data) + -- Should return a table of parameters according to the formspec element type. + -- Note: for all buttons, the 'name' parameter *must not* be specified! + if data.recipes then + return { + data.iX - 3.7, -- X + sfinv_only and 7.9 or 8, -- Y + 1.6, -- W + 1, -- H + ESC(S("Export")) -- label + } + end + end, + -- Optional. + action = function(player, data) + -- When the button is pressed. + print("Exported!") + end +}) +``` + +#### `mcl_craftguide.remove_formspec_element(name)` + +Removes the formspec element with the given name. + +#### `mcl_craftguide.get_formspec_elements()` + +Returns a map of formspec elements, indexed by name. + +--- + +### Miscellaneous + +#### `mcl_craftguide.show(player_name, item, show_usages)` + +Opens the Crafting Guide with the current filter applied. + + * `player_name`: string param. diff --git a/mods/HELP/mcl_craftguide/LICENSE b/mods/HELP/mcl_craftguide/LICENSE deleted file mode 100644 index fedaf1ee..00000000 --- a/mods/HELP/mcl_craftguide/LICENSE +++ /dev/null @@ -1,681 +0,0 @@ -┌───────────────────────────────────────────────────────────────────┐ -│ Copyright (c) 2015-2017 kilbith │ -│ │ -│ Code: GPL version 3 │ -│ Textures: WTFPL (credits: Gambit) │ -└───────────────────────────────────────────────────────────────────┘ - - 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. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - 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: - - {project} Copyright (C) {year} {fullname} - 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/HELP/mcl_craftguide/README.md b/mods/HELP/mcl_craftguide/README.md index c3b1a158..f02ad346 100644 --- a/mods/HELP/mcl_craftguide/README.md +++ b/mods/HELP/mcl_craftguide/README.md @@ -1,14 +1,11 @@ -## ![Preview1](http://i.imgur.com/fIPNYkb.png) Crafting Guide ## +# Crafting Guide (MineClone 2 edition) -#### A Crafting Guide for Minetest that doesn't suck. #### +#### `mcl_craftguide` is based on, `craftguide` the most comprehensive crafting guide on Minetest. +#### Consult the [Minetest Wiki](http://wiki.minetest.net/Crafting_guide) for more details. -#### `craftguide` is simply the most comprehensive mod of his category, with the cleanest code. #### -#### Consult the [Minetest Wiki](http://wiki.minetest.net/Crafting_guide) for more details and comparisons. #### +This crafting guide can be accessed from the invenotory menu (book icon). -#### This crafting guide is usable with a blue book named *"Crafting Guide"*. #### +Crafting guide starts out empty and will be filled with more recipes whenever you hold on +to a new items that you can use to new recipes. -#### This crafting guide features two modes : Standard and Progressive. #### -The Progressive mode is a Terraria-like system that only shows recipes you can craft from items in inventory. -The progressive mode can be enabled with `craftguide_progressive_mode = true` in `minetest.conf`. - -![Preview2](http://i.imgur.com/3q7rVSo.png) +For developers, there's a modding API (see `API.md`). diff --git a/mods/HELP/mcl_craftguide/depends.txt b/mods/HELP/mcl_craftguide/depends.txt index de1a2085..5bff1157 100644 --- a/mods/HELP/mcl_craftguide/depends.txt +++ b/mods/HELP/mcl_craftguide/depends.txt @@ -2,3 +2,5 @@ mcl_core mcl_compass mcl_clock doc +sfinv? +sfinv_buttons? diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index fecd7f65..5d9c2335 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -1,50 +1,62 @@ mcl_craftguide = {} -local craftguide, datas, mt = {}, {}, minetest --- Progressive Mode: --- true: Only show recipes which include at least one of the items the player posesses --- false: Show all crafting recipes -local progressive_mode = false -if mt.settings:get_bool("craftguide_progressive_mode") == true then - progressive_mode = true -end -local get_recipe = mt.get_craft_recipe -local get_result, show_formspec = mt.get_craft_result, mt.show_formspec -local reg_items = mt.registered_items +local M = minetest +local player_data = {} -local get_recipes = function(query_item) - local recipes = mt.get_all_craft_recipes(query_item) +-- Caches +local init_items = {} +local searches = {} +local recipes_cache = {} +local usages_cache = {} +local fuel_cache = {} - -- Manually add repairing recipes (workaround, because get_all_craft_recipes - -- doesn't return repairing recipes) - if minetest.get_modpath("mcl_core") then - local def = minetest.registered_items[query_item] - if not def then - return - end - if def.type == "tool" then - if recipes == nil then - recipes = {} - end - table.insert(recipes, { - type = "normal", - width = 0, - items = { [1] = query_item, [2] = query_item }, - output = query_item, - -- Special marker for repairing recipes - _is_toolrepair = true, - }) - end - end - return recipes -end +local progressive_mode = M.settings:get_bool("mcl_craftguide_progressive_mode", true) +local sfinv_only = false + +local colorize = M.colorize +local reg_items = M.registered_items +local get_result = M.get_craft_result +local show_formspec = M.show_formspec +local get_player_by_name = M.get_player_by_name +local serialize, deserialize = M.serialize, M.deserialize + +local ESC = M.formspec_escape +local S = M.get_translator("mcl_craftguide") + +local maxn, sort, concat, insert, copy = + table.maxn, table.sort, table.concat, table.insert, + table.copy + +local fmt, find, gmatch, match, sub, split, lower = + string.format, string.find, string.gmatch, string.match, + string.sub, string.split, string.lower --- Lua 5.3 removed `table.maxn`, use this alternative in case of breakage: --- https://github.com/kilbith/xdecor/blob/master/handlers/helpers.lua#L1 -local remove, maxn, sort = table.remove, table.maxn, table.sort local min, max, floor, ceil = math.min, math.max, math.floor, math.ceil +local pairs, next, unpack = pairs, next, unpack +local vec_add, vec_mul = vector.add, vector.multiply + +local DEFAULT_SIZE = 10 +local MIN_LIMIT, MAX_LIMIT = 10, 12 +DEFAULT_SIZE = min(MAX_LIMIT, max(MIN_LIMIT, DEFAULT_SIZE)) + +local GRID_LIMIT = 5 +local POLL_FREQ = 0.25 + +local FMT = { + box = "box[%f,%f;%f,%f;%s]", + label = "label[%f,%f;%s]", + image = "image[%f,%f;%f,%f;%s]", + button = "button[%f,%f;%f,%f;%s;%s]", + tooltip = "tooltip[%s;%s]", + item_image = "item_image[%f,%f;%f,%f;%s]", + image_button = "image_button[%f,%f;%f,%f;%s;%s;%s]", + item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", +} local group_stereotypes = { + wood = "mcl_core:wood", + stone = "mcl_core:stone", + sand = "mcl_core:sand", wool = "mcl_wool:white", carpet = "mcl_wool:white_carpet", dye = "mcl_dye:red", @@ -58,512 +70,1100 @@ local group_stereotypes = { quartz_block = "mcl_nether:quartz_block", banner = "mcl_banners:banner_item_white", mesecon_conductor_craftable = "mesecons:wire_00000000_off", + purpur_block = "mcl_end:purpur_block", + normal_sandstone = "mcl_core:sandstone", + red_sandstone = "mcl_core:redsandstone", compass = mcl_compass.stereotype, clock = mcl_clock.sterotype, } local group_names = { - shulker_box = "Any shulker box", - wool = "Any wool", - wood = "Any wood planks", - tree = "Any wood", - sand = "Any sand", - sandstone = "Any sandstone (yellow)", - redsandstone = "Any red sandstone", - carpet = "Any carpet", - dye = "Any dye", - water_bucket = "Any water bucket", - flower = "Any flower", - mushroom = "Any mushroom", - wood_slab = "Any wooden slab", - wood_stairs = "Any wooden stairs", - coal = "Any coal", - quartz_block = "Any kind of quartz block", - stonebrick = "Any stone bricks", + shulker_box = S("Any shulker box"), + wool = S("Any wool"), + wood = S("Any wood planks"), + tree = S("Any wood"), + sand = S("Any sand"), + normal_sandstone = S("Any normal sandstone"), + red_sandstone = S("Any red sandstone"), + carpet = S("Any carpet"), + dye = S("Any dye"), + water_bucket = S("Any water bucket"), + flower = S("Any flower"), + mushroom = S("Any mushroom"), + wood_slab = S("Any wooden slab"), + wood_stairs = S("Any wooden stairs"), + coal = S("Any coal"), + quartz_block = S("Any kind of quartz block"), + purpur_block = S("Any kind of purpur block"), + stonebrick = S("Any stone bricks"), + stick = S("Any stick"), } -function craftguide:group_to_item(item) - if item:sub(1,6) == "group:" then - local itemsub = item:sub(7) - if group_stereotypes[itemsub] then - item = group_stereotypes[itemsub] - elseif reg_items["mcl_core:"..itemsub] then - item = item:gsub("group:", "mcl_core:") - else - for name, def in pairs(reg_items) do - if def.groups[item:match("[^,:]+$")] then - item = name - end - end + + +local item_lists = { + "main", + "craft", + "craftpreview", +} + +local function table_merge(t, t2) + t, t2 = t or {}, t2 or {} + local c = #t + + for i = 1, #t2 do + c = c + 1 + t[c] = t2[i] + end + + return t +end + +local function table_replace(t, val, new) + for k, v in pairs(t) do + if v == val then + t[k] = new end end - return item:sub(1,6) == "group:" and "" or item +end + +local function table_diff(t, t2) + local hash = {} + + for i = 1, #t do + local v = t[i] + hash[v] = true + end + + for i = 1, #t2 do + local v = t2[i] + hash[v] = nil + end + + local diff, c = {}, 0 + + for i = 1, #t do + local v = t[i] + if hash[v] then + c = c + 1 + diff[c] = v + end + end + + return diff +end + +local custom_crafts, craft_types = {}, {} + +function mcl_craftguide.register_craft_type(name, def) + local func = "mcl_craftguide.register_craft_guide(): " + assert(name, func .. "'name' field missing") + assert(def.description, func .. "'description' field missing") + assert(def.icon, func .. "'icon' field missing") + + craft_types[name] = def +end + +function mcl_craftguide.register_craft(def) + local func = "mcl_craftguide.register_craft(): " + assert(def.type, func .. "'type' field missing") + assert(def.width, func .. "'width' field missing") + assert(def.output, func .. "'output' field missing") + assert(def.items, func .. "'items' field missing") + + custom_crafts[#custom_crafts + 1] = def +end + +local recipe_filters = {} + +function mcl_craftguide.add_recipe_filter(name, f) + local func = "mcl_craftguide.add_recipe_filter(): " + assert(name, func .. "filter name missing") + assert(f and type(f) == "function", func .. "filter function missing") + + recipe_filters[name] = f +end + +function mcl_craftguide.remove_recipe_filter(name) + recipe_filters[name] = nil +end + +function mcl_craftguide.set_recipe_filter(name, f) + local func = "mcl_craftguide.set_recipe_filter(): " + assert(name, func .. "filter name missing") + assert(f and type(f) == "function", func .. "filter function missing") + + recipe_filters = {[name] = f} +end + +function mcl_craftguide.get_recipe_filters() + return recipe_filters +end + +local function apply_recipe_filters(recipes, player) + for _, filter in pairs(recipe_filters) do + recipes = filter(recipes, player) + end + + return recipes +end + +local search_filters = {} + +function mcl_craftguide.add_search_filter(name, f) + local func = "mcl_craftguide.add_search_filter(): " + assert(name, func .. "filter name missing") + assert(f and type(f) == "function", func .. "filter function missing") + + search_filters[name] = f +end + +function mcl_craftguide.remove_search_filter(name) + search_filters[name] = nil +end + +function mcl_craftguide.get_search_filters() + return search_filters +end + +local formspec_elements = {} + +function mcl_craftguide.add_formspec_element(name, def) + local func = "mcl_craftguide.add_formspec_element(): " + assert(def.element, func .. "'element' field not defined") + assert(def.type, func .. "'type' field not defined") + assert(FMT[def.type], func .. "'" .. def.type .. "' type not supported by the API") + + formspec_elements[name] = { + type = def.type, + element = def.element, + action = def.action, + } +end + +function mcl_craftguide.remove_formspec_element(name) + formspec_elements[name] = nil +end + +function mcl_craftguide.get_formspec_elements() + return formspec_elements +end + +local function item_has_groups(item_groups, groups) + for i = 1, #groups do + local group = groups[i] + if not item_groups[group] then + return + end + end + + return true end local function extract_groups(str) - if str:sub(1,6) ~= "group:" then return end - return str:sub(7):split(",") + return split(sub(str, 7), ",") end -local function colorize(str) - -- If client <= 0.4.14, don't colorize for compatibility. - return mt.colorize and mt.colorize("#FFFF00", str) or str -end - -local function get_fueltime(item) - return get_result({method="fuel", width=1, items={item}}).time -end - -function craftguide:get_tooltip(item, recipe_type, cooktime, groups) - local raw = self:get_tooltip_raw(item, recipe_type, cooktime, groups) - if raw == "" then - return raw - else - local tooltip = "tooltip["..item..";" - tooltip = tooltip .. raw - tooltip = tooltip .. "]" - return tooltip - end -end - -function craftguide:get_tooltip_raw(item, recipe_type, cooktime, groups) - local tooltip, item_desc = "", "" - local fueltime = get_fueltime(item) - local has_extras = groups or recipe_type == "cooking" or fueltime > 0 - - if reg_items[item] then - if not groups then - item_desc = reg_items[item].description +local function item_in_recipe(item, recipe) + for _, recipe_item in pairs(recipe.items) do + if recipe_item == item then + return true end - else - return tooltip.."Unknown Item ("..item..")]" end +end + +local function groups_item_in_recipe(item, recipe) + local item_groups = reg_items[item].groups + for _, recipe_item in pairs(recipe.items) do + if sub(recipe_item, 1, 6) == "group:" then + local groups = extract_groups(recipe_item) + if item_has_groups(item_groups, groups) then + local usage = copy(recipe) + table_replace(usage.items, recipe_item, item) + return usage + end + end + end +end + +local function get_item_usages(item) + local usages, c = {}, 0 + + for _, recipes in pairs(recipes_cache) do + for i = 1, #recipes do + local recipe = recipes[i] + if item_in_recipe(item, recipe) then + c = c + 1 + usages[c] = recipe + else + recipe = groups_item_in_recipe(item, recipe) + if recipe then + c = c + 1 + usages[c] = recipe + end + end + end + end + + if fuel_cache[item] then + usages[#usages + 1] = {type = "fuel", width = 1, items = {item}} + end + + return usages +end + +local function get_filtered_items(player) + local items, c = {}, 0 + + for i = 1, #init_items do + local item = init_items[i] + local recipes = recipes_cache[item] + local usages = usages_cache[item] + + if recipes and #apply_recipe_filters(recipes, player) > 0 or + usages and #apply_recipe_filters(usages, player) > 0 then + c = c + 1 + items[c] = item + end + end + + return items +end + +local function cache_recipes(output) + local recipes = M.get_all_craft_recipes(output) or {} + local c = 0 + + for i = 1, #custom_crafts do + local custom_craft = custom_crafts[i] + if match(custom_craft.output, "%S*") == output then + c = c + 1 + recipes[c] = custom_craft + end + end + + if #recipes > 0 then + recipes_cache[output] = recipes + return true + end +end + +local function get_recipes(item, data, player) + local recipes = recipes_cache[item] + local usages = usages_cache[item] + + if recipes then + recipes = apply_recipe_filters(recipes, player) + end + + local no_recipes = not recipes or #recipes == 0 + if no_recipes and not usages then + return + elseif usages and no_recipes then + data.show_usages = true + end + + if data.show_usages then + recipes = apply_recipe_filters(usages_cache[item], player) + if #recipes == 0 then + return + end + end + + return recipes +end + +local function get_burntime(item) + return get_result({method = "fuel", width = 1, items = {item}}).time +end + +local function cache_fuel(item) + local burntime = get_burntime(item) + if burntime > 0 then + fuel_cache[item] = burntime + return true + end +end + +local function groups_to_item(groups) + if #groups == 1 then + local group = groups[1] + local def_gr = "mcl_core:" .. group + + if group_stereotypes[group] then + return group_stereotypes[group] + elseif reg_items[def_gr] then + return def_gr + end + end + + for name, def in pairs(reg_items) do + if item_has_groups(def.groups, groups) then + return name + end + end + + return "" +end + +local function get_tooltip(item, groups, cooktime, burntime) + local tooltip + if groups then local gcol = "#FFAAFF" - local groupstr if #groups == 1 then local g = group_names[groups[1]] + local groupstr -- Treat the groups “compass” and “clock” as fake groups - -- and just print the normal group name without special formatting + -- and just print the normal item name without special formatting if groups[1] == "compass" or groups[1] == "clock" then - gcol = "" groupstr = reg_items[item].description elseif group_names[groups[1]] then -- Use the special group name string - groupstr = group_names[groups[1]] + groupstr = minetest.colorize(gcol, group_names[groups[1]]) else --[[ Fallback: Generic group explanation: This always works, but the internally used group name (which looks ugly) is exposed to the user. ]] - groupstr = "Any item belonging to the " .. groups[1] .. " group" + groupstr = minetest.colorize(gcol, groups[1]) + groupstr = S("Any item belonging to the @1 group", groupstr) end + tooltip = groupstr else - groupstr = "Any item belonging to the following groups: " - for i=1, #groups do - groupstr = groupstr .. groups[i].. - (groups[i+1] and " and " or "") + + local groupstr, c = {}, 0 + for i = 1, #groups do + c = c + 1 + groupstr[c] = colorize(gcol, groups[i]) end + + groupstr = concat(groupstr, ", ") + tooltip = S("Any item belonging to the groups: @1", groupstr) end - tooltip = tooltip..core.colorize(gcol, groupstr) - end - tooltip = tooltip .. item_desc - if recipe_type == "cooking" then - tooltip = tooltip.."\nCooking time: ".. - colorize(cooktime) - end - if fueltime > 0 and not groups then - tooltip = tooltip.."\nBurning time: ".. - colorize(fueltime) + else + tooltip = reg_items[item].description end - return tooltip + if not groups and cooktime then + tooltip = tooltip .. "\n" .. + S("Cooking time: @1", colorize("yellow", cooktime)) + end + + if not groups and burntime then + tooltip = tooltip .. "\n" .. + S("Burning time: @1", colorize("yellow", burntime)) + end + + return fmt(FMT.tooltip, item, ESC(tooltip)) end -function craftguide:get_recipe(iY, xoffset, tooltip_raw, item, recipe_num, recipes) - local formspec, recipes_total = "", #recipes - if recipes_total > 1 then - formspec = formspec.. - "button[0,"..(iY+3)..";2,1;alternate;Alternate]".. - "label[0,"..(iY+2)..".5;Recipe ".. - recipe_num.." of "..recipes_total.."]" - end - local recipe_type = recipes[recipe_num].type +local function get_recipe_fs(data, iY) + local fs = {} + local recipe = data.recipes[data.rnum] + local width = recipe.width + local xoffset = data.iX / 2.15 + local cooktime, shapeless - local items = recipes[recipe_num].items - local width = recipes[recipe_num].width - local cooking_time = 10 - local is_shapeless = false - if recipe_type == "normal" and width == 0 then - is_shapeless = true - if #items <= 4 then + if recipe.type == "cooking" then + cooktime, width = width, 1 + elseif width == 0 then + shapeless = true + if #recipe.items <= 4 then width = 2 else - width = min(3, #items) + width = min(3, #recipe.items) end end - if recipe_type == "cooking" then - cooking_time = width - width = 1 - formspec = formspec.. - "image["..(xoffset-0.8)..","..(iY+1).. - ".5;0.5,0.5;default_furnace_front_active.png]" - elseif is_shapeless then - formspec = formspec.. - "image["..(xoffset-0.8)..","..(iY+1).. - ".5;0.5,0.5;craftguide_shapeless.png]" + local rows = ceil(maxn(recipe.items) / width) + local rightest, btn_size, s_btn_size = 0, 1.1 + + local btn_lab = data.show_usages and + ESC(S("Usage @1 of @2", data.rnum, #data.recipes)) or + ESC(S("Recipe @1 of @2", data.rnum, #data.recipes)) + + fs[#fs + 1] = fmt(FMT.button, + sfinv_only and 5.8 or data.iX - 2.6, + sfinv_only and 7.9 or iY + 3.3, + 2.2, + 1, + "alternate", + btn_lab) + + if width > GRID_LIMIT or rows > GRID_LIMIT then + fs[#fs + 1] = fmt(FMT.label, + (data.iX / 2) - 2, + iY + 2.2, + ESC(S("Recipe is too big to be displayed (@1×@2)", width, rows))) + + return concat(fs) end - local rows = ceil(maxn(items) / width) - local btn_size, craftgrid_limit = 1, 5 + for i, item in pairs(recipe.items) do + local X = ceil((i - 1) % width + xoffset - width) - + (sfinv_only and 0 or 0.2) + local Y = ceil(i / width + (iY + 2) - min(2, rows)) - if recipe_type == "normal" and - width > craftgrid_limit or rows > craftgrid_limit then - formspec = formspec.. - "label["..xoffset..","..(iY+2).. - ";Recipe is too big to\nbe displayed (".. - width.."x"..rows..")]" + if width > 3 or rows > 3 then + btn_size = width > 3 and 3 / width or 3 / rows + s_btn_size = btn_size + X = btn_size * (i % width) + xoffset - 2.65 + Y = btn_size * floor((i - 1) / width) + (iY + 3) - min(2, rows) + end + + if X > rightest then + rightest = X + end + + local groups + if sub(item, 1, 6) == "group:" then + groups = extract_groups(item) + item = groups_to_item(groups) + end + + local label = "" + if groups and (#groups >= 1 and groups[1] ~= "compass" and groups[1] ~= "clock") then + label = "\nG" + end + + fs[#fs + 1] = fmt(FMT.item_image_button, + X, + Y + (sfinv_only and 0.7 or 0.2), + btn_size, + btn_size, + item, + match(item, "%S*"), + ESC(label)) + + local burntime = fuel_cache[item] + + if groups or cooktime or burntime then + fs[#fs + 1] = get_tooltip(item, groups, cooktime, burntime) + end + end + + local custom_recipe = craft_types[recipe.type] + + if custom_recipe or shapeless or recipe.type == "cooking" then + local icon = custom_recipe and custom_recipe.icon or + shapeless and "shapeless" or "furnace" + + if recipe.type == "cooking" then + icon = "default_furnace_front_active.png" + elseif not custom_recipe then + icon = fmt("craftguide_%s.png", icon) + end + + fs[#fs + 1] = fmt(FMT.image, + rightest + 1.2, + sfinv_only and 6.2 or iY + 1.7, + 0.5, + 0.5, + icon) + + local tooltip = custom_recipe and custom_recipe.description or + shapeless and S("Shapeless") or S("Cooking") + + fs[#fs + 1] = fmt("tooltip[%f,%f;%f,%f;%s]", + rightest + 1.2, + sfinv_only and 6.2 or iY + 1.7, + 0.5, + 0.5, + ESC(tooltip)) + end + + local arrow_X = rightest + (s_btn_size or 1.1) + local output_X = arrow_X + 0.9 + + fs[#fs + 1] = fmt(FMT.image, + arrow_X, + sfinv_only and 6.85 or iY + 2.35, + 0.9, + 0.7, + "craftguide_arrow.png") + + if recipe.type == "fuel" then + fs[#fs + 1] = fmt(FMT.image, + output_X, + sfinv_only and 6.68 or iY + 2.18, + 1.1, + 1.1, + "mcl_craftguide_fuel.png") else - for i, v in pairs(items) do - local X = (i-1) % width + xoffset - 4 + (3 - max(1, width)) - local Y = ceil(i / width + iY+2 - min(2, rows)) + local output_name = match(recipe.output, "%S+") + local burntime = fuel_cache[output_name] - if recipe_type == "normal" and - width > 3 or rows > 3 then - btn_size = width > 3 and 3 / width or 3 / rows - X = btn_size * (i % width) + xoffset - 4 + (3 - max(1, width)) + fs[#fs + 1] = fmt(FMT.item_image_button, + output_X, + sfinv_only and 6.7 or iY + 2.2, + 1.1, + 1.1, + recipe.output, + ESC(output_name), + "") - Y = btn_size * floor((i-1) / width) + iY+3 - - min(2, rows) - end + if burntime then + fs[#fs + 1] = get_tooltip(output_name, nil, nil, burntime) - local groups = extract_groups(v) - local label = "" - -- Add the “G” symbols for group item slots - if groups then - --[[ Exception: Groups “compass” and “clock” since the items in these groups should - be treated as a single item from the user perspective. ]] - if not (#groups == 1 and (groups[1] == "compass" or groups[1] == "clock")) then - label = "\nG" or "" - end - end - local item_r = self:group_to_item(v) - local tltip = self:get_tooltip( - item_r, recipe_type, cooking_time, groups) + fs[#fs + 1] = fmt(FMT.image, + output_X + 1, + sfinv_only and 6.83 or iY + 2.33, + 0.6, + 0.4, + "craftguide_arrow.png") - formspec = formspec.. - "item_image_button["..X..","..Y..";".. - btn_size..","..btn_size..";"..item_r.. - ";"..item_r..";"..label.."]"..tltip + fs[#fs + 1] = fmt(FMT.image, + output_X + 1.6, + sfinv_only and 6.68 or iY + 2.18, + 0.6, + 0.6, + "mcl_craftguide_fuel.png") end end - local output = recipes[recipe_num].output - local label = "" - if recipes[recipe_num]._is_toolrepair then - tooltip_raw = tooltip_raw .. "\n" .. core.colorize("#00FF00", string.format("Repaired by %.0f%%", (mcl_core.repair*100))) - label = "\nR" - end - return formspec.. - "image["..(xoffset-1)..","..(iY+2).. - ".12;0.9,0.7;craftguide_arrow.png]".. - "item_image_button["..(xoffset)..","..(iY+2)..";1,1;".. - output..";"..item.."_out"..";"..label.."]".."tooltip["..item.."_out"..";"..minetest.formspec_escape(tooltip_raw).."]" + + return concat(fs) end -function craftguide:get_formspec(player_name, is_fuel) - local data = datas[player_name] - local iY = data.iX - 5 +local function make_formspec(name) + local data = player_data[name] + local iY = sfinv_only and 4 or data.iX - 5 local ipp = data.iX * iY - if not data.items then - data.items = datas.init_items - end data.pagemax = max(1, ceil(#data.items / ipp)) - local formspec = "size["..data.iX..","..(iY+3)..".6;]".. - mcl_vars.gui_slots .. - mcl_vars.gui_bg .. - [=[background[1,1;1,1;craftguide_bg.png;true] - button[2.4,0.21;0.8,0.5;search;?] - button[3.05,0.21;0.8,0.5;clear;X] - tooltip[search;Search] - tooltip[clear;Reset] - tooltip[size_inc;Increase window size] - tooltip[size_dec;Decrease window size] - field_close_on_enter[filter;false]]=].. - "button["..(data.iX/2)..",-0.02;0.7,1;size_inc;+]".. - "button["..((data.iX/2) + 0.5).. - ",-0.02;0.7,1;size_dec;-]".. - "button["..(data.iX-3)..".4,0;0.8,0.95;prev;<]".. - "label["..(data.iX-2)..".1,0.18;".. - colorize(data.pagenum).." / "..data.pagemax.."]".. - "button["..(data.iX-1)..".2,0;0.8,0.95;next;>]".. - "field[0.3,0.32;2.5,1;filter;;".. - mt.formspec_escape(data.filter).."]" + local fs = {} - local even_num = data.iX % 2 == 0 - local xoffset = data.iX / 2 + (even_num and 0.5 or 0) + 2 + if not sfinv_only then + fs[#fs + 1] = fmt("size[%f,%f;]", data.iX - 0.35, iY + 4) - if not next(data.items) then - local msg = "" - if data.filter == "" then - msg = "You don't know any crafting recipes yet.\nCollect some items and open the recipe book again." - else - msg = "No crafting recipes found.\nReset the search and try again." + fs[#fs + 1] = "background9[1,1;1,1;mcl_base_textures_background9.png;true;7]" + + fs[#fs + 1] = fmt([[ tooltip[size_inc;%s] + tooltip[size_dec;%s] ]], + ESC(S("Increase window size")), + ESC(S("Decrease window size"))) + + fs[#fs + 1] = fmt([[ + image_button[%f,0.12;0.8,0.8;craftguide_zoomin_icon.png;size_inc;] + image_button[%f,0.12;0.8,0.8;craftguide_zoomout_icon.png;size_dec;] ]], + data.iX * 0.47, + data.iX * 0.47 + 0.6) + end + + fs[#fs + 1] = [[ + image_button[2.4,0.12;0.8,0.8;craftguide_search_icon.png;search;] + image_button[3.05,0.12;0.8,0.8;craftguide_clear_icon.png;clear;] + field_close_on_enter[filter;false] + ]] + + fs[#fs + 1] = fmt([[ tooltip[search;%s] + tooltip[clear;%s] + tooltip[prev;%s] + tooltip[next;%s] ]], + ESC(S("Search")), + ESC(S("Reset")), + ESC(S("Previous page")), + ESC(S("Next page"))) + + fs[#fs + 1] = fmt("label[%f,%f;%s]", + sfinv_only and 6.3 or data.iX - 2.2, + 0.22, + ESC(colorize("#383838", fmt("%s / %u", data.pagenum, data.pagemax)))) + + fs[#fs + 1] = fmt([[ + image_button[%f,0.12;0.8,0.8;craftguide_prev_icon.png;prev;] + image_button[%f,0.12;0.8,0.8;craftguide_next_icon.png;next;] ]], + sfinv_only and 5.5 or data.iX - 3.1, + sfinv_only and 7.3 or (data.iX - 1.2) - (data.iX >= 11 and 0.08 or 0)) + + fs[#fs + 1] = fmt("field[0.3,0.32;2.5,1;filter;;%s]", ESC(data.filter)) + + if #data.items == 0 then + local no_item = S("No item to show") + local pos = (data.iX / 2) - 1 + + if next(recipe_filters) and #init_items > 0 and data.filter == "" then + no_item = S("Collect items to reveal more recipes") + pos = pos - 1 end - formspec = formspec.."label[0,2;"..mt.formspec_escape(msg).."]" + + fs[#fs + 1] = fmt(FMT.label, pos, 2, ESC(no_item)) end local first_item = (data.pagenum - 1) * ipp for i = first_item, first_item + ipp - 1 do - local name = data.items[i+1] - if not name then break end + local item = data.items[i + 1] + if not item then + break + end + local X = i % data.iX local Y = (i % ipp - X) / data.iX + 1 - formspec = formspec.. - "item_image_button["..X..","..Y..";1,1;".. - name..";"..name.."_inv;]" + fs[#fs + 1] = fmt("item_image_button[%f,%f;%f,%f;%s;%s_inv;]", + X - (sfinv_only and 0 or (X * 0.05)), + Y, + 1.1, + 1.1, + item, + item) end - if data.item and reg_items[data.item] then - local tooltip_raw = self:get_tooltip_raw(data.item) - local tooltip = "" - if tooltip_raw ~= "" then - tooltip = "tooltip["..data.item..";"..minetest.formspec_escape(tooltip_raw).."]" - end - if not data.recipes_item or (is_fuel and not - get_recipe(data.item).items) then - formspec = formspec.. - "image["..(xoffset-1)..","..(iY+2).. - ".12;0.9,0.7;craftguide_arrow.png]".. - "item_image_button["..(xoffset-2)..","..(iY+2).. - ";1,1;"..data.item..";"..data.item..";]".. - tooltip.. - "image["..(xoffset)..",".. - -- TODO: Remove fire icon, find better way to represent fuel - (iY+1.98)..";1,1;mcl_craftguide_fuel.png]" - else - formspec = formspec..self:get_recipe( - iY, xoffset, tooltip_raw, data.item, - data.recipe_num, data.recipes_item) - end + if data.recipes and #data.recipes > 0 then + fs[#fs + 1] = get_recipe_fs(data, iY) end - data.formspec = formspec - show_formspec(player_name, "craftguide", formspec) -end - -local function player_has_item(T) - for i=1, #T do - if T[i] then return true end - end -end - -local function group_to_items(group) - local items_with_group, counter = {}, 0 - for name, def in pairs(reg_items) do - if def.groups[group:sub(7)] then - counter = counter + 1 - items_with_group[counter] = name - end - end - return items_with_group -end - -local function item_in_inv(inv, item) - return inv:contains_item("main", item) -end - --- Returns true if player knows the item. Used for progressive mode (EXPERIMENTAL). -local function knows_item(playername, item) - local has_item = doc.entry_exists("nodes", item) and doc.entry_revealed(playername, "nodes", item) - if not has_item then - has_item = doc.entry_exists("tools", item) and doc.entry_revealed(playername, "tools", item) - end - if not has_item then - has_item = doc.entry_exists("craftitems", item) and doc.entry_revealed(playername, "craftitems", item) - end - return has_item -end - -function craftguide:recipe_in_inv(inv, item_name, recipes_f, playername) - local recipes = recipes_f or get_recipes(item_name) or {} - local show_item_recipes = {} - - for i=1, #recipes do - show_item_recipes[i] = false - for _, item in pairs(recipes[i].items) do - local group_in_inv = false - if item:sub(1,6) == "group:" then - local groups = group_to_items(item) - for j=1, #groups do - if item_in_inv(inv, groups[j]) then - group_in_inv = true - end - end + for elem_name, def in pairs(formspec_elements) do + local element = def.element(data) + if element then + if find(def.type, "button") then + insert(element, #element, elem_name) end - if group_in_inv or item_in_inv(inv, item) or knows_item(playername, item) then - show_item_recipes[i] = true - end - end - end - for i=#show_item_recipes, 1, -1 do - if not show_item_recipes[i] then - remove(recipes, i) + + fs[#fs + 1] = fmt(FMT[def.type], unpack(element)) end end - return recipes, player_has_item(show_item_recipes) + return concat(fs) end -function craftguide:get_init_items() - local items_list, counter = {}, 0 - for name, def in pairs(reg_items) do - local is_fuel = get_fueltime(name) > 0 - local is_tool = def.type == "tool" - if (not def.groups.not_in_craft_guide or def.groups.not_in_craft_guide == 0) - and (get_recipe(name).items or is_fuel or is_tool) - and def.description and def.description ~= "" then - counter = counter + 1 - items_list[counter] = name +local show_fs = function(player, name) + if sfinv_only then + sfinv.set_player_inventory_formspec(player) + else + show_formspec(name, "mcl_craftguide", make_formspec(name)) + end +end + +mcl_craftguide.add_search_filter("groups", function(item, groups) + local itemdef = reg_items[item] + local has_groups = true + + for i = 1, #groups do + local group = groups[i] + if not itemdef.groups[group] then + has_groups = nil + break end end - sort(items_list) - datas.init_items = items_list -end + return has_groups +end) -function craftguide:get_filter_items(data, player) +local function search(data) local filter = data.filter - local items_list = progressive_mode and data.init_filter_items or - datas.init_items - local inv = player:get_inventory() - local filtered_list, counter = {}, 0 - for i=1, #items_list do - local item = items_list[i] - local item_desc = reg_items[item].description:lower() + if searches[filter] then + data.items = searches[filter] + return + end - if filter ~= "" then - if item:find(filter, 1, true) or - item_desc:find(filter, 1, true) then - counter = counter + 1 - filtered_list[counter] = item - end - elseif progressive_mode then - local _, has_item = self:recipe_in_inv(inv, item, nil, player:get_player_name()) - if has_item then - counter = counter + 1 - filtered_list[counter] = item + local filtered_list, c = {}, 0 + local extras = "^(.-)%+([%w_]+)=([%w_,]+)" + local search_filter = next(search_filters) and match(filter, extras) + local filters = {} + + if search_filter then + for filter_name, values in gmatch(filter, sub(extras, 6, -1)) do + if search_filters[filter_name] then + values = split(values, ",") + filters[filter_name] = values end end end - if progressive_mode and not data.items then - data.init_filter_items = filtered_list + for i = 1, #data.items_raw do + local item = data.items_raw[i] + local def = reg_items[item] + local desc = lower(def.description) + local search_in = item .. desc + local to_add + + if search_filter then + for filter_name, values in pairs(filters) do + local func = search_filters[filter_name] + to_add = func(item, values) and (search_filter == "" or + find(search_in, search_filter, 1, true)) + end + else + to_add = find(search_in, filter, 1, true) + end + + if to_add then + c = c + 1 + filtered_list[c] = item + end end + + if not next(recipe_filters) then + -- Cache the results only if searched 2 times + if searches[filter] == nil then + searches[filter] = false + else + searches[filter] = filtered_list + end + end + data.items = filtered_list end -mt.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "craftguide" then return end - local player_name = player:get_player_name() - local data = datas[player_name] +local function get_inv_items(player) + local inv = player:get_inventory() + local stacks = {} + + for i = 1, #item_lists do + local list = inv:get_list(item_lists[i]) + table_merge(stacks, list) + end + + local inv_items, c = {}, 0 + + for i = 1, #stacks do + local stack = stacks[i] + if not stack:is_empty() then + local name = stack:get_name() + if reg_items[name] then + c = c + 1 + inv_items[c] = name + end + end + end + + return inv_items +end + +local function init_data(name) + player_data[name] = { + filter = "", + pagenum = 1, + iX = sfinv_only and 8 or DEFAULT_SIZE, + items = init_items, + items_raw = init_items, + } +end + +local function reset_data(data) + data.filter = "" + data.pagenum = 1 + data.rnum = 1 + data.query_item = nil + data.show_usages = nil + data.recipes = nil + data.items = data.items_raw +end + +local function cache_usages() + for i = 1, #init_items do + local item = init_items[i] + usages_cache[item] = get_item_usages(item) + end +end + +local function get_init_items() + local c = 0 + for name, def in pairs(reg_items) do + local is_fuel = cache_fuel(name) + if not (def.groups.not_in_craft_guide == 1) and + def.description and def.description ~= "" and + (cache_recipes(name) or is_fuel) then + c = c + 1 + init_items[c] = name + end + end + + sort(init_items) + cache_usages() +end + +local function on_receive_fields(player, fields) + local name = player:get_player_name() + local data = player_data[name] + + for elem_name, def in pairs(formspec_elements) do + if fields[elem_name] and def.action then + return def.action(player, data) + end + end if fields.clear then - data.filter, data.item, data.pagenum, data.recipe_num = - "", nil, 1, 1 - data.items = progressive_mode and data.init_filter_items or - datas.init_items - craftguide:get_formspec(player_name) + reset_data(data) + show_fs(player, name) + elseif fields.alternate then - local recipe = data.recipes_item[data.recipe_num + 1] - data.recipe_num = recipe and data.recipe_num + 1 or 1 - craftguide:get_formspec(player_name) + if #data.recipes == 1 then + return + end + + local num_next = data.rnum + 1 + data.rnum = data.recipes[num_next] and num_next or 1 + show_fs(player, name) + elseif (fields.key_enter_field == "filter" or fields.search) and fields.filter ~= "" then - data.filter = fields.filter:lower() + local fltr = lower(fields.filter) + if data.filter == fltr then + return + end + + data.filter = fltr data.pagenum = 1 - craftguide:get_filter_items(data, player) - craftguide:get_formspec(player_name) + search(data) + show_fs(player, name) + elseif fields.prev or fields.next then + if data.pagemax == 1 then + return + end + data.pagenum = data.pagenum - (fields.prev and 1 or -1) + if data.pagenum > data.pagemax then data.pagenum = 1 elseif data.pagenum == 0 then data.pagenum = data.pagemax end - craftguide:get_formspec(player_name) - elseif (fields.size_inc and data.iX < 12) or - (fields.size_dec and data.iX > 8) then + + show_fs(player, name) + + elseif (fields.size_inc and data.iX < MAX_LIMIT) or + (fields.size_dec and data.iX > MIN_LIMIT) then data.pagenum = 1 - data.iX = data.iX - (fields.size_dec and 1 or -1) - craftguide:get_formspec(player_name) + data.iX = data.iX + (fields.size_inc and 1 or -1) + show_fs(player, name) else - for item in pairs(fields) do - if item:find(":") then - if item:sub(-4) == "_inv" or item:sub(-4) == "_out" then - item = item:sub(1,-5) - end - - local is_fuel = get_fueltime(item) > 0 - local recipes = get_recipes(item) - if not recipes and not is_fuel then return end - - if item == data.item then - if data.recipes_item and #data.recipes_item >= 2 then - local recipe = data.recipes_item[data.recipe_num + 1] - data.recipe_num = recipe and data.recipe_num + 1 or 1 - craftguide:get_formspec(player_name) - end - else - - if progressive_mode then - local inv = player:get_inventory() - local _, has_item = craftguide:recipe_in_inv(inv, item, nil, player:get_player_name()) - - if not has_item then return end - recipes = craftguide:recipe_in_inv(inv, item, recipes, player_name) - end - - data.item = item - data.recipe_num = 1 - data.recipes_item = recipes - - craftguide:get_formspec(player_name, is_fuel) + local item + for field in pairs(fields) do + if find(field, ":") then + item = field + break end end + + if not item then + return + elseif sub(item, -4) == "_inv" then + item = sub(item, 1, -5) end - end -end) -function craftguide:on_use(user) - if not datas.init_items then - craftguide:get_init_items() - end - - local player_name = user:get_player_name() - local data = datas[player_name] - - if progressive_mode or not data then - datas[player_name] = {filter="", pagenum=1, iX=9} - if progressive_mode then - craftguide:get_filter_items( - datas[player_name], user) + if item ~= data.query_item then + data.show_usages = nil + else + data.show_usages = not data.show_usages end - craftguide:get_formspec(player_name) - else - show_formspec(player_name, "craftguide", data.formspec) + + local recipes = get_recipes(item, data, player) + if not recipes then + return + end + + data.query_item = item + data.recipes = recipes + data.rnum = 1 + + show_fs(player, name) end end -mcl_craftguide.show_craftguide = function(player) - craftguide:on_use(player) +M.register_on_mods_loaded(get_init_items) + +-- TODO: Remove sfinv support +if sfinv_only then + sfinv.register_page("craftguide:craftguide", { + title = "Craft Guide", + + get = function(self, player, context) + local name = player:get_player_name() + local formspec = make_formspec(name) + + return sfinv.make_formspec(player, context, formspec) + end, + + on_enter = function(self, player, context) + if next(recipe_filters) then + local name = player:get_player_name() + local data = player_data[name] + + data.items_raw = get_filtered_items(player) + search(data) + end + end, + + on_player_receive_fields = function(self, player, context, fields) + on_receive_fields(player, fields) + end, + }) +else + M.register_on_player_receive_fields(function(player, formname, fields) + if formname == "mcl_craftguide" then + on_receive_fields(player, fields) + elseif fields.__mcl_craftguide then + mcl_craftguide.show(player:get_player_name()) + end + end) + + local function on_use(user) + local name = user:get_player_name() + + if next(recipe_filters) then + local data = player_data[name] + data.items_raw = get_filtered_items(user) + search(data) + end + + show_formspec(name, "mcl_craftguide", make_formspec(name)) + end + end -mt.register_on_player_receive_fields(function(player, formname, fields) - if fields.__mcl_craftguide then - craftguide:on_use(player) +if progressive_mode then + local function item_in_inv(item, inv_items) + local inv_items_size = #inv_items + + if sub(item, 1, 6) == "group:" then + local groups = extract_groups(item) + for i = 1, inv_items_size do + local inv_item = reg_items[inv_items[i]] + if inv_item then + local item_groups = inv_item.groups + if item_has_groups(item_groups, groups) then + return true + end + end + end + else + for i = 1, inv_items_size do + if inv_items[i] == item then + return true + end + end + end end -end) + + local function recipe_in_inv(recipe, inv_items) + for _, item in pairs(recipe.items) do + if not item_in_inv(item, inv_items) then + return + end + end + + return true + end + + local function progressive_filter(recipes, player) + local name = player:get_player_name() + local data = player_data[name] + + if #data.inv_items == 0 then + return {} + end + + local filtered, c = {}, 0 + for i = 1, #recipes do + local recipe = recipes[i] + if recipe_in_inv(recipe, data.inv_items) then + c = c + 1 + filtered[c] = recipe + end + end + + return filtered + end + + -- Workaround. Need an engine call to detect when the contents + -- of the player inventory changed, instead. + local function poll_new_items() + local players = M.get_connected_players() + for i = 1, #players do + local player = players[i] + local name = player:get_player_name() + local data = player_data[name] + local inv_items = get_inv_items(player) + local diff = table_diff(inv_items, data.inv_items) + + if #diff > 0 then + data.inv_items = table_merge(diff, data.inv_items) + end + end + + M.after(POLL_FREQ, poll_new_items) + end + + poll_new_items() + + mcl_craftguide.add_recipe_filter("Default progressive filter", progressive_filter) + + M.register_on_joinplayer(function(player) + local name = player:get_player_name() + init_data(name) + local meta = player:get_meta() + local name = player:get_player_name() + local data = player_data[name] + + data.inv_items = deserialize(meta:get_string("inv_items")) or {} + end) + + local function save_meta(player) + local meta = player:get_meta() + local name = player:get_player_name() + local data = player_data[name] + + meta:set_string("inv_items", serialize(data.inv_items)) + end + + M.register_on_leaveplayer(function(player) + save_meta(player) + local name = player:get_player_name() + player_data[name] = nil + end) + + M.register_on_shutdown(function() + local players = M.get_connected_players() + for i = 1, #players do + local player = players[i] + save_meta(player) + end + end) +else + M.register_on_joinplayer(function(player) + local name = player:get_player_name() + init_data(name) + end) + + M.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_data[name] = nil + end) +end + +function mcl_craftguide.show(name) + local player = minetest.get_player_by_name(name) + if next(recipe_filters) then + local data = player_data[name] + data.items_raw = get_filtered_items(player) + search(data) + end + show_formspec(name, "mcl_craftguide", make_formspec(name)) +end + +--[[ Custom recipes (>3x3) test code + +M.register_craftitem(":secretstuff:custom_recipe_test", { + description = "Custom Recipe Test", +}) + +local cr = {} +for x = 1, 6 do + cr[x] = {} + for i = 1, 10 - x do + cr[x][i] = {} + for j = 1, 10 - x do + cr[x][i][j] = "group:wood" + end + end + + M.register_craft({ + output = "secretstuff:custom_recipe_test", + recipe = cr[x] + }) +end +]] diff --git a/mods/HELP/mcl_craftguide/license.txt b/mods/HELP/mcl_craftguide/license.txt new file mode 100644 index 00000000..57174d4d --- /dev/null +++ b/mods/HELP/mcl_craftguide/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) + +Copyright (c) 2015-2019 Jean-Patrick Guerrero 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. + + +Licenses of media (textures) +---------------------------- + +Copyright © Diego Martínez (kaeza): craftguide_*_icon.png (CC BY-SA 3.0) + +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/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr new file mode 100644 index 00000000..5d8ea21b --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_craftguide +Any shulker box=Beliebige Schulkerkiste +Any wool=Beliebige Wolle +Any wood planks=Beliebige Holzplanken +Any wood=Beliebiges Holz +Any sand=Beliebiger Sand +Any normal sandstone=Beliebiger normaler Sandstein +Any red sandstone=Beliebiger roter Sandstein +Any carpet=Beliebiger Teppich +Any dye=Beliebiger Farbstoff +Any water bucket=Beliebiger Wassereimer +Any flower=Beliebige Blume +Any mushroom=Beliebiger Pilz +Any wooden slab=Beliebige Holzplatte +Any wooden stairs=Beliebgie Holztreppe +Any coal=Beliebige Kohle +Any kind of quartz block=Beliebiger Quarzblock +Any kind of purpur block=Beliebiger Purpurblock +Any stone bricks=Beliebige Steinziegel +Any stick=Beliebiger Stock +Any item belonging to the @1 group=Beliebiger Gegenstand aus Gruppe: @1 +Any item belonging to the groups: @1=Beliebiger Gegenstand aus den Gruppen: @1 +Search=Suche +Reset=Zurücksetzen +Previous page=Vorherige Seite +Next page=Nächste Seite +Usage @1 of @2=Verwendung @1 von @2 +Recipe @1 of @2=Rezept @1 von @2 +Burning time: @1=Brennzeit: @1 +Cooking time: @1=Kochzeit: @1 +Recipe is too big to be displayed (@1×@2)=Rezept ist zu groß für die Anzeige (@1×@2) +Shapeless=Formlos +Cooking=Kochen +Increase window size=Fenster vergrößern +Decrease window size=Fenster verkleinern +No item to show=Nichts anzuzeigen +Collect items to reveal more recipes=Gegenstände aufsammeln, um mehr Rezepte aufzudecken diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr new file mode 100644 index 00000000..56d150d9 --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_craftguide +Any shulker box=Toutes boîtes shulker +Any wool=Toutes laines +Any wood planks=Toutes planches de bois +Any wood=Tout bois +Any sand=Tout sable +Any normal sandstone=Tout grès normal +Any red sandstone=Tout grès rouge +Any carpet=Tout tapis +Any dye=Tout colorant +Any water bucket=Tout seau d'eau +Any flower=Toute fleur +Any mushroom=Tout Champignon +Any wooden slab=Toute dalle de bois +Any wooden stairs=Tout escalier de bois +Any coal=Tout charbon +Any kind of quartz block=Toute sorte de bloc de quartz +Any kind of purpur block=Toute sorte de bloc de purpur +Any stone bricks=Tout brique de pierre +Any stick=Tout bâton +Any item belonging to the @1 group=Tout élément appartenant au groupe @1 +Any item belonging to the groups: @1=Tout élément appartenant aux groupes: @1 +Search=Rechercher +Reset=Réinitialiser +Previous page=Page précédente +Next page=Page suivante +Usage @1 of @2=Usage @1 de @2 +Recipe @1 of @2=Recette @1 de @2 +Burning time: @1=Temps de combustion : @1 +Cooking time: @1=Temps de cuisson : @1 +Recipe is too big to be displayed (@1×@2)=La recette est trop grande pour être affichée (@1×@2) +Shapeless=Sans forme +Cooking=Cuisson +Increase window size=Agrandir la fenêtre +Decrease window size=Réduire la fenêtre +No item to show=Aucun item à afficher +Collect items to reveal more recipes=Collecte des items pour révéler plus de recettes diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr new file mode 100644 index 00000000..b3c148a6 --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr @@ -0,0 +1,38 @@ +# textdomain: mcl_craftguide +Any shulker box= +Any wool= +Any wood planks= +Any wood= +Any sand= +Any normal sandstone= +Any red sandstone= +Any carpet= +Any dye= +Any water bucket= +Any flower= +Any mushroom= +Any wooden slab= +Any wooden stairs= +Any coal= +Any kind of quartz block= +Any kind of purpur block= +Any stone bricks= +Any stick= +Any item belonging to the @1 group= +Any item belonging to the groups: @1= +Search=Поиск +Reset=Сброс +Previous page=Предыдущая страница +Next page=Следущая страница +Usage @1 of @2=использование @1 из @2 +Recipe @1 of @2=Рецепт @1 из @2 +Burning time: @1=Время горения: @1 +Cooking time: @1=Время преготовления: @1 +Any item belonging to the group(s): @1=Любой элемент из группы: @1 +Recipe is too big to be displayed (@1×@2)=Рецепт слишком большой для показа (@1×@2) +Shapeless=Бесформенный +Cooking=Приготовление +Increase window size=Увеличить окно +Decrease window size=Уменьшить окно +No item to show=Нет элемента для показа +Collect items to reveal more recipes=Собирайте предметы, чтобы раскрыть больше рецептов diff --git a/mods/HELP/mcl_craftguide/locale/template.txt b/mods/HELP/mcl_craftguide/locale/template.txt new file mode 100644 index 00000000..f59e97af --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/template.txt @@ -0,0 +1,37 @@ +# textdomain: craftguide +Any shulker box= +Any wool= +Any wood planks= +Any wood= +Any sand= +Any normal sandstone= +Any red sandstone= +Any carpet= +Any dye= +Any water bucket= +Any flower= +Any mushroom= +Any wooden slab= +Any wooden stairs= +Any coal= +Any kind of quartz block= +Any kind of purpur block= +Any stone bricks= +Any stick= +Any item belonging to the @1 group= +Any item belonging to the groups: @1= +Search= +Reset= +Previous page= +Next page= +Usage @1 of @2= +Recipe @1 of @2= +Burning time: @1= +Cooking time: @1= +Recipe is too big to be displayed (@1x@2)= +Shapeless= +Cooking= +Increase window size= +Decrease window size= +No item to show= +Collect items to reveal more recipes= diff --git a/mods/HELP/mcl_craftguide/settingtypes.txt b/mods/HELP/mcl_craftguide/settingtypes.txt new file mode 100644 index 00000000..dd3a5915 --- /dev/null +++ b/mods/HELP/mcl_craftguide/settingtypes.txt @@ -0,0 +1,4 @@ +# If enabled, the recipe book will progressively be filled with new recipes that can be crafted from all items you ever have had in your inventory. +# Recommended for new players and for a spoiler-free gameplay experience. +# If disabled, all recipes will be shown. +mcl_craftguide_progressive_mode (Learn crafting recipes progressively) bool true diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_arrow.png b/mods/HELP/mcl_craftguide/textures/craftguide_arrow.png index 0a3740d8..c27a807c 100644 Binary files a/mods/HELP/mcl_craftguide/textures/craftguide_arrow.png and b/mods/HELP/mcl_craftguide/textures/craftguide_arrow.png differ diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_bg.png b/mods/HELP/mcl_craftguide/textures/craftguide_bg.png deleted file mode 100644 index 3b6c60da..00000000 Binary files a/mods/HELP/mcl_craftguide/textures/craftguide_bg.png and /dev/null differ diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_clear_icon.png b/mods/HELP/mcl_craftguide/textures/craftguide_clear_icon.png new file mode 100644 index 00000000..12d88f55 Binary files /dev/null and b/mods/HELP/mcl_craftguide/textures/craftguide_clear_icon.png differ diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_next_icon.png b/mods/HELP/mcl_craftguide/textures/craftguide_next_icon.png new file mode 100644 index 00000000..03f96091 Binary files /dev/null and b/mods/HELP/mcl_craftguide/textures/craftguide_next_icon.png differ diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_prev_icon.png b/mods/HELP/mcl_craftguide/textures/craftguide_prev_icon.png new file mode 100644 index 00000000..71509e71 Binary files /dev/null and b/mods/HELP/mcl_craftguide/textures/craftguide_prev_icon.png differ diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_search_icon.png b/mods/HELP/mcl_craftguide/textures/craftguide_search_icon.png new file mode 100644 index 00000000..9caa134c Binary files /dev/null and b/mods/HELP/mcl_craftguide/textures/craftguide_search_icon.png differ diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_shapeless.png b/mods/HELP/mcl_craftguide/textures/craftguide_shapeless.png index d954a9f7..2b4edc4c 100644 Binary files a/mods/HELP/mcl_craftguide/textures/craftguide_shapeless.png and b/mods/HELP/mcl_craftguide/textures/craftguide_shapeless.png differ diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_zoomin_icon.png b/mods/HELP/mcl_craftguide/textures/craftguide_zoomin_icon.png new file mode 100644 index 00000000..2f9f6240 Binary files /dev/null and b/mods/HELP/mcl_craftguide/textures/craftguide_zoomin_icon.png differ diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_zoomout_icon.png b/mods/HELP/mcl_craftguide/textures/craftguide_zoomout_icon.png new file mode 100644 index 00000000..2815f939 Binary files /dev/null and b/mods/HELP/mcl_craftguide/textures/craftguide_zoomout_icon.png differ diff --git a/mods/HELP/mcl_craftguide/textures/mcl_craftguide_fuel.png b/mods/HELP/mcl_craftguide/textures/mcl_craftguide_fuel.png index a5f57546..2e3cc8f4 100644 Binary files a/mods/HELP/mcl_craftguide/textures/mcl_craftguide_fuel.png and b/mods/HELP/mcl_craftguide/textures/mcl_craftguide_fuel.png differ diff --git a/mods/HELP/mcl_doc/init.lua b/mods/HELP/mcl_doc/init.lua index 7c4f36c3..6f9b5a20 100644 --- a/mods/HELP/mcl_doc/init.lua +++ b/mods/HELP/mcl_doc/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_doc") + -- Disable built-in factoids; it is planned to add custom ones as replacements doc.sub.items.disable_core_factoid("node_mining") doc.sub.items.disable_core_factoid("tool_capabilities") @@ -14,7 +16,7 @@ end) -- dig_by_water doc.sub.items.register_factoid("nodes", "drop_destroy", function(itemstring, def) if def.groups.dig_by_water then - return "Water can flow into this block and cause it to drop as an item." + return S("Water can flow into this block and cause it to drop as an item.") end return "" end) @@ -22,9 +24,9 @@ end) -- usable by hoes doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) if def.groups.cultivatable == 2 then - return "This block can be turned into dirt with a hoe." + return S("This block can be turned into dirt with a hoe.") elseif def.groups.cultivatable == 2 then - return "This block can be turned into farmland with a hoe." + return S("This block can be turned into farmland with a hoe.") end return "" end) @@ -33,24 +35,38 @@ end) doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) local datastring = "" if def.groups.soil_sapling == 2 then - datastring = datastring .. "This block acts as a soil for all saplings." .. "\n" + datastring = datastring .. S("This block acts as a soil for all saplings.") .. "\n" elseif def.groups.soil_sapling == 1 then - datastring = datastring .. "This block acts as a soil for some saplings." .. "\n" + datastring = datastring .. S("This block acts as a soil for some saplings.") .. "\n" end if def.groups.soil_sugarcane then - datastring = datastring .. "Sugar canes will grow on this block." .. "\n" + datastring = datastring .. S("Sugar canes will grow on this block.") .. "\n" end if def.groups.soil_nether_wart then - datastring = datastring .. "Nether wart will grow on this block." .. "\n" + datastring = datastring .. S("Nether wart will grow on this block.") .. "\n" end return datastring end) +doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) + local formstring = "" + if def.groups.leafdecay ~= nil then + if def.drop ~= "" and def.drop ~= nil and def.drop ~= itemstring then + formstring = S("This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.", def.groups.leafdecay) + else + formstring = S("This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.", def.groups.leafdecay) + end + end + return formstring +end) + -- nodes which have flower placement rules doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) local datastring = "" if def.groups.place_flowerlike == 1 then - return "This plant can only grow on dirt, grass blocks and podzol. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher." + return S("This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.") + elseif def.groups.place_flowerlike == 2 then + return S("This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.") end return "" end) @@ -58,7 +74,7 @@ end) -- flammable doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) if def.groups.flammable then - return "This block is flammable." + return S("This block is flammable.") end return "" end) @@ -66,7 +82,7 @@ end) -- destroys_items doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) if def.groups.destroys_items then - return "This block destroys any item it touches." + return S("This block destroys any item it touches.") end return "" end) @@ -77,25 +93,25 @@ doc.sub.items.register_factoid(nil, "use", function(itemstring, def) local s = "" if def.groups.eatable and not def._doc_items_usagehelp then if def.groups.food == 2 then - s = s .. "To eat it, wield it, then rightclick." + s = s .. S("To eat it, wield it, then rightclick.") if def.groups.can_eat_when_full == 1 then - s = s .. "\n" .. "You can eat this even when your hunger bar is full." + s = s .. "\n" .. S("You can eat this even when your hunger bar is full.") else - s = s .. "\n" .. "You cannot eat this when your hunger bar is full." + s = s .. "\n" .. S("You cannot eat this when your hunger bar is full.") end elseif def.groups.food == 3 then - s = s .. "To drink it, wield it, then rightclick." + s = s .. S("To drink it, wield it, then rightclick.") if def.groups.can_eat_when_full ~= 1 then - s = s .. "\n" .. "You cannot drink this when your hunger bar is full." + s = s .. "\n" .. S("You cannot drink this when your hunger bar is full.") end else - s = s .. "To consume it, wield it, then rightclick." + s = s .. S("To consume it, wield it, then rightclick.") if def.groups.can_eat_when_full ~= 1 then - s = s .. "\n" .. "You cannot consume this when your hunger bar is full." + s = s .. "\n" .. S("You cannot consume this when your hunger bar is full.") end end if def.groups.no_eat_delay ~= 1 then - s = s .. "\n" .. "You have to wait for about 2 seconds before you can eat or drink again." + s = s .. "\n" .. S("You have to wait for about 2 seconds before you can eat or drink again.") end end return s @@ -104,25 +120,107 @@ end) doc.sub.items.register_factoid(nil, "groups", function(itemstring, def) local s = "" if def.groups.eatable and def.groups.eatable > 0 then - s = s .. string.format("Hunger points restored: %d", def.groups.eatable) + s = s .. S("Hunger points restored: @1", def.groups.eatable) end if def._mcl_saturation and def._mcl_saturation > 0 then - s = s .. "\n" .. string.format("Saturation points restored: %.1f", def._mcl_saturation) + s = s .. "\n" .. S("Saturation points restored: @1%.1f", string.format("%.1f", def._mcl_saturation)) + end + return s +end) + +-- Armor +doc.sub.items.register_factoid(nil, "use", function(itemstring, def) + local def = minetest.registered_items[itemstring] + local s = "" + local head = minetest.get_item_group(itemstring, "armor_head") + local torso = minetest.get_item_group(itemstring, "armor_torso") + local legs = minetest.get_item_group(itemstring, "armor_legs") + local feet = minetest.get_item_group(itemstring, "armor_feet") + if head > 0 then + s = s .. S("It can be worn on the head.") + s = s .. "\n" + end + if torso > 0 then + s = s .. S("It can be worn on the torso.") + s = s .. "\n" + end + if legs > 0 then + s = s .. S("It can be worn on the legs.") + s = s .. "\n" + end + if feet > 0 then + s = s .. S("It can be worn on the feet.") + s = s .. "\n" + end + return s +end) +doc.sub.items.register_factoid(nil, "groups", function(itemstring, def) + local def = minetest.registered_items[itemstring] + local s = "" + local use = minetest.get_item_group(itemstring, "mcl_armor_uses") + local pts = minetest.get_item_group(itemstring, "mcl_armor_points") + if pts > 0 then + s = s .. S("Armor points: @1", pts) + s = s .. "\n" + end + if use > 0 then + s = s .. S("Armor durability: @1", use) + end + return s +end) + +-- TODO: Move this info to the crafting guide +doc.sub.items.register_factoid(nil, "groups", function(itemstring, def) + if def._repair_material then + local mdef = minetest.registered_items[def._repair_material] + local desc + if mdef and mdef.description and mdef.description ~= "" then + return S("This item can be repaired at an anvil with: @1.", mdef.description) + elseif def._repair_material == "group:wood" then + return S("This item can be repaired at an anvil with any wooden planks.") + elseif string.sub(def._repair_material, 1, 6) == "group:" then + local group = string.sub(def._repair_material, 7) + return S("This item can be repaired at an anvil with any item in the “@1” group.", group) + end + end + return "" +end) + +doc.sub.items.register_factoid(nil, "groups", function(itemstring, def) + if minetest.get_item_group(itemstring, "no_rename") == 1 then + return S("This item cannot be renamed at an anvil.") + else + return "" + end +end) + +doc.sub.items.register_factoid("nodes", "gravity", function(itemstring, def) + local s = "" + if minetest.get_item_group(itemstring, "crush_after_fall") == 1 then + s = s .. S("This block crushes any block it falls into.") + end + return s +end) + +doc.sub.items.register_factoid("nodes", "gravity", function(itemstring, def) + local s = "" + if minetest.get_item_group(itemstring, "crush_after_fall") == 1 then + s = s .. S("When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B = number of blocks fallen. The damage can never be more than 40 HP.") end return s end) -- Mining, hardness and all that doc.sub.items.register_factoid("nodes", "mining", function(itemstring, def) - local pickaxey = { "Diamond Pickaxe", "Iron Pickaxe", "Stone Pickaxe", "Golden Pickaxe", "Wooden Pickaxe" } - local axey = { "Diamond Axe", "Iron Axe", "Stone Axe", "Golden Axe", "Wooden Axe" } - local shovely = { "Diamond Shovel", "Iron Shovel", "Stone Shovel", "Golden Shovel", "Wooden Shovel" } + local pickaxey = { S("Diamond Pickaxe"), S("Iron Pickaxe"), S("Stone Pickaxe"), S("Golden Pickaxe"), S("Wooden Pickaxe") } + local axey = { S("Diamond Axe"), S("Iron Axe"), S("Stone Axe"), S("Golden Axe"), S("Wooden Axe") } + local shovely = { S("Diamond Shovel"), S("Iron Shovel"), S("Stone Shovel"), S("Golden Shovel"), S("Wooden Shovel") } local datastring = "" local groups = def.groups if groups then if groups.dig_immediate == 3 then - datastring = datastring .. "This block can be mined by any tool instantly." .. "\n" + datastring = datastring .. S("This block can be mined by any tool instantly.") .. "\n" else local tool_minable = false @@ -145,20 +243,20 @@ doc.sub.items.register_factoid("nodes", "mining", function(itemstring, def) tool_minable = true end if groups.shearsy or groups.shearsy_wool then - datastring = datastring .. "• Shears" .. "\n" + datastring = datastring .. S("• Shears") .. "\n" tool_minable = true end if groups.swordy or groups.swordy_cobweb then - datastring = datastring .. "• Sword" .. "\n" + datastring = datastring .. S("• Sword") .. "\n" tool_minable = true end if groups.handy then - datastring = datastring .. "• Hand" .. "\n" + datastring = datastring .. S("• Hand") .. "\n" tool_minable = true end if tool_minable then - datastring = "This block can be mined by:\n" .. datastring .. "\n" + datastring = S("This block can be mined by:") .. "\n" .. datastring .. "\n" end end end @@ -167,16 +265,17 @@ doc.sub.items.register_factoid("nodes", "mining", function(itemstring, def) hardness = 0 end if hardness == -1 then - datastring = datastring .. "Hardness: ∞" + datastring = datastring .. S("Hardness: ∞") else - datastring = datastring .. string.format("Hardness: %.2f", hardness) + datastring = datastring .. S("Hardness: @1", string.format("%.2f", hardness)) end local blast = def._mcl_blast_resistance if not blast then blast = 0 end + -- TODO: Blast resistance as number if blast >= 1000 then - datastring = datastring .. "\n" .. "This block will not be destroyed by TNT explosions." + datastring = datastring .. "\n" .. S("This block will not be destroyed by TNT explosions.") end return datastring end) @@ -184,7 +283,7 @@ end) -- Special drops when mined by shears doc.sub.items.register_factoid("nodes", "drops", function(itemstring, def) if def._mcl_shears_drop == true then - return "This block drops itself when mined by shears." + return S("This block drops itself when mined by shears.") elseif type(def._mcl_shears_drop) == "table" then local drops = {} for d=1, #def._mcl_shears_drop do @@ -199,16 +298,124 @@ doc.sub.items.register_factoid("nodes", "drops", function(itemstring, def) text = itemname end if itemcount > 1 then - text = string.format("%d×%s", itemcount, text) + text = S("@1×@2", itemcount, text) end table.insert(drops, text) end - local ret = string.format("This blocks drops the following when mined by shears: %s", table.concat(drops, ", ")) + local ret = S("This blocks drops the following when mined by shears: @1", table.concat(drops, S(", "))) return ret end return "" end) +-- Digging capabilities of tool +doc.sub.items.register_factoid("tools", "misc", function(itemstring, def) + if not def.tool_capabilities then + return "" + end + local groupcaps = def.tool_capabilities.groupcaps + if not groupcaps then + return "" + end + local formstring = "" + local capstr = "" + local caplines = 0 + for k,v in pairs(groupcaps) do + local speedstr = "" + local miningusesstr = "" + -- Mining capabilities + caplines = caplines + 1 + local maxlevel = v.maxlevel + if not maxlevel then + -- Default from tool.h + maxlevel = 1 + end + -- Digging speed + local speed_class = def.groups and def.groups.dig_speed_class + if speed_class == 1 then + speedstr = S("Painfully slow") + elseif speed_class == 2 then + speedstr = S("Very slow") + elseif speed_class == 3 then + speedstr = S("Slow") + elseif speed_class == 4 then + speedstr = S("Fast") + elseif speed_class == 5 then + speedstr = S("Very fast") + elseif speed_class == 6 then + speedstr = S("Extremely fast") + elseif speed_class == 7 then + speedstr = S("Instantaneous") + end + + -- Number of mining uses + local base_uses = v.uses + if not base_uses then + -- Default from tool.h + base_uses = 20 + end + if def._doc_items_durability == nil and base_uses > 0 then + local real_uses = base_uses * math.pow(3, maxlevel) + if real_uses < 65535 then + miningusesstr = S("@1 uses", real_uses) + else + miningusesstr = S("Unlimited uses") + end + end + + if speedstr ~= "" then + capstr = capstr .. S("Mining speed: @1", speedstr) .. "\n" + end + if miningusesstr ~= "" then + capstr = capstr .. S("Mining durability: @1", miningusesstr) .. "\n" + end + + -- Only show one group at max + break + end + if caplines > 0 then + formstring = formstring .. S("This tool is capable of mining.") .. "\n" + -- Capabilities + formstring = formstring .. capstr + -- Max. drop level + local mdl = def.tool_capabilities.max_drop_level + if not def.tool_capabilities.max_drop_level then + mdl = 0 + end + formstring = formstring .. S("Block breaking strength: @1", mdl) .. "\n" + end + if caplines > 0 then + formstring = formstring .. "\n\n" + end + return formstring +end) + +-- Melee damage +doc.sub.items.register_factoid("tools", "misc", function(itemstring, def) + local tool_capabilities = def.tool_capabilities + if not tool_capabilities then + return "" + end + + local formstring = "" + -- Weapon data + local damage_groups = tool_capabilities.damage_groups + if damage_groups ~= nil and damage_groups.fleshy ~= nil then + formstring = formstring .. S("This is a melee weapon which deals damage by punching.") .. "\n" + + -- Damage groups + local dmg = damage_groups.fleshy + formstring = formstring .. S("Maximum damage: @1 HP", dmg) .. "\n" + + -- Full punch interval + local punch = 1.0 + if tool_capabilities.full_punch_interval ~= nil then + punch = tool_capabilities.full_punch_interval + end + formstring = formstring .. S("Full punch interval: @1 s", string.format("%.1f", punch)) + formstring = formstring .. "\n" + end + return formstring +end) --- TODO: Blast resistance (omitted for now because explosions ignore hardness) diff --git a/mods/HELP/mcl_doc/locale/mcl_doc.de.tr b/mods/HELP/mcl_doc/locale/mcl_doc.de.tr new file mode 100644 index 00000000..e929f9ae --- /dev/null +++ b/mods/HELP/mcl_doc/locale/mcl_doc.de.tr @@ -0,0 +1,79 @@ +# textdomain: mcl_doc +Water can flow into this block and cause it to drop as an item.=Wasser kann in diesen Block fließen und ihn als Gegenstand fallen lassen. +This block can be turned into dirt with a hoe.=Dieser Block kann mit einer Hacke zu Erde gemacht werden. +This block can be turned into farmland with a hoe.=Dieser Block kann mit einer Hacke zu Ackerboden gemacht werden. +This block acts as a soil for all saplings.=Dieser Block eignet sich als Nährboden für alle Setzlinge. +This block acts as a soil for some saplings.=Dieser Block eignet sich als Nährboden für einige Setzlinge. +Sugar canes will grow on this block.=Zuckerrohr wird auf diesem Block wachsen. +Nether wart will grow on this block.=Netherwurz wird auf diesem Block wachsen. +This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.=Dieser Block wird rasch absterben, wenn sich kein Holzblock irgendeiner Art innerhalb einer Entfernung von @1 befindet. Beim Absterben wird er verschwinden und wirft dabei vielleicht etwas ab. Der Block wird nicht absterben, wenn er von einem Spieler platziert wurde. +This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.=Dieser Block wird schnell absterben und verschwinden, wenn sich kein Holzblock irgendeiner Art innerhalb einer Entfernung von @1 befindet. Der Block wird nicht absterben, wenn er von einem Spieler platziert wurde. +This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Diese Pflanze kann nur auf Grasblöcken und Erde wachsen. Zum Überleben muss sie sich direkt unter dem Himmel befinden oder einer Lichtstärke von 8 oder höher ausgesetzt sein. +This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Diese Pflanze wächst auf Grasblöcken, Podsol, Erde und grobe Erde. Zum Überleben muss sie sich direkt unter dem Himmel befinden oder einer Lichtstärke von mindestens 8 ausgesetzt sein. +This block is flammable.=Dieser Block ist entzündlich. +This block destroys any item it touches.=Dieser Block zerstört jeden Gegenstand, der in ihn fällt. +To eat it, wield it, then rightclick.=Um dies zu essen, halten Sie es in der Hand und rechtsklicken Sie. +You can eat this even when your hunger bar is full.=Sie können dies essen, auch wenn Ihre Hungerleiste voll ist. +You cannot eat this when your hunger bar is full.=Sie können dies nicht essen, wenn Ihre Hungerleiste voll ist. +To drink it, wield it, then rightclick.=Um dies zu trinken, halten Sie es, dann rechtklicken Sie. +You cannot drink this when your hunger bar is full.=Sie können dies nicht trinken, wenn Ihre Hungerleiste voll ist. +To consume it, wield it, then rightclick.=Um dies zu konsumieren, halten Sie es, dann rechtsklicken Sie. +You cannot consume this when your hunger bar is full.=Sie können dies nicht konsumieren, wenn Ihre Hungerleiste voll ist. +You have to wait for about 2 seconds before you can eat or drink again.=Sie müssen für etwa 2 Sekunden warten, bevor Sie erneut essen oder trinken können. +Hunger points restored: @1=Erhaltene Hungerpunkte: @1 +Saturation points restored: @1%.1f=Erhaltene Sättigungspunkte: @1 +This item can be repaired at an anvil with: @1.=Dieser Gegenstand kann an einem Amboss repariert werden mit: @1 +This item can be repaired at an anvil with any wooden planks.=Dieser Gegenstand kann an einem Amboss mit beliebigen Holzplanken repariert werden. +This item can be repaired at an anvil with any item in the “@1” group.=Dieser Gegenstand kann an einem Amboss in der „@1“-Gruppe repariert werden. +This item cannot be renamed at an anvil.=Dieser Gegenstand kann an einem Amboss nicht umbenannt werden. +This block crushes any block it falls into.=Dieser Block zertrümmert jeden Block, in den er hereinfällt. +When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B @= number of blocks fallen. The damage can never be more than 40 HP.=Wenn dieser Block um mehr als 1 Block tief fällt, richtet er für jeden Spieler, den er trifft, Schaden an. Der Schaden ist B×2-2 Trefferpunkte, wobei B = die Anahl der gefallenen Blöcke. Der Schaden ist nie größer als 40 TP. +Diamond Pickaxe=Diamantspitzhacke +Iron Pickaxe=Eisenspitzhacke +Stone Pickaxe=Steinspitzhacke +Golden Pickaxe=Goldspitzhacke +Wooden Pickaxe=Holzspitzhacke +Diamond Axe=Diamantaxt +Iron Axe=Eisenaxt +Stone Axe=Steinaxt +Golden Axe=Goldaxt +Wooden Axe=Holzaxt +Diamond Shovel=Diamantschaufel +Iron Shovel=Eisenschaufel +Stone Shovel=Steinschaufel +Golden Shovel=Goldschaufel +Wooden Shovel=Holzschaufel +This block can be mined by any tool instantly.=Dieser Block kann mit jedem Werkzeug sofort abgebaut werden. +This block can be mined by:=Dieser Block kann abgebaut werden mit: +Hardness: ∞=Härte: ∞ +Hardness: @1=Härte: @1 +This block will not be destroyed by TNT explosions.=Dieser Block wird von TNT-Explosionen nicht zerstört. +This block drops itself when mined by shears.=Dieser Block wirft sich selbst ab, wenn er mit einer Schere abgebaut wird. +@1×@2=@1×@2 +This blocks drops the following when mined by shears: @1=Dieser Block wird folgendes abwerfen, wenn er mit einer Schere abgebaut wird: @ +, =, +• Shears=• Schere +• Sword=• Schwert +• Hand=• Hand +This is a melee weapon which deals damage by punching.=Dies ist eine Nahkampfwaffe, die Schaden durch Schläge verursacht. +Maximum damage: @1 HP=Maximalschaden: @1 HP +Full punch interval: @1 s=Ausholintervall: @1 s +This tool is capable of mining.=Dieses Werkzeug kann Blöcke abbauen. +Mining speed: @1=Grabegeschwindigkeit: @1 +Painfully slow=Furchtbar langsam +Very slow=Sehr langsam +Slow=Langsam +Fast=Schnell +Very fast=Sehr schnell +Extremely fast=Extrem schnell +Instantaneous=Unmittelbar +@1 uses=@1 Verwendungen +Unlimited uses=Unbegrenzte Verwendungen +Block breaking strength: @1=Blockbruchstärke: @1 +Mining durability: @1=Grabehaltbarkeit: @1 +Armor points: @1=Rüstungspunkte: @1 +Armor durability: @1=Rüstungshaltbarkeit: @1 +It can be worn on the head.=Es kann auf dem Kopf getragen werden. +It can be worn on the torso.=Es kann am Torso getragen werden. +It can be worn on the legs.=Es kann an den Beinen getragen werden. +It can be worn on the feet.=Es kann an den Füßen getragen werden. diff --git a/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr b/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr new file mode 100644 index 00000000..90e0c9b0 --- /dev/null +++ b/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr @@ -0,0 +1,79 @@ +# textdomain: mcl_doc +Water can flow into this block and cause it to drop as an item.=L'eau peut s'écouler dans ce bloc et provoquer sa chute en tant qu'élément. +This block can be turned into dirt with a hoe.=Ce bloc peut être transformé en terre avec une houe. +This block can be turned into farmland with a hoe.=Ce bloc peut être transformé en terres agricoles avec une houe. +This block acts as a soil for all saplings.=Ce bloc agit comme un sol pour tous les pousses arbres. +This block acts as a soil for some saplings.=Ce bloc agit comme un sol pour certains pousses arbres. +Sugar canes will grow on this block.=Les cannes à sucre pousseront sur ce bloc. +Nether wart will grow on this block.=La verrue du Néant se développera sur ce bloc. +This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.=Ce bloc se désintègre rapidement lorsqu'il n'y a aucun bloc de bois de n'importe quel espèce à une distance de @1. En décomposition, il disparaît et peut lâcher un des ses objets habituels. Le bloc ne se désintègre pas lorsque le bloc a été placé par un joueur. +This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.=Ce bloc se désintègre rapidement et disparaît lorsqu'il n'y a aucun bloc de bois de n'importe quel espèce à une distance de @1. Le bloc ne se désintègre pas lorsque le bloc a été placé par un joueur. +This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Cette plante ne peut pousser que sur des blocs d'herbe et de terre. Pour survivre, il doit avoir une vue dégagée sur le ciel au-dessus ou être exposé à un niveau de lumière de 8 ou plus. +This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Cette plante peut pousser sur des blocs d'herbe, du podzol, de la terre et de la terre grossière. Pour survivre, il doit avoir une vue dégagée sur le ciel au-dessus ou être exposé à un niveau de lumière de 8 ou plus. +This block is flammable.=Ce bloc est inflammable. +This block destroys any item it touches.=Ce bloc détruit tout élément qu'il touche. +To eat it, wield it, then rightclick.=Pour le manger, maniez-le, puis faites un clic droit. +You can eat this even when your hunger bar is full.=Vous pouvez le manger même lorsque votre barre de faim est pleine. +You cannot eat this when your hunger bar is full.=Vous ne pouvez pas manger cela lorsque votre barre de faim est pleine. +To drink it, wield it, then rightclick.=Pour le boire, maniez-le, puis faites un clic droit. +You cannot drink this when your hunger bar is full.=Vous ne pouvez pas boire cela lorsque votre barre de faim est pleine. +To consume it, wield it, then rightclick.=Pour le consommer, maniez-le, puis faites un clic droit. +You cannot consume this when your hunger bar is full.=Vous ne pouvez pas consommer cela lorsque votre barre de faim est pleine. +You have to wait for about 2 seconds before you can eat or drink again.=Vous devez attendre environ 2 secondes avant de pouvoir à nouveau manger ou boire. +Hunger points restored: @1=Points de faim restaurés: @1 +Saturation points restored: @1%.1f=Points de saturation restaurés: @1%.1f +This item can be repaired at an anvil with: @1.=Cet article peut être réparé sur une enclume avec: @1. +This item can be repaired at an anvil with any wooden planks.=Cet article peut être réparé sur une enclume avec n'importe quelle planche de bois. +This item can be repaired at an anvil with any item in the “@1” group.=Cet article peut être réparé sur une enclume avec n'importe quel article du groupe “@1”. +This item cannot be renamed at an anvil.=Cet objet ne peut pas être renommé sur une enclume. +This block crushes any block it falls into.=Ce bloc écrase tout bloc dans lequel il tombe. +When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B @= number of blocks fallen. The damage can never be more than 40 HP.=Lorsque ce bloc tombe plus profondément que 1 bloc, il inflige des dégâts à tout joueur qu'il frappe. Les dégâts infligés sont B×2−2 points de vie avec B @= nombre de blocs tombés. Les dégâts ne peuvent jamais dépasser 40 PV. +Diamond Pickaxe=Pioche en Diamant +Iron Pickaxe=Pioche en Fer +Stone Pickaxe=Pioche en Pierre +Golden Pickaxe=Pioche en Or +Wooden Pickaxe=Pioche en Bois +Diamond Axe=Hache en Diamant +Iron Axe=Hache en Fer +Stone Axe=Hache en Pierre +Golden Axe=Hache en Or +Wooden Axe=Hache en Bois +Diamond Shovel=Pelle en Diamant +Iron Shovel=Pelle en Fer +Stone Shovel=Pelle en Pierre +Golden Shovel=Pelle en Or +Wooden Shovel=Pelle de Bois +This block can be mined by any tool instantly.=Ce bloc peut être miné par n'importe quel outil instantanément. +This block can be mined by:=Ce bloc peut être miné par: +Hardness: ∞=Dureté: ∞ +Hardness: @1=Dureté: @1 +This block will not be destroyed by TNT explosions.=Ce bloc ne sera pas détruit par les explosions de TNT. +This block drops itself when mined by shears.=Ce bloc se laisse tomber lorsqu'il est exploité par cisaille. +@1×@2=@1×@2 +This blocks drops the following when mined by shears: @1=Ce bloc laisse tomber les choses suivantes lorsqu'il est exploité par cisaille: +, =, +• Shears=• Cisailles +• Sword=• Epées +• Hand=• Mains +This is a melee weapon which deals damage by punching.=Il s'agit d'une arme de mêlée qui inflige des dégâts en frappant. +Maximum damage: @1 HP=Dégâts maximum: @1 +Full punch interval: @1 s=Interval de coup: @1 s +This tool is capable of mining.=Cet outil est capable d'exploiter. +Mining speed: @1=Vitesse de minage: @1 +Painfully slow=Péniblement lent +Very slow=Très lent +Slow=Lent +Fast=Rapide +Very fast=Très rapide +Extremely fast=Extrêmenent rapide +Instantaneous=Instantané +@1 uses=@1 utilisations +Unlimited uses=Utilisations illimitées +Block breaking strength: @1=Résistance de rupture de bloc: @1 +Mining durability: @1=Durabilité de minage: @1 +Armor points: @1=Point d'armure: @1 +Armor durability: @1=Durabilité de l'armure: @1 +It can be worn on the head.=Il peut être porté sur la tête. +It can be worn on the torso.=Il peut être porté au torse. +It can be worn on the legs.=Il peut être porté aux jambes. +It can be worn on the feet.=Il peut être porté aux pieds. diff --git a/mods/HELP/mcl_doc/locale/template.txt b/mods/HELP/mcl_doc/locale/template.txt new file mode 100644 index 00000000..de652f05 --- /dev/null +++ b/mods/HELP/mcl_doc/locale/template.txt @@ -0,0 +1,79 @@ +# textdomain: mcl_doc +Water can flow into this block and cause it to drop as an item.= +This block can be turned into dirt with a hoe.= +This block can be turned into farmland with a hoe.= +This block acts as a soil for all saplings.= +This block acts as a soil for some saplings.= +Sugar canes will grow on this block.= +Nether wart will grow on this block.= +This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.= +This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.= +This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.= +This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.= +This block is flammable.= +This block destroys any item it touches.= +To eat it, wield it, then rightclick.= +You can eat this even when your hunger bar is full.= +You cannot eat this when your hunger bar is full.= +To drink it, wield it, then rightclick.= +You cannot drink this when your hunger bar is full.= +To consume it, wield it, then rightclick.= +You cannot consume this when your hunger bar is full.= +You have to wait for about 2 seconds before you can eat or drink again.= +Hunger points restored: @1= +Saturation points restored: @1%.1f= +This item can be repaired at an anvil with: @1.= +This item can be repaired at an anvil with any wooden planks.= +This item can be repaired at an anvil with any item in the “@1” group.= +This item cannot be renamed at an anvil.= +This block crushes any block it falls into.= +When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B @= number of blocks fallen. The damage can never be more than 40 HP.= +Diamond Pickaxe= +Iron Pickaxe= +Stone Pickaxe= +Golden Pickaxe= +Wooden Pickaxe= +Diamond Axe= +Iron Axe= +Stone Axe= +Golden Axe= +Wooden Axe= +Diamond Shovel= +Iron Shovel= +Stone Shovel= +Golden Shovel= +Wooden Shovel= +This block can be mined by any tool instantly.= +This block can be mined by:= +Hardness: ∞= +Hardness: @1= +This block will not be destroyed by TNT explosions.= +This block drops itself when mined by shears.= +@1×@2= +This blocks drops the following when mined by shears: @1= +, = +• Shears= +• Sword= +• Hand= +This is a melee weapon which deals damage by punching.= +Maximum damage: @1 HP= +Full punch interval: @1 s= +This tool is capable of mining.= +Mining speed: @1= +Painfully slow= +Very slow= +Slow= +Fast= +Very fast= +Extremely fast= +Instantaneous= +@1 uses= +Unlimited uses= +Block breaking strength: @1= +Mining durability: @1= +Armor points: @1= +Armor durability: @1= +It can be worn on the head.= +It can be worn on the torso.= +It can be worn on the legs.= +It can be worn on the feet.= diff --git a/mods/HELP/mcl_doc_basics/README.md b/mods/HELP/mcl_doc_basics/README.md index 2125bed7..13ac04e4 100644 --- a/mods/HELP/mcl_doc_basics/README.md +++ b/mods/HELP/mcl_doc_basics/README.md @@ -1,4 +1,4 @@ -# Basic help [`doc_basics`] +# Basic help, MineClone 2 edition [`mcl_doc_basics`] Adds basic help texts about Minetest, controls, gameplay and other basics. This mod uses the Documentation System [`doc`] as a basis and adds these categories: @@ -6,7 +6,5 @@ categories: * Basics: Basic gameplay information (e.g. how to craft) * Advanced usage: Advanced Minetest information (not gameplay-releavant) for power users (e.g. how to use commands) -Version: 1.0.0 - ## License Everything in this mod is licensed under the MIT License. diff --git a/mods/HELP/mcl_doc_basics/depends.txt b/mods/HELP/mcl_doc_basics/depends.txt deleted file mode 100644 index 31aa3903..00000000 --- a/mods/HELP/mcl_doc_basics/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -doc -intllib? diff --git a/mods/HELP/mcl_doc_basics/description.txt b/mods/HELP/mcl_doc_basics/description.txt deleted file mode 100644 index f86a1b59..00000000 --- a/mods/HELP/mcl_doc_basics/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds some help texts explaining how to use Minetest. diff --git a/mods/HELP/mcl_doc_basics/init.lua b/mods/HELP/mcl_doc_basics/init.lua index 59146daf..e700e82b 100644 --- a/mods/HELP/mcl_doc_basics/init.lua +++ b/mods/HELP/mcl_doc_basics/init.lua @@ -1,26 +1,24 @@ --- Boilerplate to support localized strings if intllib mod is installed. -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s) return s end -end +--[[ +Basic help for MCL2. Fork of doc_basics +]] + +local S = minetest.get_translator("mcl_doc_basics") doc.add_category("basics", { name = S("Basics"), - description = S("Everything you need to know about MineClone 2 to get started with playing"), + description = S("Everything you need to know to get started with playing"), sorting = "custom", - sorting_data = {"quick_start", "controls", "point", "items", "inventory", "hotbar", "tools", "weapons", "nodes", "mine", "build", "craft", "cook", "minimap", "cam", "sneak", "players", "liquids", "light", "groups", "glossary", "minetest"}, + sorting_data = {"quick_start", "controls", "point", "items", "inventory", "hotbar", "tools", "weapons", "nodes", "mine", "build", "craft", "cook", "hunger", "mobs", "animals", "minimap", "cam", "sneak", "players", "liquids", "light", "groups", "glossary", "minetest"}, build_formspec = doc.entry_builders.text_and_gallery, }) doc.add_category("advanced", { name = S("Advanced usage"), - description = S("Advanced information about Minetest which may be nice to know, but is not crucial to gameplay"), + description = S("Advanced information which may be nice to know, but is not crucial to gameplay"), sorting = "custom", - sorting_data = {"console", "commands", "privs", "movement_modes", "coordinates", "settings", "online"}, + sorting_data = {"creative", "console", "commands", "privs", "movement_modes", "coordinates", "settings", "online"}, build_formspec = doc.entry_builders.text_and_gallery, }) @@ -29,9 +27,9 @@ doc.add_entry("basics", "quick_start", { data = { text = S("This is a very brief introduction to the basic gameplay:").."\n\n".. -S("Basic controls:").."\n".. S("• Move mouse to look").."\n".. S("• [W], [A], [S] and [D] to move").."\n".. +S("• [E] to sprint").."\n".. S("• [Space] to jump or move upwards").."\n".. S("• [Shift] to sneak or move downwards").."\n".. S("• Mouse wheel or [1]-[9] to select item").."\n".. @@ -39,7 +37,8 @@ S("• Left-click to mine blocks or attack").."\n".. S("• Recover from swings to deal full damage").."\n".. S("• Right-click to build blocks and use things").."\n".. S("• [I] for the inventory").."\n".. -S("• Lowest row in inventory appears in hotbar below").."\n".. +S("• First items in inventory appear in hotbar below").."\n".. +S("• Read entries in this help to learn the rest").."\n".. S("• [Esc] to close this window").."\n\n".. S("How to play:").."\n".. @@ -53,7 +52,6 @@ S("• Craft a wooden pickaxe so you can dig stone").."\n".. S("• Different tools break different kinds of blocks. Try them out!").."\n".. S("• Read entries in this help to learn the rest").."\n".. S("• Continue playing as you wish. There's no goal. Have fun!") - }}) doc.add_entry("basics", "minetest", { @@ -62,15 +60,14 @@ doc.add_entry("basics", "minetest", { text = S("Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).").."\n\n".. -S("The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest (also called “subgames”) can, however, be much more complex than this.").."\n\n".. +S("The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.").."\n\n".. S("A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.").."\n\n".. S("Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.").."\n\n".. -S("Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .").."\n\n".. +S("Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums ."), -S("Minetest as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly."), images = {{image="doc_basics_gameplay_mtg_1.png"}, {image="doc_basics_gameplay_mtg_2.png"}, {image="doc_basics_gameplay_carbone_ng.png"}, {image="doc_basics_gameplay_lott.png"}, {image="doc_basics_gameplay_pixture.png"}, {image="doc_basics_gameplay_outback.png"}, {image="doc_basics_gameplay_moontest.png"}, {image="doc_basics_gameplay_hades.png"}, {image="doc_basics_gameplay_xtraores_xtension.png"},} }}) @@ -85,8 +82,6 @@ S("• Sneak: [Shift]").."\n\n".. S("Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.").."\n\n".. -S("If you jump while holding the sneak key, you also jump slightly higher than usual.").."\n\n".. - S("Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges."), images = { { image = "doc_basics_sneak.png" } }, }}) @@ -101,7 +96,8 @@ S("• Moving the mouse around: Look around").."\n".. S("• W: Move forwards").."\n".. S("• A: Move to the left").."\n".. S("• D: Move to the right").."\n".. -S("• S: Move backwards").."\n\n".. +S("• S: Move backwards").."\n".. +S("• E: Sprint").."\n\n".. S("While standing on solid ground:").."\n".. S("• Space: Jump").."\n".. @@ -118,10 +114,10 @@ S("• H: Toggle noclip mode, makes you go through walls in fly mode (requires S("• E: Walk fast in fast mode").."\n\n".. S("World interaction:").."\n".. -S("• Left mouse button: Punch / mine blocks / take items").."\n".. +S("• Left mouse button: Punch / mine blocks").."\n".. S("• Right mouse button: Build or use pointed block").."\n".. S("• Shift+Right mouse button: Build").."\n".. -S("• Roll mouse wheel: Select next/previous item in hotbar").."\n".. +S("• Roll mouse wheel / B / N: Select next/previous item in hotbar").."\n".. S("• 1-9: Select item in hotbar directly").."\n".. S("• Q: Drop item stack").."\n".. S("• Shift+Q: Drop 1 item").."\n".. @@ -131,22 +127,21 @@ S("Inventory interaction:").."\n".. S("See the entry “Basics > Inventory”.").."\n\n".. S("Camera:").."\n".. -S("• Z: Zoom (requires “zoom” privilege)").."\n".. -S("• F7: Toggle camera mode").."\n".. -S("• F8: Toggle cinematic mode").."\n\n".. +S("• Z: Zoom").."\n".. +S("• F7: Toggle camera mode").."\n\n".. S("Interface:").."\n".. S("• Esc: Open menu window (pauses in single-player mode) or close window").."\n".. S("• F1: Show/hide HUD").."\n".. S("• F2: Show/hide chat").."\n".. -S("• F9: Toggle minimap (only works if have a map)").."\n".. +S("• F9: Toggle minimap").."\n".. S("• Shift+F9: Toggle minimap rotation mode").."\n".. S("• F10: Open/close console/chat log").."\n".. S("• F12: Take a screenshot").."\n\n".. S("Server interaction:").."\n".. S("• T: Open chat window (chat requires the “shout” privilege)").."\n".. -S("• /: Start issuing a server command)").."\n\n".. +S("• /: Start issuing a server command").."\n\n".. S("Technical:").."\n".. S("• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)").."\n".. @@ -154,8 +149,7 @@ S("• +: Increase minimal viewing distance").."\n".. S("• -: Decrease minimal viewing distance").."\n".. S("• F3: Enable/disable fog").."\n".. S("• F5: Enable/disable debug screen which also shows your coordinates").."\n".. -S("• F6: Only useful for developers. Enables/disables profiler").."\n".. -S("• P: Only useful for developers. Writes current stack traces") +S("• F6: Only useful for developers. Enables/disables profiler") }}) doc.add_entry("basics", "players", { @@ -164,17 +158,19 @@ doc.add_entry("basics", "players", { text = S("Players (actually: “player characters”) are the characters which users control.").."\n\n".. -S("Players are living beings which occupy a space of about 1×2×1 cubes. They start with 20 health points (HP) and 10 breath points (BP).").."\n".. +S("Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).").."\n".. S("Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.").."\n".. -S("Players can take damage for a variety of reasons, here are some:\ -• Taking fall damage\ -• Touching a block which causes direct damage\ -• Drowning\ -• Being attacked by another player\ -• Being attacked by a computer enemy").."\n\n".. +S("Players can take damage for a variety of reasons, here are some:").."\n\n".. -S("At a health of 0, the player dies and loses all items in the inventory. The player can just respawn in the world.").."\n".. +S("• Taking fall damage").."\n".. +S("• Touching a block which causes direct damage").."\n".. +S("• Drowning").."\n".. +S("• Being attacked by another player").."\n".. +S("• Being attacked by a computer enemy").."\n\n".. + +S("At a health of 0, the player dies. The player can just respawn in the world.").."\n".. +S("Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.").."\n\n".. S("Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.").."\n\n".. @@ -192,14 +188,14 @@ S("Items are things you can carry along and store in inventories. They can be us S("An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.").."\n\n".. -S("Items have several properties, including the following:\ -\ -• Maximum stack size: Number of items which fit on 1 item stack\ -• Pointing range: How close things must be to be pointed while wielding this item\ -• Group memberships: See “Basics > Groups”\ -• May be used for crafting or cooking").."\n\n".. +S("Items have several properties, including the following:").."\n\n".. -S("Dropped item stacks will be collected automatically when you stand close to them."), +S("• Maximum stack size: Number of items which fit on 1 item stack").."\n".. +S("• Pointing range: How close things must be to be pointed while wielding this item").."\n".. +S("• Group memberships: See “Basics > Groups”").."\n".. +S("• May be used for crafting or cooking"), + +-- MCL2: Items cannot be taken by punching images = {{image="doc_basics_inventory_detail.png"}, {image="doc_basics_items_dropped.png"}}, }}) @@ -208,9 +204,9 @@ doc.add_entry("basics", "tools", { data = { text = S("Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.").."\n\n".. -S("Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.").."\n\n".. +S("A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.").."\n\n".. -S("When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.").."\n\n".. +S("When nothing is wielded, players use their hand which may act as tool and weapon.").."\n\n".. S("Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”."), images = {{image="doc_basics_tools.png"}, {image="doc_basics_tools_mining.png"}}, @@ -226,7 +222,7 @@ S("• Single punch: Left-click once to deal a single punch").."\n".. S("• Quick punching: Hold down the left mouse button to deal quick repeated punches").."\n\n".. S("There are two core attributes of melee weapons:").."\n".. -S("• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered)").."\n".. +S("• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered").."\n".. S("• Full punch interval: Time it takes for fully recovering from a punch").."\n\n".. S("A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.").."\n\n".. @@ -239,7 +235,7 @@ doc.add_entry("basics", "point", { name = S("Pointing"), data = { text = -S("“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.").."\n\n".. +S("“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.").."\n\n".. S("To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.").."\n\n".. @@ -251,18 +247,17 @@ doc.add_entry("basics", "cam", { name = S("Camera"), data = { text = -S("Minetest has 3 different views which determine the way you see the world. The modes are:\ -\ -• 1: First-person view (default)\ -• 2: Third-person view from behind\ -• 3: Third-person view from the front").."\n\n".. +S("There are 3 different views which determine the way you see the world. The modes are:").."\n\n".. + +S("• 1: First-person view (default)").."\n".. +S("• 2: Third-person view from behind").."\n".. +S("• 3: Third-person view from the front").."\n\n".. S("You can change the camera mode by pressing [F7].").."\n".. -S("There is also Cinematic Mode which can be toggled with [F8]. With Cinematic Mode enabled, the camera movements become more smooth. Some players don't like it, it is a matter of taste.").."\n".. -S("By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.").."\n\n".. +S("You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.").."\n".. +S("Zooming is a gameplay feature that might be enabled or disabled by the game. By default, zooming is enabled when in Creative Mode but disabled otherwise.").."\n\n".. S("• Switch camera mode: [F7]").."\n".. -S("• Toggle Cinematic Mode: [F8]").."\n".. S("• Zoom: [Z]"), images = {{image="doc_basics_camera_ego.png"}, {image="doc_basics_camera_behind.png"}, {image="doc_basics_camera_front.png"}} }}) @@ -271,7 +266,7 @@ doc.add_entry("basics", "nodes", { name = S("Blocks"), data = { text = -S("The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.").."\n\n".. +S("The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.").."\n\n".. S("Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:").."\n\n".. @@ -285,11 +280,11 @@ S("• Group memberships: Group memberships are used to determine mining propert images = {{image="doc_basics_nodes.png"}} }}) --- TODO: Oh jeez, this explanation is WAY too difficult. Maybe we need to find some way to make it easier to understand. doc.add_entry("basics", "mine", { name = S("Mining"), data = { text = +-- Text changed for MCL2 S("Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.").."\n\n".. S("Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.") .. "\n\n".. @@ -299,7 +294,6 @@ S("• Always drops itself (the usual case)").."\n".. S("• Always drops the same items").."\n".. S("• Drops items based on probability").."\n".. S("• Drops nothing"), - images = {{image="doc_basics_tools_mining.png"}}, }}) doc.add_entry("basics", "build", { @@ -325,19 +319,19 @@ doc.add_entry("basics", "liquids", { S("Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.").."\n\n".. S("Liquids usually come in two forms: In source form (S) and in flowing form (F).").."\n".. -S("Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. A long it is left alone, a liquid source will normally keep its place and does not drain out.").."\n".. +S("Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.").."\n".. S("Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.").."\n".. S("All liquids share the following properties:").."\n".. -S("• All properties of blocks (including drowning damage").."\n".. +S("• All properties of blocks (including drowning damage)").."\n".. S("• Renewability: Renewable liquids can create new sources").."\n".. S("• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2").."\n".. S("• Viscosity: How slow players move through it and how slow the liquid spreads").."\n\n".. -S("Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:\ -• Two renewable liquid blocks of the same type touch each other diagonally\ -• These blocks are also on the same height\ -• One of the two “corners” is open space which allows liquids to flow in").."\n\n".. +S("Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:").."\n".. +S("• Two renewable liquid blocks of the same type touch each other diagonally").."\n".. +S("• These blocks are also on the same height").."\n".. +S("• One of the two “corners” is open space which allows liquids to flow in").."\n\n".. S("When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).").."\n\n".. @@ -375,16 +369,17 @@ S("To craft something, you need one or more items, a crafting grid (C) and a cra S("To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.").."\n\n".. -S("A description on how to craft an item is called a “crafting recipe”. These crafting recipes can be found in the crafting guide which you can access from the inventory menu.").."\n\n".. +S("A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).").."\n\n".. S("Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.").."\n\n".. -S("There are multiple types of crafting recipes:\ -\ -• Shaped (image 2): Items need to be placed in a particular shape\ -• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)\ -• Cooking: Explained in “Basics > Cooking”\ -• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%.").."\n\n".. +S("There are multiple types of crafting recipes:").."\n\n".. + +S("• Shaped (image 2): Items need to be placed in a particular shape").."\n".. +S("• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)").."\n".. +S("• Cooking: Explained in “Basics > Cooking”").."\n".. +-- MCL2 change: call out specific repair percentage +S("• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%").."\n\n".. S("In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.").."\n\n".. @@ -400,7 +395,7 @@ doc.add_entry("basics", "cook", { name = S("Cooking"), data = { text = -S("Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a furnace, an cookable item, a fuel item and time in order to yield a new item.").."\n\n".. +S("Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.").."\n\n".. S("Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.").."\n\n".. @@ -411,12 +406,12 @@ doc.add_entry("basics", "hotbar", { name = S("Hotbar"), data = { text = -S("At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the lowest row of items in the player inventory.").."\n".. -S("You can change the selected item with the mouse wheel or the number keys.").."\n\n".. +S("At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.").."\n".. +S("You can change the selected item with the mouse wheel or the keyboard.").."\n\n".. -S("• Select previous item in hotbar: [Mouse wheel up]").."\n".. -S("• Select next item in hotbar: [Mouse wheel down]").."\n".. -S("• Select item in hotbar directly: [0]-[9]").."\n\n".. +S("• Select previous item in hotbar: [Mouse wheel up] or [B]").."\n".. +S("• Select next item in hotbar: [Mouse wheel down] or [N]").."\n".. +S("• Select item in hotbar directly: [1]-[9]").."\n\n".. S("The selected item is also your wielded item."), images = {{image="doc_basics_hotbar.png"}, {image="doc_basics_hotbar_relations.png"}}, @@ -438,7 +433,7 @@ S("Radar mode (image 2) is more complicated. It displays the “denseness” of S("There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.").."\n\n".. -S("In some subgames, the minimap may be disabled.").."\n\n".. +S("In some games, the minimap may be disabled.").."\n\n".. S("• Toggle minimap mode: [F9]").."\n".. S("• Toggle minimap rotation mode: [Shift]+[F9]"), @@ -446,7 +441,7 @@ S("• Toggle minimap rotation mode: [Shift]+[F9]"), }}) doc.add_entry("basics", "inventory", { - name="Inventory", + name=S("Inventory"), data = { text = S("Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.").."\n".. @@ -458,11 +453,12 @@ S("Inventory controls:").."\n\n".. S("Taking: You can take items from an occupied slot if the cursor holds nothing.").."\n".. S("• Left click: take entire item stack").."\n".. S("• Right click: take half from the item stack (rounded up)").."\n".. -S("• Middle click: take 10 items from the item stack").."\n\n".. +S("• Middle click: take 10 items from the item stack").."\n".. +S("• Mouse wheel down: take 1 item from the item stack").."\n\n".. S("Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.").."\n".. S("• Left click: put entire item stack").."\n".. -S("• Right click: put 1 item of the item stack").."\n".. +S("• Right click or mouse wheel up: put 1 item of the item stack").."\n".. S("• Middle click: put 10 items of the item stack").."\n\n".. S("Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.").."\n".. @@ -478,24 +474,16 @@ S("• Sneak+Left click: Automatically transfer item stack"), doc.add_entry("advanced", "online", { name = S("Online help"), data = { text= -S("You may want to check out these online resources related to MineClone 2.").."\n\n".. +S("You may want to check out these online resources related to Minetest:").."\n\n".. -S("MineClone 2 download and forum discussion: ").."\n".. -S("Here you find the most recent version of MineClone 2 and can discuss it.").."\n\n".. +S("Official homepage of Minetest: ").."\n".. +S("The main place to find the most recent version of Minetest.").."\n\n".. -S("Bug tracker: ").."\n".. -S("Report bugs here.").."\n\n\n\n".. +S("Community wiki: ").."\n".. +S("A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.").."\n\n".. -S("Minetest links:").."\n".. - -S("Official homepage of Minetest: ").."\n".. -S("The main place to find the most recent version of Minetest, the engine used by MineClone 2.").."\n\n".. - -S("Community wiki: ").."\n".. -S("A community-based documentation website for Minetest. Anyone with an account can edit it.").."\n\n".. - -S("Minetest forums: ").."\n".. -S("A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and subgames are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.").."\n\n".. +S("Web forums: ").."\n".. +S("A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.").."\n\n".. S("Chat: ").."\n".. S("A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.") @@ -552,7 +540,7 @@ S("• Craftitem: An item which is (primarily or only) used for crafting").."\n\ S("Gameplay:").."\n".. S("• “heart”: A single health symbol, indicates 2 HP").."\n".. S("• “bubble”: A single breath symbol, indicates 1 BP").."\n".. -S("• HP: Hit point (equals a half “heart”)").."\n".. +S("• HP: Hit point (equals half 1 “heart”)").."\n".. S("• BP: Breath point, indicates breath when diving").."\n".. S("• Mob: Computer-controlled enemy").."\n".. S("• Crafting: Combining multiple items to create new ones").."\n".. @@ -575,10 +563,9 @@ S("• Protection: Mechanism to own areas of the world, which only allows the ow S("Technical terms:").."\n".. S("• Minetest: This game engine").."\n".. -S("• MineClone 2: What you play right now").."\n".. -S("• Minetest Game: A subgame for Minetest by the Minetest developers").."\n".. -S("• Subgame: A complete playing experience to be used in Minetest; such as a game or sandbox or similar").."\n".. -S("• Mod: A single subsystem which adds or modifies functionality; is the basic building block of subgames and can be used to further enhance or modify them").."\n".. +S("• Minetest Game: A game for Minetest by the Minetest developers").."\n".. +S("• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar").."\n".. +S("• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them").."\n".. S("• Privilege: Allows a player to do something").."\n".. S("• Node: Other word for “block”") }}) @@ -592,16 +579,21 @@ S("There is a large variety of settings to configure Minetest. Pretty much every S("These are a few of the most important gameplay settings:").."\n\n".. S("• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal").."\n".. -S("• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. Changes include: Instant digging, easy access to almost all items, tools never wear off, etc.").."\n".. +S("• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the game; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.").."\n".. S("• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other").."\n\n".. -S("For a full list of all available settings, use the “Advanced settings” dialog in the main menu.") +S("For a full list of all available settings, use the “All Settings” dialog in the main menu.") }}) doc.add_entry("advanced", "movement_modes", { name = S("Movement modes"), data = { text = -S("If you have the required privileges, you can use up to three special movement modes. Using these may be considered cheating.").."\n\n".. +S("You can enable some special movement modes that change how you move.").."\n\n".. + +S("Pitch movement mode:").."\n".. +S("• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.").."\n".. +S("• Default key: [L]").."\n".. +S("• No privilege required").."\n\n".. S("Fast mode:").."\n".. S("• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.").."\n".. @@ -710,7 +702,7 @@ S("Players with the “privs” privilege can modify privileges at will:").."\n\ S("• /grant : Grant to ").."\n".. S("• /revoke : Revoke from ").."\n\n".. -S("In single-player mode, you can use “/grant singleplayer all” to unlock all abilities (which is often considered cheating).") +S("In single-player mode, you can use “/grantme all” to unlock all abilities.") }}) doc.add_entry("basics", "light", { @@ -721,7 +713,7 @@ S("As the world is entirely block-based, so is the light in the world. Each bloc S("There are two types of light: Sunlight and artificial light.").."\n\n".. S("Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.").."\n".. -S("Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. blocks. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.").."\n\n".. +S("Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.").."\n\n".. S("Blocks have 3 levels of transparency:").."\n\n".. @@ -755,5 +747,7 @@ S("• Follow the sun, then go right: Z increases").."\n".. S("• Follow the sun, then go left: Z decreases").."\n".. S("• The side length of a full cube is 1").."\n\n".. -S("You can view your current position in the debug screen (open with [F5]). This is considered cheating in some games.") +S("You can view your current position in the debug screen (open with [F5]).") }}) + +dofile(minetest.get_modpath(minetest.get_current_modname()).."/mcl_extension.lua") diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr new file mode 100644 index 00000000..236d5a6b --- /dev/null +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr @@ -0,0 +1,511 @@ +# textdomain: mcl_doc_basics +Basics=Grundlagen +Everything you need to know to get started with playing=Alles, was Sie zum Spielen wissen sollten +Advanced usage=Fortgeschrittenes +Advanced information which may be nice to know, but is not crucial to gameplay=Fortgeschrittene Informationen, die nett zu wissen sind, aber nicht kritisch für das reguläre Spiel +Quick start=Schnellstart +This is a very brief introduction to the basic gameplay:=Hier ist eine sehr kurze Einführung ins Spiel: +• Move mouse to look=• Mausbewegung zum Umsehen +• [W], [A], [S] and [D] to move=• [W], [A], [S] und [D] zum Bewegen +• [E] to sprint=• [E] zum Sprinten +• [Space] to jump or move upwards=• [Leertaste] zum Springen oder für Aufwärtsbewegung +• [Shift] to sneak or move downwards=• [Umschalt] zum Schleichen oder für Abwärtsbewegung +• Mouse wheel or [1]-[9] to select item=• Mausrad oder [1]-[9], um Gegenstand zu wählen +• Left-click to mine blocks or attack=• Linksklick, um Blöcke abzubauen oder anzugreifen +• Recover from swings to deal full damage=• Warten Sie Schwünge ganz ab, um vollen Schaden anzurichten +• Right-click to build blocks and use things=• Rechtsklick, um Blöcke zu bauen und Dinge zu benutzen +• [I] for the inventory=• [I] für das Inventar +• First items in inventory appear in hotbar below=• Die ersten Gegenstände im Inventar tauchen in der Schnellleiste unten auf +• [F9] for the minimap=• [F9] für die Übersichtskarte +• Put items into crafting grid (usually 3×3 grid) to craft=• Legen Sie Gegenstände ins Fertigungsgitter (normalerweise 3×3-Gitter) zum Fertigen +• Use a crafting guide mod to learn crafting recipes or visit =• Benutzen Sie eine Mod mit Fertigungsführer, um die Fertigungsrezepte zu erlernen oder besuchen Sie +• Read entries in this help to learn the rest=• Lesen Sie Einträge in dieser Hilfe, um den Rest zu lernen +• [Esc] to close this window=• [Esc], um dieses Fenster zu schließen +How to play:=Spielanleitung +• Punch a tree trunk until it breaks and collect wood=• Hauen Sie einen Baumstamm, bis er bricht und sammeln Sie Holz auf +• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Platzieren Sie das Holz in das 2×2-Gitter (Ihr „Fertigungsgitter) in Ihrem Inventar und fertigen Sie 4 Holzplanken +• Place them in a 2×2 shape in the crafting grid to craft a crafting table=• Platzieren Sie sie in eine 2×2-Form im Fertigungsgitter, um eine Werkbank zu errichten +• Place the crafting table on the ground=• Platzieren Sie die Werkbank auf den Boden +• Rightclick it for a 3×3 crafting grid=• Rechtsklicken Sie sie für ein 3×3-Fertigungsgitter +• Use the crafting guide (book icon) to learn all the possible crafting recipes=• Benutzen Sie den Fertigungsführer (Buchsymbol), um die möglichen Fertigungsrezepte zu lernen +• Craft a wooden pickaxe so you can dig stone=• Fertigen Sie eine Holzspitzhacke, damit Sie Stein graben können +• Different tools break different kinds of blocks. Try them out!=• Verschiedene Werkzeuge können verschiedene Blöcke brechen. Probieren Sie einfach! +• Read entries in this help to learn the rest=• Lesen Sie Einträge in dieser Hilfe, um den Rest zu lernen +• Continue playing as you wish. There's no goal. Have fun!=• Spielen Sie weiter, so wie sie wollen. Es gibt kein Ziel. Viel Spaß! +Minetest=Minetest +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Minetest ist eine freie Spiel-Engine für Spiele auf Voxelbasis, inspiriert von InfiniMiner, Minecraft, und so weiter. Minetest wurde ursprünglich erfunden von Perttu Ahola (alias „celeron55“). +The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.=Der Spieler wird in eine große Welt aus Würfeln bzw. Blöcken geworfen. Aus diesen Würfeln besteht die Landschaft; sie können aufgesammelt und wieder platziert werden. Mit den aufgesammelten Gegenständen können neue Werkzeuge und andere Dinge gefertigt werden. Spiele in Minetest können aber viel komplexer sein. +A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Ein Hauptfeature in Minetest ist die eingebaute Modding-Funktionalität. Mods ändern das bestehende Spielgeschehen ab. Sie können recht einfach sein und einfach nur ein paar dekorative Blöcke hinzufügen oder sie können sehr komplex sein, indem sie z.B. völlig neue Spielkonzepte einführen, eine ganz andere Art Welt erschaffen, und viele andere Dinge. +Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=Minetest kann alleine oder online mit mehreren Spielern gespielt werden. Das Onlinespiel funktioniert mit beliebigen Mods, es muss keine Zusatzsoftware installiert werden, da die Mods komplett vom Server zur Verfügung gestellt werden. +Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Minetest wird normalerweise mit einem einfachen Standardspiel ausgeliefert, es heißt „Minetest Game“ (siehe Bilder 1 und 2). Sie haben es vielleicht schon. Andere Spiele für Minetest können von den offiziellen Minetest-Foren heruntergeladen werden. +Sneaking=Schleichen +Sneaking makes you walk slower and prevents you from falling off the edge of a block.=Schleichen verlangsamt Ihre Schritte und hindert Sie daran, vom Rand eines Blocks zu fallen. +To sneak, hold down the sneak key (default: [Shift]). When you release it, you stop sneaking. Careful: When you release the sneak key at a ledge, you might fall!=Zum Schleichen halten Sie die Schleichtaste (Standard: [Umschalt]) gedrückt. Lassen Sie sie los, um nicht mehr zu schleichen. Vorsicht: Wenn sie die Taste an einer Kante loslassen, könnten sie stürzen! +• Sneak: [Shift]=• Schleichen [Umschalt] +Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.=Schleichen funktioniert nur, wenn Sie auf festem Boden stehen, sich nicht in einer Flüssigkeit befinden und nicht klettern. +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.=Schleichen kann von Mods deaktiviert werden. In diesem Fall gehen Sie immer noch langsamer, aber Sie werden an Kanten nicht mehr anhalten. +Controls=Steuerung +These are the default controls:=Dies ist die Standardsteuerung: +Basic movement:=Bewegen: +• Moving the mouse around: Look around=• Mausbewegung: Umsehen +• W: Move forwards=• W: Vorwärts +• A: Move to the left=• A: Links +• D: Move to the right=• D: Rechts +• S: Move backwards=• S: Rückwärts +• E: Sprint=• E: Sprint +While standing on solid ground:=Auf festem Boden: +• Space: Jump=• Leertaste: Springen +• Shift: Sneak=• Umschalt: Schleichen +While on a ladder, swimming in a liquid or fly mode is active=An einer Leiter, beim Tauchen oder im Flugmodus: +• Space: Move up=• Leertaste: Hoch +• Shift: Move down=• Umschalt: Runter +Extended movement (requires privileges):=Erweiterte Bewegung (benötigt Privilegien): +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)=• J: Schnellmodus, damit laufen oder fliegen Sie schneller (benötigt das „fast“-Privileg) +• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)=• K: Flugmodus, damit fliegen Sie frei in alle Richtungen (benötigt das „fly“-Privileg) +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)=• H: Geistmodus, damit fliegen durch Wände im Flugmodus (benötigt das „noclip“-Privileg) +• E: Walk fast in fast mode=• E: Schnell im Schnellmodus gehen +World interaction:=Weltinteraktion: +• Left mouse button: Punch / mine blocks=• Linke Maustaste: Schlagen / Blöcke abbauen +• Right mouse button: Build or use pointed block=• Rechte Maustaste: Bauen oder gezeigten Block benutzen +• Shift+Right mouse button: Build=• Umschalt+Rechte Maustaste: Bauen +• Roll mouse wheel / B / N: Select next/previous item in hotbar=• Mausrad drehen / B / N: Nächten/vorherigen Gegenstand in Schnellleiste wählen +• 0-9: Select item in hotbar directly=• 0-9: Gegenstand in Schnellleiste direkt wählen +• Q: Drop item stack=• Q: Gegenstandsstapel wegwerfen +• Shift+Q: Drop 1 item=• Umschalt+Q: 1 Gegenstand wegwerfen +• I: Show/hide inventory menu=• I: Inventarmenü zeigen/verbergen +Inventory interaction:=Inventarinteraktion: +See the entry “Basics > Inventory”.=Siehe Eintrag „Grundlagen > Inventar“. +Camera:=Kamera: +• Z: Zoom=• Z: Zoom +• F7: Toggle camera mode=• F7: Kameramodus wechseln +• F8: Toggle cinematic mode=• F8: Kinomodus umschalten +Interface:=Benutzeroberfläche: +• Esc: Open menu window (pauses in single-player mode) or close window=• Esc: Menüfenster öffnen (pausiert im Einzelspielermodus) oder Fenster schließen +• F1: Show/hide HUD=• F1: Oberfläche zeigen/verbergen +• F2: Show/hide chat=• F2: Chat zeigen/verbergen +• F9: Toggle minimap=• F9: Übersichtskarte umschalten +• Shift+F9: Toggle minimap rotation mode=• Umschalt+F9: Rotationsmodus der Übersichtskarte wechseln +• F10: Open/close console/chat log=• F10: Konsole/Chatprotokoll öffnen/schließen +• F12: Take a screenshot=• Bildschirmfoto machen +Server interaction:=Serverinteraktion: +• T: Open chat window (chat requires the “shout” privilege)=• T: Chatfenster öffnen (Chat benötigt das „shout“-Privileg) +• /: Start issuing a server command=• Einen Serverbefehl eingeben +Technical:=Technisches: +• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)=• Weite Sicht (deaktiviert Nebel und erlaubt sehr weite Sicht, kann das Spiel enorm verlangsamen) +• +: Increase minimal viewing distance=• +: Minimale Sichtweite erhöhen +• -: Decrease minimal viewing distance=• -: Minimale Sichtweite verringern +• F3: Enable/disable fog=• F3: Nebel umschalten +• F5: Enable/disable debug screen which also shows your coordinates=• F5: Debug-Anzeige umschalten, was auch Ihre Koordinaten anzeigt +• F6: Only useful for developers. Enables/disables profiler=• F6: Nur nützlich für Entwickler. Schaltet die Profiler-Anzeige um +Players=Spieler +Players (actually: “player characters”) are the characters which users control.=Spieler (genauer: „Spielerfiguren“) sind die Figuren, die die Benutzer steuern. +Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).=Spieler sind Lebewesen. Sie starten mit ein paar Trefferpunkten (TP) und ein paar Atempunkten (AP). +Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.=Spieler können gehen, schleichen, springen, klettern, tauchen, graben, bauen, kämpfen und Werkzeuge und Blöcke benutzen. +At a health of 0, the player dies. The player can just respawn in the world.=Fällt die Gesundheit auf 0, stirbt der Spieler. Der Spieler kann in der Welt einfach wieder einsteigen. +Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.=Andere Konsequenzen des Todes hängen vom Spiel ab. Der Spieler könnte seinen Besitz verlieren oder eine Runde in einem Wettbewerb verlieren. +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.=Einige Blöcke reduzieren den Atem. In einem Block, der den Atem reduziert, werden die Atempunkte um 1 alle 2 Sekunden reduziert. Wenn der Atem verbraucht ist, erleidet der Spieler Schaden durch Ertrinken. Der Atem wird in jedem anderen Block rasch wiederhergestellt. +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.=Schaden kann in jeder Welt ausgeschaltet werden. Ohne Schaden sind Spieler unsterblich und Gesundheit und Atem spielen keine Rolle. +In multi-player mode, the name of other players is written above their head.=Im Mehrspielermodus steht der Name anderer Spieler über dem Kopf. +Items=Gegenstände +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.=Gegenstände sind Dinge, die sie tragen und in Inventaren aufbewahren können. Sie können für die Fertigung, zum Schmelzen, Bauen, Graben und mehr verwendet werden. Zu Gegenständen zählen Blöcke, Werkzeuge und Gegenstände, die nur in der Fertigung benutzt werden. +An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.=Ein Gegenstandsstapel ist eine Sammlung von gleichen Gegenständen, die in einem Inventarplatz passen. Gegenstandsstapel können auf den Boden geworfen werden. Gegenstände, die auf die gleichen Koordinaten fallen, bilden einen Gegenstandsstapel. +A dropped item stack can be collected by punching it.=Ein fallen gelassener Gegenstandsstapel kann aufgesammelt werden, indem er geschlagen wird. +Tools=Werkzeuge +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Einige Gegenstände können als Werkzeug fungieren, wenn man sie hält. Als Werkzeug zählt jeder Gegenstand, der einen besonderen Zweck hat, der direkt vom Träger ausgelöst werden kann. +A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Eine häufige Werkzeugart sind Grabewerkzeuge. Sie sind wichtig zum Abbauen aller möglichen Blöcke. Waffen sind eine Art Werkzeug. Es gibt natürlich viele weitere Werkzeuge. Sonderaktionen von Werkzeugen weden normalerweise mit Links- oder Rechtsklick ausgelöst. +When nothing is wielded, players use their hand which may act as tool and weapon.=Wird nichts gehalten, benutzen die Spieler ihre Hand, die als Werkzeug und Waffe herhalten kann. +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=Viele Werkzeuge werden sich bei Benutzung abnutzen und zerbrechen früher oder später. Der Schaden wird in einer Schadensleiste unter dem Werkzeugsymbol angezeigt. Ohne diese Leiste ist das Werkzeug wie neu. Werkzeuge kann man eventuell mit einer Fertigung reparieren. +Weapons=Waffen +Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.=Einige Gegenstände sind als Nahkampfwaffen zu gebrauchen. Waffen teilen die meisten Eigenschaften mit Werkzeugen. +Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:=Nahkampfwaffen richten Schaden an, indem Spieler und andere aktive Objekte geschlagen werden. +• Single punch: Left-click once to deal a single punch=• Einzelner Schlag: Einmal links klicken +• Quick punching: Hold down the left mouse button to deal quick repeated punches=• Schneller Schlag: Linke Maustaste gedrückt halten, um schnelle wiederholte Schläge zu machen +There are two core attributes of melee weapons:=Nahkampfwaffen haben zwei Hauptattribute: +• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered=• Höchstschaden: Schaden, der angerichtet wird, wenn die Waffe voll ausgeholt ist +• Full punch interval: Time it takes for fully recovering from a punch=• Vollschlagintervall: Zeit, die es braucht, um die Waffe nach einem Schlag wieder stabil zu halten +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Eine Waffe macht nur den vollen Schaden, wenn sie voll ausgeholt ist, d.h. der letzte Schlag war lange genug her. Sonst macht die Waffe nur reduzierten Schaden. Das bedeutet, dass schnelle Schläge wirklich sehr schnell sind, aber geringen Schaden anrichten. Beachten Sie, dass das Vollschlagintervall nicht begrenzt, wie schnell Sie angreifen können. +There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.=Es gibt eine Regel, die es manchmal unmöglich macht, Schaden anzurichten. Spieler, lebendige Objekte und Waffen gehören Schadensgruppen an. Eine Waffe macht nur Schaden auf Sachen, mit denen sie mindestens eine Schadensgruppe teilt. Wenn Sie also die falsche Waffe benutzen, können sie überhaupt keinen Schaden machen. +Pointing=Zeigen +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.=„Zeigen“ bedeutet, dass man auf etwas mit dem Fadenkreuz in Reichweite schaut. Zeigen wird für die Interaktion benutzt, wie Graben, Schlagen, usw. Zu zeigbaren Dingen gehören Blöcke, Spieler, computergesteuerte Feinde und Objekte. +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Um auf etwas zu zeigen, muss es sich in der Zeigereichweite (kurz „Reichweite“) Ihres gehaltenen Gegenstands befinden. Es gibt eine Standardreichweite, wenn Sie nichts halten. Ein gezeigtes Ding wird umrandet oder hervorgehoben (abhängig von Ihren Einstellungen). Zeigen ist nicht möglich mit der Dritten-Person-Vorderkamera. +A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.=Ein paar Dinge können nicht gezeigt werden. Die meisten Blöcke sind zeigbar. Ein paar Blöcke, wie Luft, können niemals gezeigt werden. Andere Blöcke, wie Flüssigkeiten können nur von besonderen Gegenständen gezeigt werden. +Camera=Kamera +You can change the camera mode by pressing [F7].=Sie wechseln den Kameramodus mit [F7]. +You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.=Sie sind eventuell in der Lage, mit [Z] zum Fadenkreuz hereinzuzoomen. Damit können Sie weiter sehen. +Zooming is a gameplay feature that might be enabled or disabled by the game. By default, zooming is enabled when in Creative Mode but disabled otherwise.=Zoomen ist eine Spielfunktion, die vom Spiel ein- oder ausgeschaltet werden kann. Standardmäßig ist das Zoomen im Kreativmodus erlaubt, aber sonst deaktiviert. +• Switch camera mode: [F7]=• Kameramodus wechseln: [F7] +• Zoom: [Z]=• Zoom: [Z] +Blocks=Blöcke +The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Die Welt besteht aus Blöcken (oder Voxeln, um genau zu sein). Blöcke können mit den richtigen Werkzeugen gebaut oder entfernt werden. +Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:=Blöcke haben eine Reihe an verschiedenen Eigenschaften, die die Abbauzeit, ihr Verhalten, Aussehen, Form und vieles mehr beeinflussen. Zu ihren Eigenschaften zählen: +• Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely=• Kollisionsfähig: Kollisionsfähige Blöcke können nicht passiert werden, Spieler können auf ihnen gehen. Nicht kollisionsfähige Blöcke können frei passiert werden +• Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools=• Zeigbar: Zeigbare Blöcke zeigen ein Drahtmodell oder eine scheinende Box, wenn sie gezeigt werden. Aber durch nicht-zeigbare Blöcke werden Sie hindurch zeigen. Flüssigkeiten sind üblicherweise nicht-zeigbar, aber mit besonderen Werkzeugen können sie gezeigt werden. +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools=• Grabeeigenschaften: Von welchen Werkzeugen es abgebaut werden kann, wie schnell und wie stark es Werkzeuge abnutzt +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys=• Kletterbar: Wenn Sie sich an einem kletterbaren Block befinden, werden Sie nicht fallen und Sie können sich mit den Sprung- und Schleichtasten auf- und ab bewegen +• Drowning damage: See the entry “Basics > Player”=• Ertrinkenssschaden: Siehe „Grundlagen > Spieler“ +• Liquids: See the entry “Basics > Liquids”=• Flüssigkeiten: Siehe „Grundlagen > Flüssigkeiten“ +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more=• Gruppenmitgliedschaften: Gruppenmitgliedschaften werden benutzt, um Grabeeigenschaften, Fertigungen, Interaktionen zwischen Blöcken und mehr festzulegen +Mining=Abbauen +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=Das Abbauen (oder Ausgraben) ist der Prozess, in dem Blöcke abgebrochen werden, um sie zu entfernen. Um einen Block abzubauen, zeigen Sie auf ihn und halten Sie die linke Maustaste, bis er bricht. +Short explanation:=Kurzerklärung: +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.=Blöcke benötigen ein Grabewerkzeug, um abgebaut werden zu können. Verschiedene Blöcke werden von verschiedenen Grabewerkzeugen abgebaut und einige Blöcke können gar nicht abgebaut werden. Blöcke variieren in der Härte und Werkzeuge variieren in ihrer Stärke. Grabewerkzeuge werden sich allmählich abnutzen. Die Grabezeit und die Werkzeugabnutzung hängen vom Block und dem Grabewerkzeug ab. Die schnellste Methode, um herauszufinden, wie effizient Ihre Grabewerkzeuge sind, ist es, sie einfach an verschiedenen Blöcken auszuprobieren. Alles, was Sie aus Blöcken erhalten, wird zu Boden fallen und kann von ihnen aufgesammelt werden. +Detailed explanation:=Detaillierte Erklärung: +Mineable blocks have mining properties (based on groups) and a toughness level. Mining tools have the same properties. Each mining property of a block also has a rating, while tools can be able to break blocks within a range of ratings.=Abbaubare Blöcke haben Abbaueigenschaften (basierend auf Gruppen) und einen Härtegrad. Grabewerkzeuge haben die gleichen Eigenschaften. Jede Abbaueigenschaft eines Blocks hat auch eine Wertung; Werkzeuge hingegen können fähig sein, Blöcke mit einer Reihe von Wertungen abzubauen. +In order to mine a block, these conditions need to be met:=Um einen Block abbauen zu können, müssen diese Bedingungen erfüllt sein: +• The block and tool share at least one mining property for which they have a matching rating=• Der Block und das Werkzeug haben mindestens eine gemeinsame Abbaueigenschaft, für die sie eine gleiche Wertung haben +• The tool's toughness level is equal or greater than the block's toughness level=• Der Härtegrad des Werkzeugs ist größer oder gleich dem Härtegrad des Blocks +Example: A block with the mining property “cracky”, rating 3 and toughness level 0 can only be broken by a tool which is able to break “cracky” blocks at rating 3 and it must have a toughness level of 0 or larger.=Beispiel: Ein Block mit der Abbaueigenschaft „cracky“, Wertung 3 und Härtegrad 0 kann nur von einem Werkzeug, der Blöcke mit Eigenschaft „cracky“ bei Wertung 3 bricht, und er muss einen Härtegrad von 0 oder größer haben. +The time it takes to mine a block depends on the ratings and the toughness levels of both tool and block.=Die Zeit, die gebraucht wird, um einen Block abzubauen, hängt von den Wertungen und dem Härtegrad von sowohl dem Werkzeug als auch dem Block ab. +• The base mining time depends on the ratings of the block and the mining speed of the tool=• Die Grund-Abbauzeit hängt von den Wertungen des Blocks und der Grabegeschwindigkeit des Werkzeugs ab +• The mining speed of the tool differs for each mining property and its rating=• Die Grabezeit der Werkzeug unterscheidet sich für jede Abbaueigenschaft und ihrer Wertung +• The toughness level further modifies the mining speed for this mining property=• Der Härtegrad modifiziert die Abbaugeschwindigkeit für diese Abbaueigenschaft noch weiter +• A high difference in toughness levels decreases the mining time considerably=• Eine hohe Differenz in Härtegraden verringert die Abbauzeit beträchtlich +• If the toughness level difference is 2, the mining time is half of the base mining time=• Wenn der Härtegrad 2 ist, wird die Abbauzeit die Hälfte der Grundabbauzeit sein +• With a difference of 3, the mining time is a third, and so on=• Mit einer Differenz von 3 ist die Abbauzeit ein Drittel, und so weiter +The item help shows the mining times of a tool listed by its mining properties and its ratings. The mining times are often expressed as a range. The low number stands for the mining time for toughness level 0 and the high number for the highest level the tool can mine.=Die Gegenstandshilfe zeigt die Abbauzeiten eines Werkzeuges unterteilt nach seinen Abbaueigenschaften und -wertungen. Die Abbauzeiten werden oft als Intervall angegeben. Die niedrige Zahl steht für die Abbauzeit mit Härtegrad 0 und die hohe Zahl für den höchstmöglichen Härtegrad, der vom Werkzeug abgebaut werden kann. +Mining usually wears off tools. Each time you mine a block, your tool takes some damage until it is destroyed eventually. The wear per mined block is determined by the difference between the tool's toughness level and the block's toughness level. The higher the difference, the lower the wear. This means:=Abbauen nutzt Werkzeuge üblicherweise ab. Jedes mal, wenn Sie einen Block abbauen, nimmt Ihr Werkzeug etwas Schaden, bis es zerstört ist. Die Abnutzung pro abgebautem Block hängt ab von der Differenz zwischen dem Härtegrad des Werkzeugs und dem Härtegrad des Blocks. Je größer die Differenz, desto niedriger die Abnutzung. Das bedeutet: +• High-level blocks wear off your tools faster=• Blöcke mit hohem Härtegrad nutzen Ihre Werkzeuge schneller ab +• You can use high-level tools to compensate this=• Sie können hochgradige Werkzeuge benutzen, um dies zu kompensieren +• The highest wear is caused when the level of both tool and block are equal=• Die höchste Abnutzung tritt ein, wenn der Härtegrad von Werkzeug und Block gleich sind +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=Nach dem Abbauen kann ein Block etwas abwerfen. Das sind ein paar Gegenstände, die Sie nach dem Abbauen erhalten können. Üblicherweise erhalten Sie den Block selbst. Es gibt andere Möglichkeiten für einen Abwurf, der vom Blocktyp abhängt. Die folgenden Abwürfe sind möglich: +• Always drops itself (the usual case)=• Wirft nur sich selbst ab (der Normalfall) +• Always drops the same items=• Wirft immer die gleichen Gegenstände ab +• Drops items based on probability=• Wirft Gegenstände mit einer bestimmten Wahrscheinlichkeit ab +• Drops nothing=• Wirft nichts ab +The drop goes directly into your inventory, unless there's no more space left. In that case, the items literally drop on the floor.=Der Abwurf landet direkt in Iherem Inventar, außer, es gibt keinen Platz mehr. In diesem Fall fallen die Gegenstände zu Boden. +Building=Bauen +Almost all blocks can be built (or placed). Building is very simple and has no delay.=Fast alle Blöcke können gebaut (oder platziert) werden. Bauen ist sehr einfach und hat keine Verzögerung. +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.=Um den gehaltenen Block zu bauen, zeigen Sie auf einen Block in der Welt und machen Sie einen Rechtsklick. Wenn dies nicht möglich ist, weil der Block eine besondere Rechtsklick-Aktion hat, halten Sie zusätzlich die Schleichen-Taste gedrückt. +Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.=Blöcke können fast immer an zeigbaren Blöcken gebaut werden. Eine Ausnahme sind Blöcke, die am Boden befestigt sind; diese können nur auf dem Boden gebaut werden. +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.=Normalerweise werden Blöcke vor der gezeigten Seite des gezeigten Blocks gebaut. Ein paar Blöcke sind anders: Wenn Sie an sie anbauen, werden sie ersetzt. +Liquids=Flüssigkeiten +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.=Flüssigkeiten sind besondere dynamische Blöcke. Flüssigkeiten neigen dazu, sich auszubreiten und zu ihren Nachbarblöcken zu fließen. Spieler können in Flüssigkeiten schwimmen und ertrinken. +Liquids usually come in two forms: In source form (S) and in flowing form (F).=Flüssigkeiten gibt es normalerweise in zwei Formen: Quelle (S) und fließend (F). +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.=Flüssigkeitsquellen nehmen die Form eines ganzen Würfels an. Eine Flüssigkeitsquelle wird um sich herum fließende Flüssigkeitsquellen erzeugen und, falls die Flüssigkeit erneuerbar ist, auch Flüssigkeitsquellen erzeugen. Eine Flüssigkeitsquelle erhält sich selbst. Solange nichts passiert, wird eine Flüssigkeitsquelle normalerweise ihren Platz behalten und nicht austrocknen. +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.=Fließende Flüssigkeiten nehmen eine schräge Form an. Fließende Flüssigkeiten breiten sich in der Welt aus, bis sie austrocknen. Eine fließende Flüssigkeit kann sich nicht selbst erhalten und kommt immer aus einer Flüssigkeitsquelle, entweder direkt oder indirekt. Ohne einer Flüssigkeitsquelle wird eine fließende Flüssigkeit irgendwann austrocknen und verschwinden. +All liquids share the following properties:=Alle Flüssigkeiten teilen die folgenden Eigenschaften: +• All properties of blocks (including drowning damage)=• Alle Eigenschaften von Blöcken (inklusive Ertrinkensschaden) +• Renewability: Renewable liquids can create new sources=• Erneuerbarkeit: Erneuerbare Flüssigkeiten können neue Quellen erschaffen +• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2=• Fließreichweite: Wie viele fließende Flüssigkeiten maximal je Flüssigkeitsquelle erschaffen werden; das bestimmt, wie weit die Flüssigkeit fließen wird. Mögliche Reichweiten sind zwischen 0 bis 8. Bei 0 werden keine fließenden Flüssigkeiten erzeugt. Bild 5 zeigt eine Flüssigkeit mit einer Fließreichweite von 2. +• Viscosity: How slow players move through it and how slow the liquid spreads=• Zähflüssigkeit: Wie langsam sich Spieler durch sie bewegen und wie langsam sich die Flüssigkeit ausbreitet +When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).=Wenn diese Eigenschaften zutreffen, wird der freie Raum mit einer neuen Flüssigkeitsquelle des selben Typs gefüllt (Bild 3). +Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.=Schwimmen in einer Flüssigkeit ist einfach: Die normale Richtungstasten für die Grundbewegung, Sprungtaste und Schleichen für Auf- und Abbewegungen. +The physics for swimming and diving in a liquid are:=Die Schwimmphysik: +• The higher the viscosity, the slower you move=• Je höher die Zähflüssigkeit, desto langsamer bewegen Sie sich +• If you rest, you'll slowly sink=• Wenn Sie ruhen, sinken sie langsam +• There is no fall damage for falling into a liquid as such=• Es gibt keinen Fallschaden für das Eintauchen in einer Flüssigkeit als solche +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage=• Wenn Sie in eine Flüssigkeit stürzen, werden Sie bei Kontakt verlangsamt (aber Sie halten nicht sofort an). Ihre Falltiefe hängt von Ihrer Geschwindigkeit und der Zähflüssigkeit ab. Für einen sicheren hohen Sturz in eine Flüssigkeit, stellen Sie sicher, dass genug Flüssigkeit über dem Boden ist, sonst könnten Sie auf den Boden aufschlagen und Fallschaden nehmen. +Liquids are often not pointable. But some special items are able to point all liquids.=Flüssigkeiten sind generell nicht zeigbar. Aber ein paar besondere Werkzeuge können auf alle Flüssigkeiten zeigen. +Crafting=Fertigung +Crafting is the task of combining several items to form a new item.=Fertigen ist die Tätigkeit, in der man mehrere Gegenstände kombiniert, um einen neuen zu erhalten. +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.=Um etwas zu fertigen, brauchen Sie einen oder mehrere Gegenstände, ein Fertigungsgitter (C) und ein Fertigungsrezept. Ein Fertigungsgitter ist wie ein normales Inventar, welches auch zum Fertigen benutzt werden kann. Gegenstände müssen in ein bestimmtes Muster in das Fertigungsgitter platziert werden. Neben dem Fertigungsgitter befindet sich ein Ausgabeplatz (O). Hier wird das Ergebnis auftauchen, wenn Sie die Gegenstände korrekt platziert haben. Das ist nur eine Vorschau, nicht der richtige Gegenstand. Fertigungsgitter können in verschiedenen Größen daher kommen, was die möglichen Rezepte begrenzt. +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.=Um die Fertigung abzuschließen, nehmen Sie sich das Ergebnis vom Ausgabeplatz, was die Gegenstände aus dem Fertigungsgitter verbrauchen und einen neuen Gegenstand erschaffen wird. Es ist nicht möglich, Gegenstände in den Ausgabeplatz zu platzieren. +A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).=Eine Beschreibung, wie man einen Gegenstand fertigt, nennt man „Fertigungsrezept“. Sie brauchen dieses Wissen, um etwas zu fertigen. Es gibt mehrere Möglichkeiten, Fertigungsrezepte zu lernen. Eine Möglichkeit ist es, einen Fertigungsführer zu benutzen, er enthält eine Liste von verfügbaren Fertigungsrezepten. Einige Spiele bieten Fertigungsführer an. Es gibt auch ein paar Mods, die Sie online herunterladen können, um einen Fertigungsführer zu installieren. Ansonsten können Sie die Online-Anleitung des Spieles lesen (wenn es eine gibt). +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.=Fertigungsrezepte bestehen aus mindestens einem Eingabegegenstand und genau einem Stapel von Ausgabegegenständen. Beim Vornehmen einer einzelnen Fertigung wird es genau einen Gegenstand von jedem Stapel im Fertigungsgitter verbrauchen, außer, wenn das Fertigungsrezept Ersätze definiert. +In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.=In einigen Fertigungsrezepten brauchen ein paar Eingabegegenstände keine konkreten Gegenstände zu sein, sie müssen stattdessen nur Mitglied einer Gruppe sein (siehe „Grundlagen > Gruppen“). Diese Rezepte bieten etwas mehr Freiheit bei der Wahl der Eingabegegenstände. Bilder 6-8 zeigen das gleiche gruppenbasierte Rezept. Hier werden 8 Gegenstände der „Stein“-Gruppe benötigt, was der Fall für alle gezeigten Gegenstände ist. +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.=Selten können Fertigungsrezepte Ersätze haben. Das bedeutet, wenn Sie eine Fertigung vornehmen, werden einige Gegenstände im Fertigungsgitter nicht verbraucht, sondern durch einen anderen Gegenstand ersetzt. +Cooking=Kochen +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.=Kochen (bzw. Schmelzen) ist eine Art Fertigung, die ohne Fertigungsgitter auskommt. Kochen wird mit einem besonderem Block vorgenommen (wie einem Ofen), einen kochbaren Gegenstand, einem Brennstoff und Zeit, um einen neuen Gegenstand zu erhalten. +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.=Jeder Brennstoff hat eine Brennzeit. Das ist die Zeit, die ein einzelner Gegenstand des Brennstoffs den Ofen brennen lässt. +Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.=Jeder kochbare Gegenstand braucht Zeit, um gekocht zu werden. Diese Zeit hängt vom Gegenstandstyp ab und der Gegenstand muss für die gesamte Kochzeit „im Feuer“ sein, um tatsächlich gekocht zu werden. +Hotbar=Schnellleiste +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.=Unten sehen Sie ein paar Quadrate. Dies ist die „Schnellleiste“. Die Schnellleiste ermöglicht es Ihnen, schnell auf die ersten Gegenstände Ihres Spielerinventars zuzugreifen. +You can change the selected item with the mouse wheel or the keyboard.=Sie können die gewählten Gegenstände mit dem Mausrad oder der Tastatur wechseln. +• Select previous item in hotbar: [Mouse wheel up] or [B]=• Vorherigen Gegenstand in Schnellleiste wählen: [Mausrad rauf] oder [B] +• Select next item in hotbar: [Mouse wheel down] or [N]=• Vorherigen Gegenstand in Schnellleiste wählen: [Mausrad runter] oder [N] +• Select item in hotbar directly: [1]-[9]=• Gegenstand direkt in Schnellleiste wählen: [1]-[9] +The selected item is also your wielded item.=Der gewählte Gegenstand ist auch Ihr gehaltener Gegenstand. +Minimap=Übersichtskarte +Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.=Drücken Sie [F9], um eine Übersichtskarte rechts oben erscheinen zu lassen. Die Übersichtskarte hilft Ihnen, sich in der Welt zu orientieren. +There are 2 minimap modes and 3 zoom levels.=Es gibt 2 Modi und 3 Zoom-Stufen. +Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.=Der Bodenmodus (Bild 1) ist eine Draufsicht auf die Welt, er zeigt grob die Farben der Blöcke, aus denen die Welt besteht. Er zeigt nur die obersten Blöcke, alles unter ihnen ist verborgen, wie bei einem Satellitenfoto. Der Bodenmodus ist nützlich, wenn Sie sich verlaufen haben. +Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon.=Der Radarmodus (Bild 2) ist etwas komplizierter. Er zeigt die „Dichte“ des Gebiets um Sie herum an und ändert sich mit Ihrer Höhe. Grob gesagt, je grüner ein Gebiet ist, desto „weniger dicht“ ist es. Schwarze Gebiete haben viele Blöcke. Benutzen Sie das Radar, um Höhlen, verborgene Gebiete, Wände und mehr zu finden. Die rechteckigen Formen in Bild 2 verraten deutlich den Ort eines Kerkers. +There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.=Es gibt auch zwei unterschiedliche Rotationsmodi. Im „Quadratsmodus“ ist die Rotation der Übersichtskarte fest. Drücken Sie [Umschalt]+[F9], um zum „Kreismodus“ zu wechseln, in dem sich die Karte mit Ihrer Blickrichtung dreht, also ist „oben“ immer in Ihrer Blickrichtung. +In some games, the minimap may be disabled.=In einigen Spielen kann die Übersichtskarte deaktiviert sein. +• Toggle minimap mode: [F9]=• Übersichtskartenmodus ändern: [F9] +• Toggle minimap rotation mode: [Shift]+[F9]=• Rotationsmodus der Übersichtskarte ändern: [Umschalt]+[F9] +Inventory=Inventar +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.=Inventare werden benutzt, um Gegenstandsstapel aufzubewahren. Es gibt andere Verwendungszwecke, wie die Fertigung. Ein Inventar besteht aus einem rechteckigem Raster aus Gegenstandsplätzen. Jeder Gegenstandsplatz kann entweder leer sein, oder einen Gegenstandsstapel enthalten. Gegenstandsstapel können frei zwischen den meisten Plätzen bewegt weren. +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.=Sie haben Ihr eigenes Inventar, das „Spielerinventar“, Sie können es mit Ihrer Inventartaste (Standard: [I]) öffnen. Die ersten Inventarplätze werden auch als Plätze in Ihrer Schnellleiste benutzt. +Blocks can also have their own inventory, e.g. chests and furnaces.=Blöcke können auch ihr eigenes Inventar haben, z.B. Truhen und Öfen. +Inventory controls:=Inventarsteuerung: +Taking: You can take items from an occupied slot if the cursor holds nothing.=Nehmen: Sie können Gegenstände aus einem belegten Platz nehmen, wenn der Mauszeiger nichts hält. +• Left click: take entire item stack=• Linksklick: Ganzen Gegenstandsstapel nehmen +• Right click: take half from the item stack (rounded up)=• Rechtsklick: Hälfte des Stapels nehmen (aufgerundet) +• Middle click: take 10 items from the item stack=• Mittelklick: 10 Gegenstände von einem Stapel nehmen +• Mouse wheel down: take 1 item from the item stack=• Mausrad runter: 1 Gegenstand vom Stapel nehmen +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.=Ablegen: Sie können Gegenstände auf einem Platz ablegen, wenn der Mauszeiger einen oder mehrere Gegenstände hält und der Platz entweder leer ist, oder einen Stapel des gleichen Gegenstandstyps enthält. +• Left click: put entire item stack=• Linksklick: Ganzen Stapel ablegen +• Right click or mouse wheel up: put 1 item of the item stack=• Rechtsklick oder Mausrad hoch: 1 Gegenstand des Stapels ablegen +• Middle click: put 10 items of the item stack=• Mittelklick: 10 Gegenstände des Stapels ablegen +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.=Vertauschen: Sie können Gegenstände vertauschen, wenn der Mauszeiger einen oder mehrere Gegenstände hält und der Zielplatz von einem anderen Gegenstandstyp belegt ist. +• Click: exchange item stacks=• Klick: Stapel vertauschen +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.=Wegwerfen: Wenn Sie einen Stapel halten und irgendwo außerhalb des Menüs klicken, wird der Stapel in die Umwelt weggeworfen. +Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.=Schnelles Verschieben: Sie können einen Stapel schnell von/zu dem Spielerinventar von/zu einem anderem Inventar (z.B. in einem Inventar einer Truhe oder eines Ofens) verschieben. Das Zielinventar ist normalerweise das relevanteste Inventar des Behälters. +• Sneak+Left click: Automatically transfer item stack=• Schleichtaste+Linksklick: Automatisch Stapel verschieben +Online help=Online-Hilfe +You may want to check out these online resources related to Minetest:=Sie können diese Onlinequellen zum Thema Minetest besuchen: +Official homepage of Minetest: =Offizielle Minetest-Homepage: +The main place to find the most recent version of Minetest.=Dort findet man die neueste Minetest-Version. +Community wiki: =Community-Wiki: +A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.=Eine gemeinschaftsbasierte Dokumentationswebpräsenz für Minetest. Jeder mit einem Benutzerkonto kann sie bearbeiten. Enthält auch die Hilfe zu Minetest Game. +Web forums: =Webforen: +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.=Eine webbasierte Diskussionsplattform, wo Sie über alles zum Thema Minetest diskutieren können. Dort werden auch spielergemachte Mods und Spiele veröffentlicht und diskutiert. +Chat: =Chat: +A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.=Ein allgemeiner Internet-Relay-Chat-Kanal für alles über Minetest, wo sich Menschen treffen können, um in Echtzeit zu diskutieren. Wenn Sie IRC nicht verstehen, sehen Sie im Community-Wiki für Hilfe nach. +Groups=Gruppen +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:=Gegenstände, Spieler und Objekte (lebend oder nicht) können Mitglieder von einer Reihe von Gruppen sein. Gruppen erfüllen mehrere Zwecke: +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups=• Fertigungsrezepte: Plätze in Fertigungsrezepten erfordern nicht unbedingt einen konkreten Gegenstand, sondern einen Gegenstand, der zu einer bestimmten Gruppe, oder mehreren Gruppen, gehört +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups=• Abbauzeiten: Abbaubare Blöcke gehören zu Gruppen, die benutzt werden, um die Abbauzeiten zu bestimmen. Grabewerkzeuge sind fähig, grabbare Blöcke, die zu bestimmten Gruppen gehören, abzubauen +• Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group=• Blockverhalten: Blöcke können ein besonderes Verhalten aufweisen und mit anderen Blöcken interagieren, wenn sie zu einer bestimmten Gruppe gehören +• Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”=• Schaden und Rüstung: Objekte und Spieler haben Rüstungsgruppen, Waffen haben Schadensgruppen. Diese Gruppe bestimmen den Schaden. Siehe auch: „Grundlagen > Waffen“ +• Other uses=• Andere Zwecke +In the item help, many important groups are usually mentioned and explained.=In der Gegenstandshilfe werden viele wichtige Gruppen normalerweise erwähnt und erklärt. +Glossary=Glossar +This is a list of commonly used terms:=Dies ist eine Liste von häufig benutzten Begriffen: +Controls:=Steuerung: +• Wielding: Holding an item in hand=• Halten: Einen Gegenstand in der Hand halten +• Pointing: Looking with the crosshair at something in range=• Zeigen: Mit dem Fadenkreuz auf etwas in Reichweite blicken +• Dropping: Throwing an item or item stack to the ground=• Wegwerfen: Gegenstand oder Stapel zu Boden werfen +• Punching: Attacking with left-click, is also used on blocks=• Schlagen: Angriff mit Linksklick, wird auch an Blöcken benutzt +• Sneaking: Walking slowly while (usually) avoiding to fall over edges=• Schleichen: Langsam gehen, während man (normalerweise) verhindert, über die Kante zu fallen +• Climbing: Moving up or down a climbable block=• Klettern: Bei einem kletterbaren Block auf- oder absteigen +Blocks:=Blöcke: +• Block: Cubes that the worlds are made of=• Block: Würfel, aus denen die Welten gemacht sind +• Mining/digging: Using a mining tool to break a block=• Abbauen/Graben: Ein Grabewerkzeug benutzen, um einen Block zu zerbrechen +• Building/placing: Putting a block somewhere=• Bauen/Platzieren: Einen Block irgendwo hin setzen +• Drop: Items you get after mining a block=• Abwurf: Gegenstände, den Sie nach dem Abbauen erhalten +• Using a block: Right-clicking a block to access its special function=• Einen Block benutzen: Rechtsklick auf einem Block, um auf seine Sonderfunktion zuzugreifen +Items:=Gegenstände: +• Item: A single thing that players can possess=• Gegenstand: Ein einzelnes Ding, den Spieler besitzen können +• Item stack: A collection of items of the same kind=• Gegenstandsstapel: Eine Sammlung von gleichen Gegenständen +• Maximum stack size: Maximum amount of items in an item stack=• Maximale Stapelgröße: Maximale Anzahl Gegenstände in einem Gegenstandsstapel +• Slot / inventory slot: Can hold one item stack=• Platz / Inventarplatz: Kann einen Gegenstandsstapel halten +• Inventory: Provides several inventory slots for storage=• Inventar: Bietet mehrere Inventarplätze für die Lagerung +• Player inventory: The main inventory of a player=• Spielerinventar: Das Hauptinventar eines Spielers +• Tool: An item which you can use to do special things with when wielding=• Werkzeug: Ein Gegenstand, mit dem man besondere Dinge beim Halten tun kan +• Range: How far away things can be to be pointed by an item=• Reichweite: Bis zu welcher Entfernung man Dinge zeigen kann +• Mining tool: A tool which allows to break blocks=• Grabewerkzeug: Werkzeug, mit dem man Blöcke brechen kann +• Craftitem: An item which is (primarily or only) used for crafting=• Fertigungsgegenstand: Ein Gegenstand der (hauptsächlich oder nur) für die Fertigung benutzt wird +Gameplay:=Spiel: +• “heart”: A single health symbol, indicates 2 HP=• „Herz“: Ein einzelnes Gesundheitssymbol, steht für 2 TP +• “bubble”: A single breath symbol, indicates 1 BP=• „Luftblase“: Ein einzelnes Atemsymbol, steht für 1 AP +• HP: Hit point (equals half 1 “heart”)=• TP: Trefferpunkt (gleich 1 halbes „Herz“) +• BP: Breath point, indicates breath when diving=• AP: Atempunkt, steht für Atem beim Tauchen +• Mob: Computer-controlled enemy=• Mob: Computergesteuerter Gegner +• Crafting: Combining multiple items to create new ones=• Fertigen: Kombinierung mehrerer Gegenstände, um neue zu erhalten +• Crafting guide: A helper which shows available crafting recipes=• Fertigungsführer: Ein Helferlein, um die verfügbaren Fertigungsrezepte zu zeigen +• Spawning: Appearing in the world=• Einsteigen (spawning): In der Welt auftauchen +• Respawning: Appearing again in the world after death=• Wiedereinsteigen (respawning): Wieder in der Welt auftauchen, nach dem man gestorben ist +• Group: Puts similar things together, often affects gameplay=• Gruppe: Fasst mehrere Dinge zusammen, betrifft oft den Spielverlauf +• noclip: Allows to fly through walls=• Geistmodus / noclip: Damit kann man durch Wände fliegen +Interface=Benutzeroberfläche +• Hotbar: Inventory slots at the bottom=• Schnellleiste: Untere Inventarplätze +• Statbar: Indicator made out of half-symbols, used for health and breath=• Wertleiste: Indikator aus Halbsymbolen, für Gesundheit und Atem benutzt +• Minimap: The map or radar at the top right=• Übersichtskarte: Karte oder Radar oben rechts +• Crosshair: Seen in the middle, used to point at things=• Fadenkreuz: In der Mitte, damit kann man auf Dinge zeigen +Online multiplayer:=Online-Mehrspieler: +• PvP: Player vs Player. If active, players can deal damage to each other=• PvP: Spielerkampf (Player vs Player). Wenn aktiv, können sich Spieler gegenseitig verletzen +• Griefing: Destroying the buildings of other players against their will=• Griefen: Gebäude anderer Spieler gegen ihren Willen zerstören +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside=• Schutz: Mechanismus, um Eigentum an Gebieten in der der Welt zu erlangen, wodurch nur der Eigentümer die Blöcke verändern kann +Technical terms:=Technische Begriffe: +• Minetest: This game engine=• Minetest: Diese Spiel-Engine +• Minetest Game: A game for Minetest by the Minetest developers=• Minetest Game: Ein Spiel für Minetest von den Minetest-Entwicklern +• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar=• Spiel: Ein vollständiges Spielerlebnis für Minetest, also ein richtiges Spiel oder auch nur eine Sandbox oder ähnliches +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them=• Mod: Ein einzelnes Untersystem, welches Funktionalität hinzufügt oder modifiziert; ist das Fundament von Spielen und kann benutzt werden, um sie zu erweitern oder zu modifizieren +• Privilege: Allows a player to do something=• Privileg: Erlaubt einem Spieler, etwas zu tun +• Node: Other word for “block”=• Node: Anderes Wort für „Block“ +Settings=Einstellungen +There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.=Es gibt viele Einstellungen, um Minetest einzurichten. Fast jeder Aspekt kann so verändert werden. +These are a few of the most important gameplay settings:=Dies sind ein paar der wichtigsten Spieleinstellungen: +• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal=• Schaden aktiviert (enable_damage): Aktiviert die Gesundheits- und Atemattribute für alle Spieler. Wird dies deaktiviert, sind Spieler unsterblich. +• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the game; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.=• Kreativmodus (creative_mode): Aktiviert eine Art Sandkastenmodus, der sich auf Kreativität statt auf ein herausforderndes Spiel konzentriert. Die Bedeutung hängt vom Spiel ab; die üblichen Änderungen sind: Verringerte Grabezeiten, leichter Zugriff zu fast allen Dingen, Werkzeuge nutzen sich nie ab, usw. +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other=• PvP (enable_pvp): Wenn aktiv, können sich Spieler gegenseitig verletzen +For a full list of all available settings, use the “All Settings” dialog in the main menu.=Für eine vollständige Liste aller verfügbaren Einstellungen, benutzen Sie den Knopf „Alle Einstellunen“ im Hauptmenü. +Movement modes=Bewegungsmodi +If you have the required privileges, you can use up to three special movement modes.=Wenn Sie die benötigten Privilegien haben, können Sie bis zu drei besondere Bewegungsmodi benutzen. +Fast mode:=Schnellmodus: +• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.=• Beschreibung: Damit bewegen Sie sich viel schneller. In der Client-Konfiguration können Sie den Schnellmodus ferner anpassen +• Default key: [J]=• Standardtaste: [J] +• Required privilege: fast=• Benötigtes Privileg: fast +Fly mode:=Flugmodus +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.=• Beschreibung: Schwerkraft beeinflusst Sie nicht und Sie können sich in alle Richtungen schnell bewegen. Benutzen Sie die Sprungtaste zum Aufsteigen und die Schleichentaste zum Absinken. +• Default key: [K]=• Standardtaste: [K] +• Required privilege: fly=• Benötigtes Privileg: fly +Noclip mode:=Geistmodus: +• Description: Allows you to move through walls. Only works when fly mode is enabled, too.=• Beschreibung: Damit können Sie durch Wände fliegen, wenn der Flugmodus aktiv ist. +• Default key: [H]=• Standardtaste: [H] +• Required privilege: noclip=• Benötigtes Privileg: noclip +Console=Konsole +With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.=Mit [F10] öffnen und schließen Sie die Konsole. Der Hauptzweck der Konsole ist die Anzeige des Chatprotokolls und für die Eingabe von Chatnachrichten oder Serverbefehlen. +Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.=Wenn Sie die Chat- oder Serverbefehlstaste benutzen, wird die Konsole auch geöffnet, aber sie ist kleiner und wird geschlossen, nachdem Sie eine Nachricht gesendet haben. +Use the chat to communicate with other players. This requires you to have the “shout” privilege.=Benutzen Sie den Chat, um mit anderen Spielern zu kommunizieren. Dafür brauchen Sie das „shout“-Privileg. +Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.=Geben Sie einfach die Nachricht ein und drücken [Eingabe]. Öffentliche Chatnachrichten können nicht mit „/“ beginnen. +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .=Sie können private Nachrichten senden: Sagen Sie „/msg “ im Chat, um „“ zu senden, aber nur für sichtbar. +There are some special controls for the console:=Besondere Steuerung für die Konsole: +• [F10] Open/close console=• [F10] Konsole öffnen/schließen +• [Enter]: Send message or command=• [Eingabe] Nachricht oder Befehl senden +• [Tab]: Try to auto-complete a partially-entered player name=• [Tab]: Autovervollständigung von Spielernamen +• [Ctrl]+[Left]: Move cursor to the beginning of the previous word=• [Strg]+[Links]: Cursor zum Anfang des vorherigen Wortes bewegen +• [Ctrl]+[Right]: Move cursor to the beginning of the next word=• [Strg]+[Rechts]: Cursor zum Anfang des vorherigen Wortes bewegen +• [Ctrl]+[Backspace]: Delete previous word=• [Strg]+[Rücktaste]: Vorheriges Wort löschen +• [Ctrl]+[Delete]: Delete next word=• [Strg]+[Entfernen]: Nächstes Wort löschen +• [Ctrl]+[U]: Delete all text before the cursor=• [Strg]+[U]: Text vor dem Cursor löschen +• [Ctrl]+[K]: Delete all text after the cursor=• [Strg]+[K]: Text nach dem Cursor löschen +• [Page up]: Scroll up=• [Bild auf]: Nach oben scrollen +• [Page down]: Scroll down=• [Bild ab]: Nach unten rollen +There is also an input history. Minetest saves your previous console inputs which you can quickly access later:=Es gibt auch eine Eingabe-Historie. Minetest merkt sich Ihre vorherigen Konsoleneingaben, auf die Sie später schnell zugreifen können: +• [Up]: Go to previous entry in history=• [Rauf]: Zum vorherigen Eintrag in der Historie gehen +• [Down]: Go to next entry in history=• [Runter]: Zum nächsten Eintrag in der Historie gehen +Server commands=Serverbefehle +Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.=Serverbefehle (auch „Chat-Befehle“ genannt) sind kleine Helferlein für fortgeschrittene Benutzer. Sie müssen diese Befehle im normalen Spielverlauf nicht benutzen. Aber sie können nützlich sein, um ein paar technischere Aufgaben zu erledigen. Serverbefehle funktionieren sowohl im Mehrspieler- als auch im Einzelspielermodus. +Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.=Serverbefehle können von Spielern im Chat eingegeben werden, um eine besondere Serveraktion auszulösen. Es gibt ein paar Befehle, die von jedem benutzt werden können, aber einige Befehle benötigen Privilegien, die vom Server gewährt werden. Es gibt eine kleine Menge an Grundbefehlen, die immer verfügbar sind, andere Befehle können von Mods hinzugefügt werden. +To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.=Um einen Befehl zu erteilen, geben Sie ihn einfach wie eine Chatnachricht ein oder drücken Sie Minetests Befehlstaste (Standard: [/]). Alle Befehle müssen mit „/“ beginnen, z.B. „/mods“. Die Minetestbefehlstaste macht das gleiche wie die Chattaste, nur, dass der Schrägstrich schon eingegeben wurde. +Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.=Befehle können eine Rückmeldung im Chatprotokoll auslösen, müssen aber nicht. Fehlermeldungen tauchen grundsätzlich im Chat auf. Probieren Sie es aus: Schließen Sie dieses Fenster und geben Sie den „/mods“-Befehl ein. Damit erhalten Sie die Liste der vorhandenen Mods auf diesem Server. +“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.=„/help all“ ist ein sehr wichtiger Befehl: Damit erhalten Sie eine Liste aller verfügbaren Befehle auf dem Server, eine kurze Erklärung und die möglichen Parameter. Dieser Befehl ist auch wichtig, weil die Befehle sich je nach Server unterscheiden können. +Commands are followed by zero or more parameters.=Befehle haben null oder mehr Parameter. +In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:=In der Befehlsreferenz sehen Sie einige Platzhalter, die sie mit dem richtigen Wert ersetzen müssen. Hier ist eine Erklärung: +• Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter=• Text zwischen Größer-Als- und Kleiner-Als-Zeichen (z.B. „“): Platzhalter für einen Parameter +• Anything in square brackets (e.g. “[text]”) is optional and can be omitted=• Alles in eckigen Klammern (z.B. „[Text]“) ist optional und kann ausgelassen werden +• Pipe or slash (e.g. “text1 | text2 | text3”): Alternation. One of multiple texts must be used (e.g. “text2”)=• Senkrechtstrich (z.B. „Text1 | Text2 | Text3“): Alternativen. Eines von mehreren Texten muss benutzt werden +• Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations=• Klammern (z.B. „(Wort1 Wort2) | Wort3“): Gruppiert mehrere Wörter zusammen, für die Alternativen benutzt +• Everything else is to be read as literal text=• Alles andere muss als wortwörtlicher Text gelesen werden +Here are some examples to illustrate the command syntax:=Ein paar Beispiele, um die Befehlssyntax zu erläutern: +• /mods: No parameters. Just enter “/mods”=• /mods: Keine Parameter. Geben Sie einfach „/mods“ ein +• /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”=• /me : 1 Parameter. Sie müssen „/me “ gefolgt von einem beliebigen Text eingeben, z.B. „/me bestellt Pizza“ +• /give : Two parameters. Example: “/give Player default:apple”=• /give : Zwei Parameter. Beispiel: „/give Spieler default:apple“ +• /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”=• /help [all|privs|]: Gültige Eingaben sind „/help“, „/help all“, „/help privs“ oder „/help “ gefolgt von einem Befehlsnamen, wie „/help time“ +• /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”=• /spawnentity [,,]: Gültige Eingaben beeinhalten „/spawnentity boats:boat“ und „/spawnentity boats:boat 0,0,0“ +Some final remarks:=Ein paar letzte Anmerkungen: +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege=• Für /give und /giveme brauchen Sie einen sog. Itemstring. Das ist ein intern benutzter eindeutiger Gegenstandsidentifikator, den Sie in der Gegenstandshilfe finden, wenn Sie das „give“ oder „debug“-Privileg haben +• For /spawnentity you need an entity name, which is another identifier=• Für /spawnentity brauchen Sie einen Entity-Namen, was ein anderer Identifikator ist +Privileges=Privilegien +Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.=Jeder Spieler hat eine Menge an Privilegien, die sich von Server zu Server unterscheiden. Ihre Privilegien bestimmen, was Sie tun können und was nicht. Privilegien können von anderen Spielern gewährt und entzogen werden, wenn diese das Privileg namens „privs“ haben. +On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.=In Mehrspielerservern mit der Standardeinstellung starten Spieler mit den Privilegien „interact“ und „shout“. Das „interact“-Privileg wird für die grundlegendsten Spielaktionen so wie Bauen, Abbauen, Benutzen, usw. gebraucht. Das „shout“-Privileg braucht man zum Chatten. +There is a small set of core privileges which you'll find on every server, other privileges might be added by mods.=Es gibt eine kleine Menge an Hauptprivilegien, die Sie auf jeden Server finden, andere Privilegien können von Mods hinzugefügt werden. +To view your own privileges, issue the server command “/privs”.=Um Ihre eigenen Privilegien zu sehen, erteilen Sie den Serverbefehl „/privs“. +Here are a few basic privilege-related commands:=Hier sind ein paar Befehle zum Thema Privilegien: +• /privs: Lists your privileges=• /privs: Listet Ihre Privilegien auf +• /privs : Lists the privileges of =• /privs : Listet die Privilegien von auf +• /help privs: Shows a list and description about all privileges=• /help privs: Zeigt eine Liste und Beschreibung für alle Privilegien an +Players with the “privs” privilege can modify privileges at will:=Spieler mit dem Privileg „privs“ können Privilegien beliebig ändern: +• /grant : Grant to =• /grant : an gewähren +• /revoke : Revoke from =• /revoke : von entziehen +In single-player mode, you can use “/grantme all” to unlock all abilities.=Im Einzelspielermodus können Sie „/grantme all“ benutzen, um alle Fähigkeiten freizuschalten. +Light=Licht +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).=Da die Welt völlig auf Blöcken basiert, gilt dies auch für das Licht in der Welt. Jeder Block hat seine eigene Helligkeit. Die Helligkeit eines Blocks wird als „Helligkeitsstufe“ angegeben, die von 0 (völlig dunkel) bis 15 (so hell wie die Sonne) reicht. +There are two types of light: Sunlight and artificial light.=Es gibt zwei Lichttypen: Sonnenlicht und künstliches Licht. +Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.=Künstliches List kommt von leuchtenden Blöcken. Künstliches Licht hat eine Helligkeit zwischen 1-14. +Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.=Sonnenlicht ist das hellste Licht und geht immer von oben vom Himmel schnurgerade nach unten zu jeder Tageszeit. In der Nacht wird aus Sonnenlicht Mondlicht, welches immer noch etwas Licht spendet. +Blocks have 3 levels of transparency:=Blöcke haben 3 Stufen der Transparenz: +• Transparent: Sunlight goes through limitless, artificial light goes through with losses=• Transparent: Sonnenlicht geht unbegrenzt hindurch, künstliches Licht geht mit Verlusten hindurch +• Semi-transparent: Sunlight and artificial light go through with losses=• Halbtransparent: Sonnenlicht und künstliches Licht gehen mit Verlusten durch +• Opaque: No light passes through=• Lichtundurchlässig: Licht kann nicht passieren +Artificial light will lose one level of brightness for each transparent or semi-transparent block it passes through, until only darkness remains (image 1).=Künstliches Licht wird eine Helligkeitsstufe für jeden transparenten oder halbtransparenten Block, den es passiert, einbüßen, bis es völlig verdunkelt ist (Bild 1). +Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.=Sonnenlicht wird seine Helligkeit behalten, solange sie nur volltransparente Blöcke passiert. Sobald sie einen halbtransparenten Block passiert, wird es zu künstlichem Licht. Bild 2 zeigt den Unterschied. +Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.=Beachten Sie, dass das Wort „Transparenz“ hier nur bedeutet, dass der Block fähig ist, Helligkeit von seinen Nachbarblöcken weiterzugeben. Es ist möglich, dass ein Block transparent gegenüber Licht ist, aber Sie können nicht durch ihn sehen. +Coordinates=Koordinaten +The world is a large cube. And because of this, a position in the world can be easily expressed with Cartesian coordinates. That is, for each position in the world, there are 3 values X, Y and Z.=Die Welt ist ein großer Würfel. Und daher kann eine Position in der Welt leicht mit kartesischen Koordinaten ausgedrückt weren. Das bedeutet, für jede Position in der Welt gibt es 3 Werte X, Y und Z. +Like this: (5, 45, -12)=So wie dies: (5, 45, -12) +This refers to the position where X@=5, Y@=45 and Z@=-12. The 3 letters are called “axes”: Y is for the height. X and Z are for the horizontal position.=Das bezieht sich auf die Position, in der X@=5, Y@=45 und Z@=-12 sind. Die drei Buchstaben nennt man „Achsen“. Y ist für die Höhe X und Z sind für die horizontale Position. +The values for X, Y and Z work like this:=Die Werte für X, Y und Z funktionieren so: +• If you go up, Y increases=• Wenn Sie aufsteigen, erhöht sich Y +• If you go down, Y decreases=• Steigen Sie ab, verringert sich Y +• If you follow the sun, X increases=• Folgen Sie der Sonne, erhöht sich X +• If you go to the reverse direction, X decreases=• Gehen Sie in die entgegengesetzte Richtung, verringert sich X +• Follow the sun, then go right: Z increases=• Folgen Sie der Sonne, dann gehen Sie nach rechts: Z erhöht sich +• Follow the sun, then go left: Z decreases=• Folgen Sie der Sonne, dann gehen Sie nach links: Z verringert sich +• The side length of a full cube is 1=• Die Seitenlänge eines ganzen Würfels ist 1 +You can view your current position in the debug screen (open with [F5]).=Sie sehen Ihre aktuelle Position im Debug-Bildschirm (mit [F5] öffnen). +Items have several properties, including the following:=Gegenstände haben diverse Eigenschaften, unter anderem: +• Maximum stack size: Number of items which fit on 1 item stack=• Maximale Stapelgröße: Anzahl der Gegenstände, die in einen Gegenstandsstapel passen +• Pointing range: How close things must be to be pointed while wielding this item=• Zeigereichweite: Wie nah Dinge zum Zeigen sein müssen, wenn dieser Gegenstand gehalten wird +• Group memberships: See “Basics > Groups”=• Gruppenmitgliedschaften: Siehe „Grundlagen > Gruppen“ +• May be used for crafting or cooking=• Kann zum Fertigen oder beim Kochen benutzt werden +There are multiple types of crafting recipes:=Es gibt mehrere Arten von Fertigungsrezepten: +• Shaped (image 2): Items need to be placed in a particular shape=• Förmig (Bild 2): Gegenstände müssen in einer bestimmten Form platziert werden +• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)=• Formlos (Bilder 3 und 4): Gegenstände müssen irgendwo in der Eingabe platziert werden (beide Bilder zeigen das gleiche Rezept) +• Cooking: Explained in “Basics > Cooking”=• Kochen: Siehe „Grundlagen > Kochen“ +• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%=• Reparieren (Bild 5): Platzieren sie zwei gleiche beschädigte Werkzeuge in das Fertigungsgitter, um ein Werkzeug zu erhalten, das zu 5% repariert ist +There are 3 different views which determine the way you see the world. The modes are:=Es gibt 3 verschiedene Ansichten, die bestimmen, wie Sie die Welt sehen. Die Modi sind: +• 1: First-person view (default)=• 1: Erste Person (Standard) +• 2: Third-person view from behind=• 2: Dritte Person von hinten +• 3: Third-person view from the front=• 3: Dritte Person von vorne +Players can take damage for a variety of reasons, here are some:=Spieler können aus verschidenen Gründen Schaden erleiden, hier sind ein paar: +• Taking fall damage=• Fallschaden +• Touching a block which causes direct damage=• Einen Block berühren, der Direktschaden anrichtet +• Drowning=• Ertrinken +• Being attacked by another player=• Angriff eines anderen Spielers +• Being attacked by a computer enemy=• Angriff eines Computergegners +Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:=Erneuerbare Flüssigkeiten erschaffen neue Flüssigkeitsquellen in Freiräumen (Bild 2). Eine neue Flüssigkeitsquelle wird erschaffen, wenn: +• Two renewable liquid blocks of the same type touch each other diagonally=• Zwei gleiche erneuerbare Flüssigkeitsblöcke sich diagonal berühren +• These blocks are also on the same height=• Diese Blöcke sich auch in der gleichen Höhe befinden +• One of the two “corners” is open space which allows liquids to flow in=• Eines der zwei „Ecken“ ein Freiraum ist, in den Flüssigkeiten hereinfließen können +You can enable some special movement modes that change how you move.=Sie können in paar besondere Bewegungsmodi einschalten, die ändern, wie Sie sich bewegen. +Pitch movement mode:=Nick-Bewegungsmodus: +• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.=• Wenn dieser Modus aktiviert ist, werden die Bewegungstasten Sie relativ zu Ihrem jetzigen Nickwinkel (vertikaler Blickwinkel) bewegen, wenn Sie sich in einer Flüssigkeit befinden oder der Flugmodus aktiv ist. +• Default key: [L]=• Standardtaste: [L] +• No privilege required=• Kein Privileg nötig + +Creative Mode=Kreativmodus +Enabling Creative Mode in MineClone 2 applies the following changes:=Der Kreativmodus in MineClone 2 nimmt die folgenden Änderungen vor: +• You keep the things you've placed=• Sie behalten die Dinge, die Sie platzieren +• Creative inventory is available to obtain most items easily=• Das Kreativinventar ist verfügbar, mit dem Sie die meisten Dinge leicht erhalten +• Hand breaks all default blocks instantly=• Hand zerbricht alle Standardblöcke sofort +• Greatly increased hand pointing range=• Stark erhöhte Zeigereichweite der Hand +• Mined blocks don't drop items=• Gegrabene Blöcke werfen nichts ab +• Items don't get used up=• Gegenstände werden nicht verbraucht +• Tools don't wear off=• Werkzeuge nutzen sich nicht ab +• You can eat food whenever you want=• Sie können essen, wann immer Sie wollen +• You can always use the minimap (including radar mode)=• Sie können die Übersichtskarte immer benutzen (auch den Radarmodus) +Damage is not affected by Creative Mode, it needs to be disabled separately.=Schaden wird vom Kreativmodus nicht beeinflusst, er muss separat ausgeschaltet werden. +Mobs=Mobs +Mobs are the living beings in the world. This includes animals and monsters.=Mobs sind die lebenden Kreaturen in der Welt. Das schließt Tiere und Monster ein. +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).=Monster tauchen zufällig in der Welt auf. Das nennt man „spawnen“. Jeder Mobart taucht auf bestimmten Blocktypen bei einer bestimmten Helligkeit auf. Die Höhe spielt auch eine Rolle. Friedliche Mobs neigen dazu, bei Tageslicht zu spawnen, während feindliche Mobs die Dunkelheit bevorzugen. Die meisten Mobs können auf jedem festen Block spawnen, aber einige Mobs können nur auf bestimmten Blöcken spawnen (wie Grasblöcke). +Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.=Wie Spieler haben Mobs Trefferpunkte und manchmal auch Rüstungspunkte (was bedeutet, dass Sie bessere Waffen benötigen, um überhaupt Schaden anrichten zu können). Auch wie bei Spielern können feindliche Mobs direkt angreifen oder aus der Ferne. Mobs können nach ihrem Tod zufällige Gegenstände abwerfen. +Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.=Die meisten Tiere wandern in der Welt ziellos umher, während die meisten feindlichen Mobs die Spieler jagen. Tiere können gefüttert, gezähmt und gezüchtet werden. +Animals=Tiere +Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.=Tiere sind friedliche Wesen, die in der Welt ziellos umherwandern. Sie können sie füttern, zähmen und züchten. +Feeding:=Füttern: +Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.=Jedes Tier hat eine eigene Vorliebe für Nahrung und akzeptiert nicht einfach jedes Lebensmittel. Zum Füttern halten Sie einen Gegenstand in der Hand und rechtsklicken Sie das Tier. +Animals are attraced to the food they like and follow you as long you hold the food item in hand.=Tiere werden von Lebensmitteln, die sie mögen, magisch angezogen und sie folgen Ihnen, solange Sie einen solchen Gegenstand halten. +Feeding an animal has three uses: Taming, healing and breeding.=Füttern hat drei Zwecke: Zähmen, heilen und züchten. +Feeding heals animals instantly, depending on the quality of the food item.=Füttern heilt Tiere sofort, abhängig von der Qualität des Lebensmittels. +Taming:=Zähmen: +A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.=Ein paar Tiere können gezähmt werden. Sie können grundsätzlich mehr Sachen mit gezähmten Tieren machen und andere Gegenstände an ihnen benutzen. Zum Beispiel können zahme Pferde aufgesattelt werden und Wölfe dazu gebracht werden, an Ihrer Seite zu kämpfen. +Breeding:=Züchten: +When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.=Wenn Sie ein Tier bis zur vollen Gesundheit geheilt haben und es erneut füttern, werden Sie den „Liebesmodus“ aktivieren. Viele Herzen tauchen um das Tier herum auf. +Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.=Zwei Tiere der gleichen Art werden sich paaren, wenn sie im Liebesmodus sind und nah beieinander stehen. Kurz darauf wird ein Junges auftauchen. +Baby animals:=Junge: +Baby animals are just like their adult couterparts, but they can't be tamed or bred and don't drop anything when they die. They grow to adults after a short time. When fed, they grow to adults faster.=Junge sind wie ihre erwachsenen Artgenossen, aber sie können nicht gezähmt oder gezüchtet werden und werfen nichts ab, wenn sie sterben. Nach einer kurzen Zeit werden sie erwachsen. Werden sie gefüttert, werden sie schneller erwachsen. +Hunger=Hunger +Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.=Hunger beeinflusst Ihre Gesundheit und Ihre Fähigkeit, zu sprinten. +Core hunger rules:=Haupthungerregeln: +• You start with 20/20 hunger points (more points @= less hungry)=• Sie beginnen mit 20/20 Hungerpunkten (mehr Punkte @= weniger hungrig) +• Actions like combat, jumping, sprinting, etc. decrease hunger points=• Aktionen wie kämpfen, springen, sprinten, usw. verringern die Hungerpunkte +• Food restores hunger points=• Nahrung erhöht die Hungerpunkte +• If your hunger bar decreases, you're hungry=• Wenn sich Ihre Hungerleiste verringert, sind Sie hungrig +• At 18-20 hunger points, you regenerate 1 HP every 4 seconds=• Bei 18-20 Hungerpunkten erhalten Sie 1 TP alle 4 Sekunden +• At 6 hunger points or less, you can't sprint=• Bei 6 Hungerpunkten oder weniger können Sie nicht sprinten +• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)=• Bei 0 Hungerpunkten verlieren Sie 1 TP alle 4 Sekunden (bis nur 1 TP bleibt) +• Poisonous food decreases your health=• Giftige oder verpestete Nahrung verringert Ihre Gesundheit +Details:=Details: +You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.=Sie haben 0-20 Hungerpunkte, was durch 20 Fleischkeulen-Halbsymbole über der Schnellleiste dargestellt wird. +Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.=Hungerpunkte reflektieren, wie satt Sie sind, während Sättigung reflektiert, wie lange es noch braucht, bis Sie wieder hungrig sind. +Each food item increases both your hunger level as well your saturation.=Jedes Lebensmittel erhöht Ihre Hunger- als auch Ihre Sättigungspunkte. +Food with a high saturation boost has the advantage that it will take longer until you get hungry again.=Nahrung mit einer hohen Sättigung hat den Vorteil, dass es länger dauern wird, bis Sie wieder hungrig sind. +A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.=Ein paar Lebensmittel können eine Lebensmittelvergiftung verursachen. Wenn Sie vergiftet sind, werden die Gesundheits- und Hungersymbole eine ungesund grüne Farbe annehmen. Die Lebensmittelvergiftung verringert Ihre Gesundheit um 1 TP pro Sekunde, bis nur noch 1 TP verbleibt. Eine Lebensmittelvergiftung reduziert auch Ihre Sättigung. Eine Lebensmittelvergiftung vergeht nach einer Weile, oder, wenn Sie Milch trinken. +You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.=Sie beginnen mit 5 Sättigungspunkten. Ihre höchstmögliche Sättigung ist gleich der Anzahl Ihrer Hungerpunkte. Wenn Sie also 20 Hungerpunkte haben, ist Ihre höchstmögliche Sättigung 20. Das bedeutet, dass Lebensmittel mit einer hohen Sättigung effektiver sind, je mehr Hungerpunkte Sie haben. Das ist deshalb so, weil bei wenigen Hungerpunkten ein Großteil des Sättigungsbonus aufgrund der niedrigen Maximalsättigung verloren gehen wird. +If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.=Wenn Ihre Sättigung 0 erreicht, haben Sie Hunger und werden allmählich Hungerpunkte verlieren. Wenn Sie sehen, dass die Hungerleiste sich verringert, ist es ein guter Zeitpunkt, etwas zu essen. +Saturation decreases by doing things which exhaust you (highest exhaustion first):=Die Sättigung verringert sich, wenn Sie Dinge tun, die Sie erschöpfen (höchste Erschöpfung zuerst): +• Regenerating 1 HP=• 1 TP regenerieren +• Suffering food poisoning=• Lebensmittelvergiftung erleiden +• Sprint-jumping=• Beim Sprinten springen +• Sprinting=• Sprinten +• Attacking=• Angreifen +• Taking damage=• Schaden nehmen +• Swimming=• Schwimmen +• Jumping=• Springen +• Mining a block=• Einen Block abbauen +Other actions, like walking, do not exaust you.=Andere Aktionen, wie gehen, erschöpfen Sie nicht. +If you have a map item in any of your hotbar slots, you can use the minimap.=Wenn Sie eine Karte in einem beliebigen Platz der Schnellleiste haben, können Sie die Übersichtskarte benutzen. diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr new file mode 100644 index 00000000..d6edcfb6 --- /dev/null +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr @@ -0,0 +1,511 @@ +# textdomain: mcl_doc_basics +Basics=Les bases +Everything you need to know to get started with playing=Tout ce que vous devez savoir pour commencer à jouer +Advanced usage=Utilisation avancée +Advanced information which may be nice to know, but is not crucial to gameplay=Informations avancées qui peuvent être agréables à connaître, mais qui ne sont pas cruciales pour le gameplay +Quick start=Démarrage rapide +This is a very brief introduction to the basic gameplay:=Voici une très brève introduction au gameplay de base: +Basic controls:=Contrôles de base: +• Move mouse to look=• Déplacez la souris pour regarder +• [W], [A], [S] and [D] to move=• [W], [A], [S] and [D] to move +• [E] to sprint=• [E] pour sprinter +• [Space] to jump or move upwards=• [Espace] pour sauter ou se déplacer vers le haut +• [Shift] to sneak or move downwards=• [Shift] pour se faufiler ou se déplacer vers le bas +• Mouse wheel or [1]-[9] to select item=• Molette de la souris ou [1] - [9] pour sélectionner l'élément +• Left-click to mine blocks or attack=• Clic gauche pour miner des blocs ou attaquer +• Recover from swings to deal full damage=• Attendez les virages pour faire des dégâts complets +• Right-click to build blocks and use things=• Clic droit pour construire des blocs et utiliser des choses +• [I] for the inventory=• [I] pour l'inventaire +• First items in inventory appear in hotbar below=• Les premiers éléments de l'inventaire apparaissent dans la barre de raccourci ci-dessous +• Lowest row in inventory appears in hotbar below=• La ligne la plus basse de l'inventaire apparaît dans la barre d'outils ci-dessous +• [Esc] to close this window=• [Esc] pour fermer cette fenêtre +How to play:=Comment jouer: +• Punch a tree trunk until it breaks and collect wood=• Frappez un tronc d'arbre jusqu'à ce qu'il se brise et ramassez du bois +• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Placez le bois dans la grille 2×2 (votre "grille d'établi") dans votre menu d'inventaire et fabriquez 4 planches de bois +• Place them in a 2×2 shape in the crafting grid to craft a crafting table=• Placez-les dans une forme 2×2 dans la grille de fabrication pour créer un établi +• Place the crafting table on the ground=• Placez l'établi sur le sol +• Rightclick it for a 3×3 crafting grid=• Faites un clic droit dessus pour une grille de fabrication 3×3 +• Use the crafting guide (book icon) to learn all the possible crafting recipes=• Utilisez le guide d'artisanat (icône du livre) pour apprendre toutes les recettes de fabrication possibles +• Craft a wooden pickaxe so you can dig stone=• Fabriquez une pioche en bois pour creuser la pierre +• Different tools break different kinds of blocks. Try them out!=• Différents outils cassent différents types de blocs. Essayez-les! +• Read entries in this help to learn the rest=• Lisez les entrées de cette aide pour apprendre le reste +• Continue playing as you wish. There's no goal. Have fun!=• Continuez à jouer comme vous le souhaitez. Il n'y a aucun but. Amuser vous! +Minetest=Minetest +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Minetest est un moteur de jeu logiciel gratuit pour les jeux basés sur le gameplay voxel, inspiré d'InfiniMiner, Minecraft, etc. Minetest a été créé à l'origine par Perttu Ahola (alias «celeron55»). +The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.=Le joueur est jeté dans un monde immense fait de cubes ou de blocs. Ces cubes font généralement le paysage qu'ils blocs peuvent être enlevés et placés presque entièrement librement. En utilisant les objets collectés, de nouveaux outils et autres objets peuvent être fabriqués. Les jeux dans Minetest peuvent cependant être beaucoup plus complexes que cela. +A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Une caractéristique essentielle de Minetest est la capacité de modding intégrée. Les mods modifient le gameplay existant. Ils peuvent être aussi simples que l'ajout de quelques blocs décoratifs ou être très complexes par ex. introduisant des concepts de gameplay complètement nouveaux, générant un type de monde complètement différent, et bien d'autres choses. +Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=Minetest peut être joué seul ou en ligne avec plusieurs joueurs. Le jeu en ligne fonctionnera immédiatement avec tous les mods, sans avoir besoin de logiciels supplémentaires car ils sont entièrement fournis par le serveur. +Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Minetest est généralement fourni avec un jeu par défaut simple, nommé «Minetest Game» (illustré dans les images 1 et 2). Vous l'avez probablement déjà. D'autres jeux pour Minetest peuvent être téléchargés à partir des forums officiels Minetest . +Minetest as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly.=Minetest ainsi que Minetest Game sont tous deux inachevés pour le moment, alors veuillez nous pardonner quand tout ne fonctionne pas parfaitement. +Sneaking=Se faufiler +Sneaking makes you walk slower and prevents you from falling off the edge of a block.=Se faufiler vous fait marcher plus lentement et vous empêche de tomber du bord d'un bloc. +To sneak, hold down the sneak key (default: [Shift]). When you release it, you stop sneaking. Careful: When you release the sneak key at a ledge, you might fall!=Pour vous faufiler, maintenez enfoncée la touche furtive (par défaut: [Shift]). Lorsque vous le relâchez, vous arrêtez de vous faufiler. Attention: lorsque vous relâchez la touche furtive sur un rebord, vous risquez de tomber! +• Sneak: [Shift]=• Se faufiler: [Shift] +Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.=Se faufiler ne fonctionne que lorsque vous vous tenez sur un sol solide, pas dans un liquide et ne grimpez pas. +If you jump while holding the sneak key, you also jump slightly higher than usual.=Si vous sautez tout en maintenant la touche furtive, vous sautez également légèrement plus haut que d'habitude. +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.=Le faufilement peut être désactivé par les mods. Dans ce cas, vous marchez toujours plus lentement en vous faufilant, mais vous ne serez plus arrêté aux rebords. +Controls=Les contrôles +These are the default controls:=Ce sont les contrôles par défaut: +Basic movement:=Mouvement de base: +• Moving the mouse around: Look around=• Déplacer la souris: regardez autour +• W: Move forwards=• W: Avancer +• A: Move to the left=• A: Déplacer vers la gauche +• D: Move to the right=• D: Déplacer vers la droite +• S: Move backwards=• S: Reculer +• E: Sprint=• E: Courrir +While standing on solid ground:=En position debout sur un sol solide: +• Space: Jump=• Espace: Sauter +• Shift: Sneak=• Shift: Faufiler +While on a ladder, swimming in a liquid or fly mode is active=Sur une échelle, nager dans un liquide ou le mode voler est actif +• Space: Move up=• Espace: Monter +• Shift: Move down=• Shift: Descendre +Extended movement (requires privileges):=Déplacement étendu (nécessite des privilèges): +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)=• J: Basculer en mode rapide, vous permet de courir ou de voler rapidement (nécessite le privilège "fast") +• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)=• K: Basculer en mode vol, vous permet de vous déplacer librement dans toutes les directions (nécessite le privilège "fly") +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)=• H: Bascule le mode noclip, vous fait passer à travers les murs en mode vol (nécessite le privilège "noclip") +• E: Move even faster when in fast mode=• E: Déplacez-vous encore plus rapidement en mode rapide +• E: Walk fast in fast mode=• E: Marchez vite en mode rapide +World interaction:=Interaction avec le monde: +• Left mouse button: Punch / mine blocks / take items=• Bouton gauche de la souris: Perforer / miner des blocs / prendre des objets +• Left mouse button: Punch / mine blocks=• Bouton gauche de la souris: Perforer / miner des blocs +• Right mouse button: Build or use pointed block=• Bouton droit de la souris: Créer ou utiliser un bloc pointu +• Shift+Right mouse button: Build=• Shift+Bouton droit de la souris: Construire +• Roll mouse wheel: Select next/previous item in hotbar=• Molette de la souris: Sélectionnez l'élément suivant / précédent dans la barre active +• Roll mouse wheel / B / N: Select next/previous item in hotbar=• Faites rouler la molette de la souris / B / N: Sélectionnez l'élément suivant / précédent dans la barre de raccourci +• 1-9: Select item in hotbar directly=• 1-9: sélectionnez directement l'élément dans la barre de raccourci +• Q: Drop item stack=• Q: Déposer la pile d'objets +• Shift+Q: Drop 1 item=• Shift+Q: Déposer 1 élément +• I: Show/hide inventory menu=• I: Afficher/masquer le menu d'inventaire +Inventory interaction:=Interaction d'inventaire: +See the entry “Basics > Inventory”.=Voir l'entrée «Bases> Inventaire». +Camera:=Caméra: +• Z: Zoom=• Z: Zoom +• F7: Toggle camera mode=• F7: Bascule le mode caméra +• F8: Toggle cinematic mode=• F8: Basculer le mode cinématique +Interface:=Interface: +• Esc: Open menu window (pauses in single-player mode) or close window=• Esc: Ouvrir la fenêtre du menu (fait une pause en mode solo) ou fermer la fenêtre +• F1: Show/hide HUD=• F1: Afficher/masquer le HUD +• F2: Show/hide chat=• F2: Afficher/masquer le chat +• F9: Toggle minimap=• F9: Basculer la mini-carte +• Shift+F9: Toggle minimap rotation mode=• Shift+F9: Bascule le mode de rotation de la mini-carte +• F10: Open/close console/chat log=• F10: Ouvrir/fermer la console/journal de chat +• F12: Take a screenshot=• F12: Prendre une capture d'écran +Server interaction:=Interaction avec le serveur: +• T: Open chat window (chat requires the “shout” privilege)=• T: Ouvrir la fenêtre de discussion (la discussion nécessite le privilège "shout") +• /: Start issuing a server command=• /: Lancer l'émission d'une commande serveur +Technical:=Technique: +• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)=• R: Basculer la vue éloignée (désactive tout le brouillard et permet une visualisation éloignée, peut rendre le jeu très lent) +• +: Increase minimal viewing distance=• +: Augmentez la distance de visionnement minimale +• -: Decrease minimal viewing distance=• -: Diminue la distance de visionnement minimale +• F3: Enable/disable fog=• F3: Activer/désactiver le brouillard +• F5: Enable/disable debug screen which also shows your coordinates=• F5: Activer / désactiver l'écran de débogage qui affiche également vos coordonnées +• F6: Only useful for developers. Enables/disables profiler=• F6: utile uniquement pour les développeurs. Active/désactive le profileur +• P: Only useful for developers. Writes current stack traces=• P: utile uniquement pour les développeurs. Écrit les traces de pile actuelles +Players=Joueurs +Players (actually: “player characters”) are the characters which users control.=Les joueurs (en fait: "personnages joueurs") sont les personnages que les utilisateurs contrôlent. +Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).=Les joueurs sont des êtres vivants. Ils commencent par un certain nombre de points de vie (PV) et un certain nombre de points de respiration (BP). +Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.=Les joueurs sont capables de marcher, se faufiler, sauter, grimper, nager, plonger, exploiter, construire, se battre et utiliser des outils et des blocs. +Players can take damage for a variety of reasons, here are some:=Les joueurs peuvent subir des dégâts pour diverses raisons, en voici quelques-unes: +• Taking fall damage=• Prendre des dégâts de chute +• Touching a block which causes direct damage=• Toucher un bloc qui cause des dommages directs +• Drowning=• Noyade +• Being attacked by another player=• Être attaqué par un autre joueur +• Being attacked by a computer enemy=• Être attaqué par un ennemi informatique +At a health of 0, the player dies. The player can just respawn in the world.=À une santé de 0, le joueur meurt. Le joueur peut simplement réapparaître dans le monde. +Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.=Les autres conséquences de la mort dépendent du jeu. Le joueur pourrait perdre tous les objets ou perdre la manche dans une partie compétitive. +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.=Certains blocs réduisent la respiration. Tout en étant avec la tête dans un bloc qui provoque la noyade, les points de respiration sont réduits de 1 toutes les 2 secondes. Quand tout le souffle est parti, le joueur commence à subir des dégâts de noyade. Le souffle est rapidement rétabli dans tout autre bloc. +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.=Les dégâts peuvent être désactivés sur n'importe quel monde. Sans dégâts, les joueurs sont immortels et la santé et le souffle sont sans importance. +In multi-player mode, the name of other players is written above their head.=En mode multi-joueurs, le nom des autres joueurs est écrit au-dessus de leur tête. +Items=Objects +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.=Les objets sont des choses que vous pouvez emporter et stocker dans des inventaires. Ils peuvent être utilisés pour l'artisanat, la fusion, la construction, l'exploitation minière, etc. Les types d'objets comprennent des blocs, des outils, des armes et des objets uniquement utilisés pour l'artisanat. +An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.=Une pile d'objets est une collection d'objets du même type qui tient dans un seul emplacement d'objet. Les piles d'objets peuvent être déposées au sol. Les objets qui tombent dans les mêmes coordonnées formeront une pile d'objets. +Items have several properties, including the following:=Les éléments ont plusieurs propriétés, notamment les suivantes: +• Maximum stack size: Number of items which fit on 1 item stack=• Taille maximale de la pile: Nombre d'articles pouvant tenir sur une pile d'articles +• Pointing range: How close things must be to be pointed while wielding this item=• Plage de pointage: A quelle distance les choses doivent être pointées lorsque vous maniez cet objet +• Group memberships: See “Basics > Groups”=• Appartenance à un groupe: Voir "Général> Groupes" +• May be used for crafting or cooking=• Peut être utilisé pour l'artisanat ou la cuisine +Dropped item stacks will be collected automatically when you stand close to them.=Les piles d'objets déposés seront collectées automatiquement lorsque vous vous tenez près d'eux. +Tools=Outils +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Certains articles peuvent servir d'outil lorsqu'ils sont utilisés. Tout objet ayant une utilité particulière pouvant être directement utilisé par son porteur est considéré comme un outil. +When nothing is wielded, players use their hand which may act as tool and weapon.=Quand rien n'est manié, les joueurs utilisent leur main qui peut servir d'outil et d'arme. +A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Un sous-ensemble d'outils sont les outils de minage. Ceux-ci sont importants pour casser toutes sortes de blocs. Les armes sont une sorte d'outil. Il existe bien sûr de nombreux autres outils possibles. Les actions spéciales des outils sont généralement effectuées par un clic gauche ou un clic droit. +Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.=Les outils miniers sont importants pour briser toutes sortes de blocs. Les armes sont un autre type d'outil. Il existe d'autres outils plus spécialisés. Les actions spéciales des outils sont généralement effectuées par un clic droit. +When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.=Quand rien n'est manié, les joueurs utilisent leur main qui peut servir d'outil et d'arme. La main est capable de poinçonner et inflige un minimum de dégâts. +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=De nombreux outils s'usent lors de leur utilisation et peuvent éventuellement être détruits. Les dégâts sont affichés dans une barre de dégâts sous l'icône de l'outil. Si aucune barre de dommage n'est affichée, l'outil est en parfait état. Les outils peuvent être réparables par artisanat, voir «Bases> Artisanat». +Weapons=Armes +Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.=Certains objets sont utilisables comme arme de mêlée lorsqu'ils sont utilisés. Les armes partagent la plupart des propriétés des outils. +Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:=Les armes de mêlée infligent des dégâts en frappant les joueurs et d'autres objets animés. Il y a deux façons d'attaquer: +• Single punch: Left-click once to deal a single punch=• Coup de poing unique: Cliquez une fois avec le bouton gauche pour traiter un coup de poing +• Quick punching: Hold down the left mouse button to deal quick repeated punches=• Poinçonnage rapide: Maintenez le bouton gauche de la souris enfoncé pour effectuer des coups de poing répétés rapidement +There are two core attributes of melee weapons:=Il y a deux attributs principaux des armes de mêlée: +• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered=• Dégâts maximum: Dégâts qui sont infligés après un coup lorsque l'arme a été complètement récupérée +• Full punch interval: Time it takes for fully recovering from a punch=• Intervalle de poinçonnage complet: temps nécessaire pour récupérer complètement d'un poinçon +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Une arme n'inflige des dégâts complets que lorsqu'elle a complètement récupéré d'un coup de poing précédent. Sinon, l'arme n'infligera que des dégâts réduits. Cela signifie que le poinçonnage rapide est très rapide, mais inflige également des dégâts plutôt faibles. Notez que l'intervalle de punch complet ne limite pas la vitesse à laquelle vous pouvez attaquer. +There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.=Il existe une règle qui rend parfois les attaques impossibles: les joueurs, les objets animés et les armes appartiennent à des groupes de dégâts. Une arme inflige uniquement des dégâts à ceux qui partagent au moins un groupe de dégâts avec elle. Donc, si vous utilisez la mauvaise arme, vous pourriez ne pas infliger de dégâts du tout. +Pointing=Pointage +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.="Pointage" signifie regarder quelque chose à portée avec le réticule. Le pointage est nécessaire pour l'interaction, comme l'extraction, le poinçonnage, l'utilisation, etc. +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Pour pointer quelque chose, il doit se trouver dans la plage de pointage (également appelée simplement "plage") de votre objet brandi. Il y a une plage par défaut lorsque vous ne maniez rien. Une chose pointue sera soulignée ou mise en évidence (en fonction de vos paramètres). Le pointage n'est pas possible avec la caméra frontale à la 3ème personne. +A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.=Certaines choses ne peuvent pas être signalées. La plupart des blocs sont pointables. Quelques blocs, comme l'air, ne peuvent jamais être pointés. D'autres blocs, comme les liquides, ne peuvent être pointés que par des objets spéciaux. +Camera=Caméra +There are 3 different views which determine the way you see the world. The modes are:=Il y a 3 vues différentes qui déterminent la façon dont vous voyez le monde. Les modes sont: +• 1: First-person view (default)=• 1: Vue à la première personne (par défaut) +• 2: Third-person view from behind=• 2: Vue à la troisième personne par derrière +• 3: Third-person view from the front=• 3: Vue à la troisième personne de face +You can change the camera mode by pressing [F7].=Vous pouvez changer le mode de l'appareil photo en appuyant sur [F7]. +You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.=Vous pourrez peut-être zoomer avec [Z] pour zoomer la vue sur le réticule. Cela vous permet de regarder plus loin. +Zooming is a gameplay feature that might be enabled or disabled by the game. By default, zooming is enabled when in Creative Mode but disabled otherwise.=Le zoom est une fonctionnalité de gameplay qui peut être activée ou désactivée par le jeu. Par défaut, le zoom est activé en mode créatif mais désactivé dans le cas contraire. +There is also Cinematic Mode which can be toggled with [F8]. With Cinematic Mode enabled, the camera movements become more smooth. Some players don't like it, it is a matter of taste.=Il y a aussi le mode cinématique qui peut être basculé avec [F8]. Lorsque le mode cinématique est activé, les mouvements de la caméra deviennent plus fluides. Certains joueurs ne l'aiment pas, c'est une question de goût. +By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.=En maintenant [Z] enfoncé, vous pouvez agrandir la vue sur votre réticule. Vous avez besoin du privilège "zoom" pour ce faire. +• Switch camera mode: [F7]=• Changer le mode de l'appareil photo: [F7] +• Toggle Cinematic Mode: [F8]=• Basculer le mode cinématique: [F8] +• Zoom: [Z]=• Zoom: [Z] +Blocks=Blocs +The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Le monde de MineClone 2 est entièrement constitué de blocs (voxels, pour être précis). Les blocs peuvent être ajoutés ou supprimés avec les bons outils. +The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Le monde est entièrement fait de blocs (voxels, pour être précis). Les blocs peuvent être ajoutés ou supprimés avec les bons outils. +Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:=Les blocs peuvent avoir un large éventail de propriétés différentes qui déterminent les temps d'exploration, le comportement, l'apparence, la forme et bien plus encore. Leurs propriétés comprennent: +• Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely=• Collidable: les blocs collidables ne peuvent pas être traversés; les joueurs peuvent marcher dessus. Les blocs non collidables peuvent passer librement +• Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools=• Pointable: les blocs pointables affichent un filaire ou une boîte de halo lorsqu'ils sont pointés. Mais vous pointerez simplement à travers des blocs non pointables. Les liquides sont généralement non pointables mais ils peuvent être pointés par certains outils spéciaux +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools=• Propriétés minières: par quels outils il peut être extrait, à quelle vitesse et combien il s'use +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys=• Grimpable: Pendant que vous êtes sur un bloc grimpable, vous ne tomberez pas et vous pouvez vous déplacer de haut en bas avec les touches de saut et de furtivité +• Drowning damage: See the entry “Basics > Player”=• Dommages liés à la noyade: voir l'entrée "Bases> Joueur" +• Liquids: See the entry “Basics > Liquids”=• Liquides: voir l'entrée "Bases> Liquides" +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more=• Appartenances aux groupes: les appartenances aux groupes sont utilisées pour déterminer les propriétés minières, l'artisanat, les interactions entre les blocs, etc. +Mining=Exploitation minière +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=L'exploitation minière (ou creuser) est le processus de rupture des blocs pour les retirer. Pour extraire un bloc, pointez-le et maintenez enfoncé le bouton gauche de la souris jusqu'à ce qu'il se casse. +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.=Les blocs nécessitent un outil de minage pour être minés. Différents blocs sont extraits par différents outils d'exploration de données, et certains blocs ne peuvent être extraits par aucun outil. Les blocs varient en dureté et les outils varient en résistance. Les outils miniers s'useront avec le temps. Le temps d'extraction et l'usure de l'outil dépendent du bloc et de l'outil d'extraction. Le moyen le plus rapide de découvrir l'efficacité de vos outils d'exploration est simplement de les essayer sur différents blocs. Tous les objets que vous récupérez par extraction tomberont au sol, prêts à être récupérés. +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=Après l'extraction, un bloc peut laisser une «goutte» derrière. Il s'agit d'un certain nombre d'objets que vous obtenez après l'extraction. Le plus souvent, vous obtiendrez le bloc lui-même. Il existe d'autres possibilités de suppression qui dépendent du type de bloc. Les baisses suivantes sont possibles: +• Always drops itself (the usual case)=• Se laisse toujours tomber (le cas habituel) +• Always drops the same items=• Dépose toujours les mêmes articles +• Drops items based on probability=• Supprime les éléments en fonction de la probabilité +• Drops nothing=• Ne laisse tomber rien +Building=Construire +Almost all blocks can be built (or placed). Building is very simple and has no delay.=Presque tous les blocs peuvent être construits (ou placés). La construction est très simple et n'a pas de retard. +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.=Pour construire votre bloc brandi, pointez sur un bloc dans le monde et faites un clic droit. Si cela n'est pas possible car le bloc pointé a une action spéciale de clic droit, maintenez la touche furtive avant de cliquer avec le bouton droit. +Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.=Les blocs peuvent presque toujours être construits sur des blocs pointables. Une exception est les blocs attachés au sol; ceux-ci ne peuvent être construits que sur le sol. +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.=Normalement, les blocs sont construits devant le côté pointu du bloc pointu. Quelques blocs sont différents: lorsque vous essayez de les construire, ils sont remplacés. +Liquids=Liquides +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.=Les liquides sont des blocs dynamiques spéciaux. Les liquides aiment se propager et s'écouler vers leurs blocs environnants. Les joueurs peuvent nager et se noyer en eux. +Liquids usually come in two forms: In source form (S) and in flowing form (F).=Les liquides se présentent généralement sous deux formes: sous forme source (S) et sous forme fluide (F). +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.=Les sources liquides ont la forme d'un cube plein. Une source de liquide génère de temps à autre des liquides qui coulent autour d'elle et, si le liquide est renouvelable, elle génère également des sources de liquide. Une source liquide peut se maintenir. Tant qu'elle est laissée seule, une source liquide gardera normalement sa place et ne s'écoulera pas. +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.=Les liquides qui coulent prennent une forme inclinée. Les liquides qui coulent se répandent dans le monde jusqu'à ce qu'ils s'écoulent. Un liquide qui coule ne peut pas subvenir à ses besoins et provient toujours d'une source de liquide, directement ou indirectement. Sans source de liquide, un liquide qui s'écoule finira par s'écouler et disparaître. +All liquids share the following properties:=Tous les liquides partagent les propriétés suivantes: +• All properties of blocks (including drowning damage)=• Toutes les propriétés des blocs (y compris les dégâts de noyade) +• Renewability: Renewable liquids can create new sources=• Renouvelabilité: les liquides renouvelables peuvent créer de nouvelles sources +• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2=• Plage d'écoulement: le nombre de liquides qui s'écoulent au maximum par source de liquide détermine la distance de propagation du liquide. Les plages possibles sont comprises entre 0 et 8. À 0, aucun liquide ne sera créé. L'image 5 montre un liquide de gamme fluide 2 +• Viscosity: How slow players move through it and how slow the liquid spreads=• Viscosité: la vitesse à laquelle les joueurs se déplacent et la vitesse de propagation du liquide +Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:=Les liquides renouvelables créent de nouvelles sources de liquide dans les espaces ouverts (image 2). Une nouvelle source de liquide est créée lorsque: +• Two renewable liquid blocks of the same type touch each other diagonally=• Deux blocs liquides renouvelables du même type se touchent en diagonale +• These blocks are also on the same height=• Ces blocs sont également à la même hauteur +• One of the two “corners” is open space which allows liquids to flow in=• L'un des deux «coins» est un espace ouvert qui permet aux liquides de s'écouler +When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).=Lorsque ces critères sont remplis, l'espace ouvert est rempli d'une nouvelle source de liquide du même type (image 3). +Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.=Nager dans un liquide est assez simple: les touches de direction habituelles pour les mouvements de base, la touche de saut pour la montée et la touche furtive pour le naufrage. +The physics for swimming and diving in a liquid are:=La physique pour nager et plonger dans un liquide est: +• The higher the viscosity, the slower you move=• Plus la viscosité est élevée, plus vous vous déplacez lentement +• If you rest, you'll slowly sink=• Si vous vous reposez, vous coulerez lentement +• There is no fall damage for falling into a liquid as such=• Il n'y a aucun dommage de chute pour tomber dans un liquide en tant que tel +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage=• Si vous tombez dans un liquide, vous serez ralenti à l'impact (mais ne vous arrêtez pas instantanément). Votre profondeur d'impact est déterminée par votre vitesse et la viscosité du liquide. Pour une chute élevée et sûre dans un liquide, assurez-vous qu'il y a suffisamment de liquide au-dessus du sol, sinon vous pourriez toucher le sol et subir des dommages de chute +Liquids are often not pointable. But some special items are able to point all liquids.=Les liquides sont souvent inutiles. Mais certains objets spéciaux sont capables de pointer tous les liquides. +Crafting=Artisanat +Crafting is the task of combining several items to form a new item.=L'artisanat consiste à combiner plusieurs éléments pour former un nouvel élément. +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.=Pour fabriquer quelque chose, vous avez besoin d'un ou plusieurs objets, d'une grille de fabrication (C) et d'une recette de fabrication. Une grille d'artisanat est comme un inventaire normal qui peut également être utilisé pour l'artisanat. Les objets doivent être placés selon un certain modèle dans la grille de fabrication. À côté de la grille de fabrication se trouve un emplacement de sortie (O). Ici, le résultat apparaîtra lorsque vous aurez placé les objets correctement. Ceci n'est qu'un aperçu, pas l'élément réel. Les grilles de fabrication peuvent être de différentes tailles, ce qui limite les recettes possibles que vous pouvez créer. +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.=Pour terminer le métier, prenez l'objet résultant de l'emplacement de sortie, qui consommera des objets de la grille de fabrication et créera un nouvel objet. Il n'est pas possible de placer des éléments dans la fente de sortie. +A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).=Une description sur la façon de fabriquer un objet est appelée "recette d'artisanat". Vous avez besoin de ces connaissances pour créer. Il existe plusieurs façons d'apprendre des recettes d'artisanat. Une façon consiste à utiliser un guide d'artisanat, qui contient une liste des recettes d'artisanat disponibles. Certains jeux proposent des guides d'artisanat. Il existe également des mods que vous pouvez télécharger en ligne pour installer un guide d'artisanat. Une autre façon consiste à lire le manuel en ligne du jeu (s'il en existe un). +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.=Les recettes d'artisanat consistent en au moins un élément d'entrée et exactement une pile d'éléments de sortie. Lors de l'exécution d'un seul métier, il consommera exactement un objet de chaque pile de la grille de fabrication, à moins que la recette de fabrication ne définisse des remplacements. +There are multiple types of crafting recipes:=Il existe plusieurs types de recettes d'artisanat: +• Shaped (image 2): Items need to be placed in a particular shape=• En forme (image 2): Les articles doivent être placés dans une forme particulière +• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)=• Sans forme (images 3 et 4): Les éléments doivent être placés quelque part dans l'entrée (les deux images montrent la même recette) +• Cooking: Explained in “Basics > Cooking”=• Cuisine: expliquée dans "Bases> Cuisine" +• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%=• Réparation (image 5): Placez deux outils endommagés dans la grille d'artisanat n'importe où pour obtenir un outil qui est réparé de 5% +In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.=Dans certaines recettes d'artisanat, certains éléments d'entrée n'ont pas besoin d'être un élément concret, ils doivent plutôt être membres d'un groupe (voir "Bases> Groupes"). Ces recettes offrent un peu plus de liberté dans les éléments d'entrée. Les images 6-8 montrent la même recette de groupe. Ici, 8 éléments du groupe "pierre" sont requis, ce qui est vrai pour tous les éléments affichés. +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.=Rarement, les recettes d'artisanat ont des remplacements. Cela signifie que chaque fois que vous effectuez un métier, certains objets de la grille de fabrication ne seront pas consommés, mais seront remplacés à la place par un autre objet. +Cooking=Cuisine +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.=La cuisson (ou la fonte) est une forme d'artisanat qui n'implique pas de grille d'artisanat. La cuisson se fait avec un bloc spécial (comme un four), un article à cuire, un article à combustible et du temps afin de produire un nouvel article. +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.=Chaque élément combustible a une durée de combustion. C'est le moment où un seul élément du combustible continue de brûler un four. +Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.=Chaque élément pouvant être cuit nécessite du temps pour être cuit. Cette durée est spécifique au type d'élément et l'élément doit être «en feu» pendant tout le temps de cuisson pour donner réellement le résultat. +Hotbar=Hotbar +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.=Au bas de l'écran, vous voyez des carrés. C'est ce qu'on appelle la "hotbar". La barre d'accès vous permet d'accéder rapidement aux premiers éléments de votre inventaire de joueur. +You can change the selected item with the mouse wheel or the keyboard.=Vous pouvez modifier l'élément sélectionné avec la molette de la souris ou le clavier. +• Select previous item in hotbar: [Mouse wheel up] or [B]=• Sélectionnez l'élément précédent dans la hotbar: [Molette de la souris vers le haut] ou [B] +• Select next item in hotbar: [Mouse wheel down] or [N]=• Sélectionnez l'élément suivant dans la hotbar: [Molette de la souris vers le bas] ou [N] +• Select item in hotbar directly: [1]-[9]=• Sélectionnez l'élément dans la hotbar directement: [1]-[9] +The selected item is also your wielded item.=L'élément sélectionné est également votre élément brandi. +Minimap=Mini-carte +If you have a map item in any of your hotbar slots, you can use the minimap.=Si vous avez un élément de carte dans l'un de vos emplacements de hotbar vous pouvez utiliser la minicarte. +Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.=Appuyez sur [F9] pour faire apparaître une mini-carte en haut à droite. La mini-carte vous aide à trouver votre chemin dans le monde. Appuyez à nouveau pour sélectionner différents modes de minicarte et niveaux de zoom. La mini-carte montre également les positions des autres joueurs. +There are 2 minimap modes and 3 zoom levels.=Il existe 2 modes de minicarte et 3 niveaux de zoom. +Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.=Le mode surface (image 1) est une vue de haut en bas du monde, ressemblant à peu près aux couleurs des blocs dont ce monde est fait. Il ne montre que les blocs les plus hauts, tout ce qui suit est caché, comme une photo satellite. Le mode Surface est utile si vous vous êtes perdu. +Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon.=Le mode radar (image 2) est plus compliqué. Il affiche la «densité» de la zone autour de vous et change avec votre taille. En gros, plus une zone est verte, moins elle est «dense». Les zones noires ont de nombreux blocs. Utilisez le radar pour trouver des cavernes, des zones cachées, des murs et plus encore. Les formes rectangulaires de l'image 2 révèlent clairement la position d'un donjon. +There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.=Il existe également deux modes de rotation différents. En "mode carré", la rotation de la minicarte est fixe. Si vous appuyez sur [Shift] + [F9] pour passer en "mode cercle", la minicarte tournera à la place avec votre direction de recherche, donc "haut" est toujours votre direction de recherche. +In some games, the minimap may be disabled.=Dans certains jeux, la minicarte peut être désactivée. +• Toggle minimap mode: [F9]=• Basculer le mode mini-carte: [F9] +• Toggle minimap rotation mode: [Shift]+[F9]=• Basculer le mode de rotation de la mini-carte: [Shift]+[F9] +Inventory=Inventaire +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.=Les stocks sont utilisés pour stocker des piles d'articles. Il existe d'autres utilisations, telles que l'artisanat. Un inventaire se compose d'une grille rectangulaire d'emplacements d'objets. Chaque emplacement d'objet peut être vide ou contenir une pile d'objets. Les piles d'objets peuvent être déplacées librement entre la plupart des emplacements. +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.=Vous avez votre propre inventaire qui s'appelle votre "inventaire de joueur", vous pouvez l'ouvrir avec la clé d'inventaire (par défaut: [I]). Les premiers emplacements d'inventaire sont également utilisés comme emplacements dans votre hotbar. +Blocks can also have their own inventory, e.g. chests and furnaces.=Les blocs peuvent également avoir leur propre inventaire, par exemple coffres et fours. +Inventory controls:=Contrôles d'inventaire: +Taking: You can take items from an occupied slot if the cursor holds nothing.=Prendre: vous pouvez prendre des objets dans un emplacement occupé si le curseur ne contient rien. +• Left click: take entire item stack=• Clic gauche: Prendre toute la pile d'objets +• Right click: take half from the item stack (rounded up)=• Clic droit: Prendre la moitié de la pile d'objets (arrondi vers le haut) +• Middle click: take 10 items from the item stack=• Clic du milieu: Prenez 10 objets de la pile d'objets +• Mouse wheel down: take 1 item from the item stack=• Molette de la souris vers le bas: Prenez 1 objet de la pile d'objets +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.=Placer: Vous pouvez placer des objets dans un emplacement si le curseur contient un ou plusieurs objets et que l'emplacement est vide ou contient une pile d'objets du même type d'objet. +• Left click: put entire item stack=• Clic gauche: Mettre toute la pile d'objets +• Right click: put 1 item of the item stack=• Clic droit: Mettre 1 élément de la pile d'objets +• Right click or mouse wheel up: put 1 item of the item stack=• Clic droit ou roulette de la souris vers le haut: Placez 1 article dans la pile d'objets +• Middle click: put 10 items of the item stack=• Clic du milieu: Mettez 10 objets dans la pile d'objets +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.=Échange: vous pouvez échanger des objets si le curseur contient un ou plusieurs objets et que l'emplacement de destination est occupé par un type d'objet différent. +• Click: exchange item stacks=• Cliquez: Echangez les piles d'articles +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.=Jeter: Si vous maintenez une pile d'objets et cliquez avec elle quelque part en dehors du menu, la pile d'objets est jetée dans l'environnement. +Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.=Transfert rapide: vous pouvez rapidement transférer une pile d'objets vers / depuis l'inventaire du joueur vers / depuis l'emplacement d'inventaire d'un autre objet comme un four, un coffre ou tout autre élément avec un emplacement d'inventaire lorsque l'inventaire de cet article est accessible. L'inventaire cible est généralement l'inventaire le plus pertinent dans ce contexte. +• Sneak+Left click: Automatically transfer item stack=• Faufiler+clic gauche: transférer automatiquement la pile d'objets +Online help=Aide en ligne +You may want to check out these online resources related to MineClone 2.=Vous voudrez peut-être consulter ces ressources en ligne liées à MineClone 2. +MineClone 2 download and forum discussion: =Téléchargement de MineClone 2 et discussion sur le forum: +Here you find the most recent version of MineClone 2 and can discuss it.=Vous trouverez ici la version la plus récente de MineClone 2 et pouvez en discuter. +Bug tracker: =Suivi des bogues: +Report bugs here.=Signalez les bugs ici. +Minetest links:=Liens Minetest: +You may want to check out these online resources related to Minetest:=Vous voudrez peut-être consulter ces ressources en ligne liées à Minetest: +Official homepage of Minetest: =Page d'accueil officielle de Minetest: +The main place to find the most recent version of Minetest, the engine used by MineClone 2.=L'endroit principal pour trouver la version la plus récente de Minetest, le moteur utilisé par MineClone 2. +The main place to find the most recent version of Minetest.=L'endroit principal pour trouver la version la plus récente de Minetest. +Community wiki: =Wiki de la communauté: +A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.=Un site Web de documentation communautaire pour Minetest. N'importe qui avec un compte peut le modifier! C'est aussi une documentation pour Minetest. +Minetest forums: =Forums de minetest: +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.=Une plate-forme de discussion en ligne où vous pouvez discuter de tout ce qui concerne Minetest. C'est également un endroit où les mods et les jeux créés par les joueurs sont publiés et discutés. Les discussions se déroulent principalement en anglais, mais il existe également un espace de discussion dans d'autres langues. +Chat: =Chat: +A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.=Un canal de discussion générique pour tout ce qui concerne le Minetest où les gens peuvent se rencontrer pour discuter en temps réel. Si vous ne comprenez pas IRC, consultez le wiki de la communauté pour obtenir de l'aide. +Groups=Groupes +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:=Les objets, les joueurs et les objets (animés et inanimés) peuvent être membres de plusieurs de groupes. Les groupes ont plusieurs objectifs: +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups=• Recettes d'artisanat: Les emplacements d'une recette d'artisanat peuvent ne pas nécessiter un élément spécifique, mais plutôt un élément qui est membre d'un groupe particulier ou de plusieurs groupes. +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups=• Temps de creusement: Les blocs pouvant être creusés appartiennent à des groupes qui sont utilisés pour déterminer les temps de creusement. Les outils miniers sont capables de creuser des blocs appartenant à certains groupes +• Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group=• Comportement des blocs: Les blocs peuvent présenter un comportement spécial et interagir avec d'autres blocs lorsqu'ils appartiennent à un groupe particulier +• Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”=• Dommages et armures: Les objets et les joueurs ont des groupes d'armures, les armes ont des groupes de dégâts. Ces groupes déterminent les dommages. Voir aussi: "Bases> Armes" +• Other uses=• Autres utilisations +In the item help, many important groups are usually mentioned and explained.=Dans l'aide aux objets, de nombreux groupes importants sont généralement mentionnés et expliqués. +Glossary=Glossaire +This is a list of commonly used terms:=Voici une liste de termes couramment utilisés: +Controls:=Les contrôles: +• Wielding: Holding an item in hand=• Maniement: Tenir un objet en main +• Pointing: Looking with the crosshair at something in range=• Pointage: Regarder avec le réticule quelque chose à portée +• Dropping: Throwing an item or item stack to the ground=• Lâcher: Jeter un objet ou une pile d'objets au sol +• Punching: Attacking with left-click, is also used on blocks=• Frapper: Attaque avec clic gauche, est également utilisé sur les blocs +• Sneaking: Walking slowly while (usually) avoiding to fall over edges=• Se faufiler: Marcher lentement tout en évitant (généralement) de tomber sur les bords +• Climbing: Moving up or down a climbable block=• Escalade: Monter ou descendre un bloc grimpable +Blocks:=Blocs: +• Block: Cubes that the worlds are made of=• Bloc: Cubes dont les mondes sont faits +• Mining/digging: Using a mining tool to break a block=• Exploration/minage: Utilisation d'un outil d'exploration pour casser un bloc +• Building/placing: Putting a block somewhere=• Construction/Placement: Placer un bloc quelque part +• Drop: Items you get after mining a block=• Drop: Les objets que vous obtenez après avoir extrait un bloc +• Using a block: Right-clicking a block to access its special function=• Utilisation d'un bloc: Clic droit sur un bloc pour accéder à sa fonction spéciale +Items:=Objects: +• Item: A single thing that players can possess=• Objet: Une seule chose que les joueurs peuvent posséder +• Item stack: A collection of items of the same kind=• Pile d'objets: Une collection d'objets du même type +• Maximum stack size: Maximum amount of items in an item stack=• Taille maximale de la pile: Quantité maximale d'éléments dans une pile d'éléments +• Slot / inventory slot: Can hold one item stack=• Emplacement/Emplacement d'inventaire: Peut contenir une pile d'objets +• Inventory: Provides several inventory slots for storage=• Inventaire: Fournit plusieurs emplacements d'inventaire pour le stockage +• Player inventory: The main inventory of a player=• Inventaire des joueurs: L'inventaire principal d'un joueur +• Tool: An item which you can use to do special things with when wielding=• Outil: Un élément que vous pouvez utiliser pour faire des choses spéciales avec lors du soudage +• Range: How far away things can be to be pointed by an item=• Plage: A quelle distance les objets peuvent être pointés par un élément +• Mining tool: A tool which allows to break blocks=• Outil minier: Un outil qui permet de casser des blocs +• Craftitem: An item which is (primarily or only) used for crafting=• Composant: Un objet qui est (principalement ou uniquement) utilisé pour l'artisanat +Gameplay:=Gameplay: +• “heart”: A single health symbol, indicates 2 HP=• "coeur": Un seul symbole de santé, indique 2 PV +• “bubble”: A single breath symbol, indicates 1 BP=• "bulle": Un symbole de respiration unique, indique 1 BP +• HP: Hit point (equals half 1 “heart”)=• VP: point de vie (équivaut à un demi-«coeur») +• BP: Breath point, indicates breath when diving=• BP: Point de respiration, indique la respiration lors de la plongée +• Mob: Computer-controlled enemy=• Mob: Ennemi contrôlé par ordinateur +• Crafting: Combining multiple items to create new ones=• Artisanat: Combiner plusieurs objets pour en créer de nouveaux +• Crafting guide: A helper which shows available crafting recipes=• Guide d'artisanat: Un assistant qui montre les recettes d'artisanat disponibles +• Spawning: Appearing in the world=• Reproduction: Apparaissant dans le monde +• Respawning: Appearing again in the world after death=• Réapparition: Réapparaître dans le monde après la mort +• Group: Puts similar things together, often affects gameplay=• Groupe: Rassemble des choses similaires, affecte souvent le gameplay +• noclip: Allows to fly through walls=• noclip: Permet de voler à travers les murs +Interface=Interface +• Hotbar: Inventory slots at the bottom=• Hotbar: Emplacements d'inventaire en bas +• Statbar: Indicator made out of half-symbols, used for health and breath=• Statbar: Indicateur composé de demi-symboles, utilisé pour la santé et la respiration +• Minimap: The map or radar at the top right=• Mini-carte: La carte ou le radar en haut à droite +• Crosshair: Seen in the middle, used to point at things=• Réticule: Vu au milieu, utilisé pour pointer les choses +Online multiplayer:=Multijoueur en ligne: +• PvP: Player vs Player. If active, players can deal damage to each other=• PvP: Joueur contre Joueur. S'ils sont actifs, les joueurs peuvent s'infliger mutuellement des dégâts +• Griefing: Destroying the buildings of other players against their will=• Deuil: Détruire les bâtiments des autres joueurs contre leur gré +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside=• Protection: Mécanisme pour posséder des zones du monde, qui permet uniquement aux propriétaires de modifier les blocs à l'intérieur +Technical terms:=Termes techniques: +• Minetest: This game engine=• Minetest: Ce moteur de jeu +• MineClone 2: What you play right now=• MineClone 2: Ce que vous jouez en ce moment +• Minetest Game: A game for Minetest by the Minetest developers=• Minetest Game: Un jeu pour Minetest par les développeurs de Minetest +• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar=• Jeu: Une expérience de jeu complète à utiliser dans Minetest; comme un jeu ou un bac à sable ou similaire +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them=• Mod: un sous-système unique qui ajoute ou modifie des fonctionnalités; est le bloc de construction de base des jeux et peut être utilisé pour les améliorer ou les modifier davantage +• Privilege: Allows a player to do something=• Privilège: Permet à un joueur de faire quelque chose +• Node: Other word for “block”=• Noeud: Autre mot pour "bloc" +Settings=Réglages +There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.=Il existe une grande variété de paramètres pour configurer Minetest. Presque tous les aspects peuvent être modifiés de cette façon. +These are a few of the most important gameplay settings:=Voici quelques-uns des paramètres de jeu les plus importants: +• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal=• Dommage activé (enable_damage): Active les attributs de santé et de souffle pour tous les joueurs. Si désactivé, les joueurs sont immortels +• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the game; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.=• Mode créatif (creative_mode): permet un gameplay de style sandbox en se concentrant sur la créativité plutôt que sur un gameplay difficile. Le sens dépend du jeu; les changements habituels sont: temps de fouille réduits, accès facile à presque tous les articles, les outils ne s'usent jamais, etc. +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other=• PvP (enable_pvp): Abréviation de «Player vs Player». Si activé, les joueurs peuvent s'infliger mutuellement des dégâts +For a full list of all available settings, use the “All Settings” dialog in the main menu.=Pour une liste complète de tous les paramètres disponibles, utilisez la boîte de dialogue "Tous les Paramètres" dans le menu principal. +Movement modes=Modes de mouvement +You can enable some special movement modes that change how you move.=Vous pouvez activer certains modes de déplacement spéciaux qui modifient votre façon de vous déplacer. +Pitch movement mode:=Mode de mouvement de tangage: +• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.=• Description: Si ce mode est activé, les touches de déplacement vous déplaceront par rapport à votre hauteur de vue actuelle (angle de vue vertical) lorsque vous êtes en mode liquide ou en mode vol. +• Default key: [L]=• Touche par défaut: [L] +• No privilege required=• Aucun privilège requis +Fast mode:=Mode Rapide: +• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.=• Description: vous permet de vous déplacer beaucoup plus rapidement. Maintenez la touche "Utiliser" [E] enfoncée pour vous déplacer plus rapidement. Dans la configuration du client, vous pouvez personnaliser davantage le mode rapide. +• Default key: [J]=• Touche par défaut: [J] +• Required privilege: fast=• Privilège requis: fast +Fly mode:=Mode Vol: +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.=• Description: La gravité ne vous affecte pas et vous pouvez vous déplacer librement dans toutes les directions. Utilisez la touche de saut pour monter et la touche de sneak pour descendre. +• Default key: [K]=• Touche par défaut: [K] +• Required privilege: fly=• Privilège requis: fly +Noclip mode:=Mode Noclip: +• Description: Allows you to move through walls. Only works when fly mode is enabled, too.=• Description: vous permet de vous déplacer à travers les murs. Fonctionne uniquement lorsque le mode avion est également activé. +• Default key: [H]=• Touche par défaut: [H] +• Required privilege: noclip=• Privilège requis: noclip +Console=Console +With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.=Avec [F10], vous pouvez ouvrir et fermer la console. L'utilisation principale de la console est d'afficher le journal de discussion et d'entrer des messages de discussion ou des commandes de serveur. +Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.=L'utilisation de la touche de commande chat ou serveur ouvre également la console, mais elle est plus petite et sera fermée après l'envoi d'un message. +Use the chat to communicate with other players. This requires you to have the “shout” privilege.=Utilisez le chat pour communiquer avec d'autres joueurs. Cela vous oblige à avoir le privilège "shout". +Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.=Tapez simplement le message et appuyez sur [Entrée]. Les messages de discussion publique ne peuvent pas commencer par "/". +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .=Vous pouvez envoyer des messages privés: Dites "/msg " dans le chat pour envoyer "" qui ne peut être vu que par . +There are some special controls for the console:=Il existe des commandes spéciales pour la console: +• [F10] Open/close console=• [F10]: Ouvrir/fermer la console +• [Enter]: Send message or command=• [Entrée]: Envoyer un message ou une commande +• [Tab]: Try to auto-complete a partially-entered player name=• [Tab]: Essayez de compléter automatiquement un nom de joueur partiellement entré +• [Ctrl]+[Left]: Move cursor to the beginning of the previous word=• [Ctrl]+[Gauche]: Déplacer le curseur au début du mot précédent +• [Ctrl]+[Right]: Move cursor to the beginning of the next word=• [Ctrl]+[Droite]: Déplacez le curseur au début du mot suivant +• [Ctrl]+[Backspace]: Delete previous word=• [Ctrl]+[Retour arrière]: Supprimer le mot précédent +• [Ctrl]+[Delete]: Delete next word=• [Ctrl]+[Supprimer]: Supprimer le mot suivant +• [Ctrl]+[U]: Delete all text before the cursor=• [Ctrl]+[U]: Supprimer tout le texte avant le curseur +• [Ctrl]+[K]: Delete all text after the cursor=• [Ctrl]+[K]: Supprimer tout le texte après le curseur +• [Page up]: Scroll up=• [Page précédente]: Faites défiler vers le haut +• [Page down]: Scroll down=• [Page suivante]: Faites défiler vers le bas +There is also an input history. Minetest saves your previous console inputs which you can quickly access later:=Il existe également un historique des entrées. Minetest enregistre vos entrées de console précédentes auxquelles vous pouvez accéder rapidement plus tard: +• [Up]: Go to previous entry in history=• [Haut]: Aller à l'entrée précédente de l'historique +• [Down]: Go to next entry in history=• [Bas]: Passer à la prochaine entrée de l'historique +Server commands=Commandes serveur +Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.=Les commandes serveur (également appelées "commandes de chat") sont de petites aides pour les utilisateurs avancés. Vous n'avez pas besoin d'utiliser ces commandes lors du jeu. Mais elles pourraient être utiles pour effectuer des tâches plus techniques. Les commandes du serveur fonctionnent à la fois en mode multi-joueurs et solo. +Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.=Les commandes du serveur peuvent être saisies par les joueurs utilisant le chat pour effectuer une action spéciale du serveur. Il y a quelques commandes qui peuvent être émises par tout le monde, mais certaines commandes ne fonctionnent que si vous avez certains privilèges accordés sur le serveur. Il y a un petit ensemble de commandes de base qui sont toujours disponibles, d'autres commandes peuvent être ajoutées par des mods. +To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.=Pour lancer une commande, tapez-la simplement comme un message de discussion ou appuyez sur la touche de commande de Minetest (par défaut: [/]). Toutes les commandes doivent commencer par "/", par exemple "/mods". La touche de commande Minetest fait la même chose que la touche de conversation, sauf que la barre oblique est déjà entrée. +Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.=Les commandes peuvent ou non donner une réponse dans le journal de discussion, mais les erreurs seront généralement affichées dans la discussion. Essayez-le par vous-même: Fermez cette fenêtre et tapez la commande "/mods". Cela vous donnera la liste des mods disponibles sur ce serveur. +“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.="/Help all" est une commande très importante: vous obtenez une liste de toutes les commandes disponibles sur le serveur, une brève explication et les paramètres autorisés. Cette commande est également importante car les commandes disponibles diffèrent souvent selon le serveur. +Commands are followed by zero or more parameters.=Les commandes sont suivies de zéro ou plusieurs paramètres. +In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:=Dans la référence de commande, vous voyez des espaces réservés que vous devez remplacer par une valeur réelle. Voici une explication: +• Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter=• Texte en signes supérieur à et inférieur à (par exemple «»): Espace réservé pour un paramètre +• Anything in square brackets (e.g. “[text]”) is optional and can be omitted=• Tout ce qui est entre crochets (par exemple «[texte]») est facultatif et peut être omis +• Pipe or slash (e.g. “text1 | text2 | text3”): Alternation. One of multiple texts must be used (e.g. “text2”)=• Tuyau ou barre oblique (par exemple, «texte1 | texte2 | texte3»): Alternance. L'un des multiples textes doit être utilisé (par exemple, "texte2") +• Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations=• Parenthèses: (par exemple «(mot1 mot2) | mot3»): Regroupe plusieurs mots, utilisés pour les alternances +• Everything else is to be read as literal text=• Tout le reste doit être lu comme un texte littéral +Here are some examples to illustrate the command syntax:=Voici quelques exemples pour illustrer la syntaxe de commande: +• /mods: No parameters. Just enter “/mods”=• /mods: aucun paramètre. Entrez simplement "/mods" +• /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”=• /me : 1 paramètre. Vous devez saisir "/me" suivi de tout texte, par ex. "/me order pizza" +• /give : Two parameters. Example: “/give Player default:apple”=• /give : Deux paramètres. Exemple: "/give Player default:apple" +• /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”=• /help [all | privs | ]: Les entrées valides sont "/help", "/help all", "/help privs" ou "/help" suivi d'un nom de commande, comme "/help time" +• /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”=• /spawnentity [,,]: Les entrées valides sont “/spawnentity boats:boat” et “/spawnentity boats:boat 0,0,0” +Some final remarks:=Quelques remarques finales: +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege=• Pour /give et /giveme, vous avez besoin d'une chaîne d'objet. Il s'agit d'un identifiant d'élément unique utilisé en interne que vous pouvez trouver dans l'aide de l'élément si vous disposez du privilège "give" ou "debug". +• For /spawnentity you need an entity name, which is another identifier=• Pour /spawnentity, vous avez besoin d'un nom d'entité, qui est un autre identifiant +Privileges=Privilèges +Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.=Chaque joueur dispose d'un ensemble de privilèges, qui diffèrent d'un serveur à l'autre. Vos privilèges déterminent ce que vous pouvez et ne pouvez pas faire. Les privilèges peuvent être accordés et révoqués aux autres joueurs par n'importe quel joueur qui a le privilège appelé "privs". +On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.=Sur un serveur multijoueur avec la configuration par défaut, les nouveaux joueurs commencent avec les privilèges appelés "interact" et "shout". Le privilège "interact" est requis pour les actions de jeu les plus élémentaires telles que la construction, l'extraction, l'utilisation, etc. Le privilège "shout" permet de discuter. +There is a small set of core privileges which you'll find on every server, other privileges might be added by mods.=Il existe un petit ensemble de privilèges de base que vous trouverez sur chaque serveur, d'autres privilèges peuvent être ajoutés par les mods. +To view your own privileges, issue the server command “/privs”.=Pour afficher vos propres privilèges, exécutez la commande serveur "/privs". +Here are a few basic privilege-related commands:=Voici quelques commandes de base liées aux privilèges: +• /privs: Lists your privileges=• /privs: Répertorie vos privilèges +• /privs : Lists the privileges of =• /privs : Répertorie les privilèges de +• /help privs: Shows a list and description about all privileges=• /help privs: Affiche une liste et une description de tous les privilèges +Players with the “privs” privilege can modify privileges at will:=Les joueurs avec le privilège "privs" peuvent modifier les privilèges à volonté: +• /grant : Grant to =• /grant : Accordez à +• /revoke : Revoke from =• /revoke : Révoquer de +In single-player mode, you can use “/grantme all” to unlock all abilities.=En mode solo, vous pouvez utiliser "/grantme all" pour débloquer toutes les capacités. +Light=Lumière +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).=Comme le monde est entièrement basé sur des blocs, la lumière du monde l'est également. Chaque bloc a sa propre luminosité. La luminosité d'un bloc s'exprime dans un "niveau de lumière" qui varie de 0 (obscurité totale) à 15 (aussi lumineux que le soleil). +There are two types of light: Sunlight and artificial light.=Il existe deux types de lumière: La lumière du soleil et la lumière artificielle. +Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.=La lumière artificielle est émise par des blocs lumineux. La lumière artificielle a un niveau de lumière de 1 à 14. +Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.=La lumière du soleil est la lumière la plus brillante et descend toujours parfaitement directement du ciel à chaque heure de la journée. La nuit, la lumière du soleil deviendra le clair de lune à la place, qui fournit toujours une petite quantité de lumière. Le niveau de lumière solaire est de 15. +Blocks have 3 levels of transparency:=Les blocs ont 3 niveaux de transparence: +• Transparent: Sunlight goes through limitless, artificial light goes through with losses=• Transparent: La lumière du soleil passe sans limite, la lumière artificielle passe avec des pertes +• Semi-transparent: Sunlight and artificial light go through with losses=• Semi-transparent: La lumière du soleil et la lumière artificielle subissent des pertes +• Opaque: No light passes through=• Opaque: Aucune lumière ne passe +Artificial light will lose one level of brightness for each transparent or semi-transparent block it passes through, until only darkness remains (image 1).=La lumière artificielle perdra un niveau de luminosité pour chaque bloc transparent ou semi-transparent qu'elle traverse, jusqu'à ce qu'il ne reste que l'obscurité (image 1). +Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.=La lumière du soleil conservera sa luminosité tant qu'elle ne passera que par des blocs entièrement transparents. Lorsqu'il passe à travers un bloc semi-transparent, il se transforme en lumière artificielle. L'image 2 montre la différence. +Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.=Notez que la "transparence" ici signifie uniquement que le bloc est capable de transporter la luminosité de ses blocs voisins. Il est possible qu'un bloc soit transparent à la lumière mais vous ne pouvez pas voir à travers l'autre côté. +Coordinates=Coordonnées +The world is a large cube. And because of this, a position in the world can be easily expressed with Cartesian coordinates. That is, for each position in the world, there are 3 values X, Y and Z.=Le monde est un grand cube. Et pour cette raison, une position dans le monde peut être facilement exprimée avec des coordonnées cartésiennes. Autrement dit, pour chaque position dans le monde, il existe 3 valeurs X, Y et Z. +Like this: (5, 45, -12)=Comme ceci: (5, 45, -12) +This refers to the position where X@=5, Y@=45 and Z@=-12. The 3 letters are called “axes”: Y is for the height. X and Z are for the horizontal position.=Cela fait référence à la position où X@=5, Y@=45 et Z@=-12. Les 3 lettres sont appelées "axes": Y est pour la hauteur. X et Z sont pour la position horizontale. +The values for X, Y and Z work like this:=Les valeurs pour X, Y et Z fonctionnent comme ceci: +• If you go up, Y increases=• Si vous montez, Y augmente +• If you go down, Y decreases=• Si vous descendez, Y diminue +• If you follow the sun, X increases=• Si vous suivez le soleil, X augmente +• If you go to the reverse direction, X decreases=• Si vous allez dans le sens inverse, X diminue +• Follow the sun, then go right: Z increases=• Suivez le soleil, puis allez à droite: Z augmente +• Follow the sun, then go left: Z decreases=• Suivez le soleil, puis allez à gauche: Z diminue +• The side length of a full cube is 1=• La longueur latérale d'un cube complet est de 1 +You can view your current position in the debug screen (open with [F5]).=Vous pouvez afficher votre position actuelle dans l'écran de débogage (ouvrir avec [F5]). + +# MCL2 extensions +Creative Mode=Mode Creatif +Enabling Creative Mode in MineClone 2 applies the following changes:=L'activation du mode créatif dans MineClone 2 applique les modifications suivantes: +• You keep the things you've placed=• Vous gardez les choses que vous avez placées +• Creative inventory is available to obtain most items easily=• Un inventaire créatif est disponible pour obtenir facilement la plupart des objets +• Hand breaks all default blocks instantly=• La main brise instantanément tous les blocs par défaut +• Greatly increased hand pointing range=• Plage de pointage de la main considérablement augmentée +• Mined blocks don't drop items=• Les blocs extraits ne déposent pas d'objets +• Items don't get used up=• Les articles ne s'épuisent pas +• Tools don't wear off=• Les outils ne s'usent pas +• You can eat food whenever you want=• Vous pouvez manger de la nourriture quand vous le souhaitez +• You can always use the minimap (including radar mode)=• Vous pouvez toujours utiliser la minicarte (y compris le mode radar) +Damage is not affected by Creative Mode, it needs to be disabled separately.=Les dommages ne sont pas affectés par le mode créatif, ils doivent être désactivés séparément. +Mobs=Mobs +Mobs are the living beings in the world. This includes animals and monsters.=Les mobs sont les êtres vivants du monde. Cela inclut les animaux et les monstres. +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).=Les mobs apparaissent de manière aléatoire à travers le monde. C'est ce qu'on appelle l'"apparition". Chaque type de mob apparaît sur des types de blocs particuliers à un niveau de lumière donné. La hauteur joue également un rôle. Les mobs pacifiques ont tendance à apparaître à la lumière du jour tandis que les hostiles préfèrent l'obscurité. La plupart des mobs peuvent apparaître sur n'importe quel bloc solide, mais certains n'apparaissent que sur des blocs particuliers (comme les blocs d'herbe). +Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.=Comme les joueurs, les monstres ont aussi des points de vie et parfois des points d'armure (ce qui signifie que vous avez besoin de meilleures armes pour infliger des dégâts). Comme les joueurs, les monstres hostiles peuvent attaquer directement ou à distance. Les mobs peuvent déposer des objets aléatoires après leur mort. +Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.=La plupart des animaux parcourent le monde sans but tandis que la plupart des monstres hostiles chassent les joueurs. Les animaux peuvent être nourris, apprivoisés et élevés. +Animals=Animaux +Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.=Les animaux sont des êtres pacifiques qui parcourent le monde sans but. Vous pouvez les nourrir, les apprivoiser et les élever. +Feeding:=Alimentation: +Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.=Chaque animal a son propre goût pour la nourriture et n'accepte pas n'importe quelle nourriture. Pour vous nourrir, tenez un objet dans votre main et faites un clic droit sur l'animal. +Animals are attraced to the food they like and follow you as long you hold the food item in hand.=Les animaux sont attirés par la nourriture qu'ils aiment et vous suivent aussi longtemps que vous tenez l'aliment en main. +Feeding an animal has three uses: Taming, healing and breeding.=Nourrir un animal a trois usages: Apprivoiser, guérir et se reproduire. +Feeding heals animals instantly, depending on the quality of the food item.=Nourrir les animaux guérit instantanément, selon la qualité de l'aliment. +Taming:=Apprivoisement: +A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.=Quelques animaux peuvent être apprivoisés. Vous pouvez généralement faire plus de choses avec des animaux apprivoisés et utiliser d'autres objets dessus. Par exemple, les chevaux apprivoisés peuvent être sellés et les loups apprivoisés se battent à vos côtés. +Breeding:=Reproduction: +When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.=Lorsque vous avez nourri un animal à sa santé maximale, puis le nourrir à nouveau, vous activerez le "Mode Amour" et de nombreux coeurs apparaissent autour de l'animal. +Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.=Deux animaux de la même espèce commenceront à se reproduire s'ils sont en mode Amour et proches l'un de l'autre. Bientôt, un bébé animal apparaîtra. +Baby animals:=Bébés animaux: +Baby animals are just like their adult couterparts, but they can't be tamed or bred and don't drop anything when they die. They grow to adults after a short time. When fed, they grow to adults faster.=Les bébés animaux sont comme leurs homologues adultes, mais ils ne peuvent pas être apprivoisés ou élevés et ne laissent rien tomber lorsqu'ils meurent. Ils deviennent adultes après peu de temps. Une fois nourris, ils deviennent plus vite adultes. +Hunger=Faim +Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.=La faim affecte votre santé et votre capacité à sprinter. La faim n'est pas active lorsque les dégâts sont désactivés. +Core hunger rules:=Règles fondamentales de la faim: +• You start with 20/20 hunger points (more points @= less hungry)=• Vous commencez avec 20/20 points de faim (plus de points @= moins faim) +• Actions like combat, jumping, sprinting, etc. decrease hunger points=• Des actions comme le combat, le saut, le sprint, etc. diminuent les points de faim +• Food restores hunger points=• La nourriture rétablit les points de faim +• If your hunger bar decreases, you're hungry=• Si votre barre de la faim diminue, vous avez faim +• At 18-20 hunger points, you regenerate 1 HP every 4 seconds=• À 18-20 points de faim, vous régénérez 1 PV toutes les 4 secondes +• At 6 hunger points or less, you can't sprint=• À 6 points de faim ou moins, vous ne pouvez pas sprinter +• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)=• À 0 point de faim, vous perdez 1 PV toutes les 4 secondes (jusqu'à 1 PV) +• Poisonous food decreases your health=• La nourriture toxique diminue votre santé +Details:=Détails: +You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.=Vous avez 0-20 points de faim, indiqués par 20 demi-icônes de pilon de Poulet au-dessus de la hotbar. Vous avez également un attribut invisible: La saturation. +Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.=Les points de faim reflètent à quel point vous êtes plein tandis que les points de saturation reflètent le temps qu'il vous faut avant d'avoir à nouveau faim. +Each food item increases both your hunger level as well your saturation.=Chaque aliment augmente à la fois votre niveau de faim et votre saturation. +Food with a high saturation boost has the advantage that it will take longer until you get hungry again.=Les aliments avec une augmentation de saturation élevée ont l'avantage de prendre plus de temps jusqu'à ce que vous ayez de nouveau faim. +A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.=Quelques denrées alimentaires peuvent provoquer une intoxication alimentaire par hasard. Lorsque vous êtes empoisonné, les symboles de santé et de faim virent au vert maladif. L'intoxication alimentaire draine votre santé de 1 PV par seconde, jusqu'à 1 PV. L'intoxication alimentaire draine également votre saturation. L'intoxication alimentaire disparaît après un certain temps ou lorsque vous buvez du lait. +You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.=Vous commencez avec 5 points de saturation. La saturation maximale est égale à votre niveau de faim actuel. Ainsi, avec 20 points de faim, votre saturation maximale est de 20. Ce que cela signifie, c'est que les aliments qui rétablissent de nombreux points de saturation sont plus efficaces avec plus de points de faim. En effet, à de faibles niveaux de faim, une grande partie de l'augmentation de la saturation sera perdue en raison du plafond de saturation faible. +If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.=Si votre saturation atteint 0, vous avez faim et commencez à perdre des points de faim. Chaque fois que vous voyez la barre de la faim diminuer, c'est le bon moment pour manger. +Saturation decreases by doing things which exhaust you (highest exhaustion first):=La saturation diminue en faisant des choses qui vous épuisent (épuisement le plus élevé en premier): +• Regenerating 1 HP=• Régénérant 1 PV +• Suffering food poisoning=• Souffrance d'intoxication alimentaire +• Sprint-jumping=• Saut de sprint +• Sprinting=• Piquer un Sprint +• Attacking=• Combattre +• Taking damage=• Prendre des dégâts +• Swimming=• Nager +• Jumping=• Sauter +• Mining a block=• Miner un bloc +Other actions, like walking, do not exaust you.=D'autres actions, comme la marche, ne vous épuisent pas. +If you have a map item in any of your hotbar slots, you can use the minimap.=Si vous avez un élément de carte dans l'un de vos emplacements de la hotbar, vous pouvez utiliser la minicarte. diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr new file mode 100644 index 00000000..694735ca --- /dev/null +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr @@ -0,0 +1,408 @@ +# textdomain: mcl_doc_basics +Basics=Nozioni di base +Everything you need to know about Minetest to get started with playing=Tutto ciò che vi serve sapere riguardo a Minetest per cominciare a giocare +Advanced usage=Utilizzo avanzato +Advanced information about Minetest which may be nice to know, but is not crucial to gameplay=Informazioni avanzate riguardo a Minetest che possono essere utili da conoscere, ma non sono cruciali per l'esperienza di gioco +Quick start=Partenza rapida +This is a very brief introduction to the basic gameplay:=Questa è una introduzione molto rapida all'esperienza di gioco di base +• Move mouse to look=• Spostare il mouse per guardare attorno +• [W], [A], [S] and [D] to move=• [W], [A], [S] e [D] per muoversi +• [Space] to jump or move upwards=• [Spazio] per saltare o muoversi in su +• [Shift] to sneak or move downwards=• [Maiusc] per strisciare o muoversi in giù +• Mouse wheel or [0]-[9] to select item=• Rotella del mouse o [0]-[9] per scegliere un oggetto +• Left-click to mine blocks or attack=• Click sinistro per scavare i blocchi o attaccare +• Recover from swings to deal full damage=• Riprendersi dall'oscillazione per infliggere un danno completo +• Right-click to build blocks and use things=• Click destro per costruire blocchi e usare gli oggetti +• [I] for the inventory=• [I] per aprire l'inventario +• First items in inventory appear in hotbar below=• I primi oggetti nell'inventario compaiono nella barra di uso frequente sottostante +• [F9] for the minimap=• [F9] per attivare la minimappa +• Put items into crafting grid (usually 3×3 grid) to craft=• Mettete gli oggetti nella griglia di assemblaggio (normalmente una griglia 3x3) per assemblare +• Use a crafting guide mod to learn crafting recipes or visit =• Usate una gruida di assemblaggio per imparare le ricette di assemblaggio o visitate +• Read entries in this help to learn the rest=• Leggete le voci in questa guida per imparare il resto +• [Esc] to close this window=• [Esc] per chiudere questa finestra +Minetest=Minetest +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Minetest è un programma gratuito che funge da motore di gioco per giochi basati sull'esperienza di gioco coi voxel, ispirato da InfiniMiner, Minecraft, e simili. Minetest in origine è stato creato da Perttu Ahola (cioè “celeron55”). +The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest (also called “subgames”) can, however, be much more complex than this.=L'utente è gettat* in un enorme mondo fatto di cubi o blocchi. Questi cubi normalmente compongono il panorama e possono essere tolti o messi quasi completamente liberamente. Usando gli oggetti raccolti, si possono assemblare nuovi strumenti e altri oggetti. I giochi in Minetest (chiamati anche "subgame") possono, comunque, essere molto più complessi. +A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Una caratteristica centrale di Minetest è la capacità integrata di usare moduli. I moduli modificano l'esperienza di gioco esistente. Possono essere tanto semplici da aggiungere qualche blocco decorativo o essere molto complessi, per esempio introducendo concetti di gioco totalmente nuovi, generare un tipo di mondo completamente diverso, e molte altre cose. +Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=Minetest può essere giocato localmente o in rete assieme a più utenti. Il gioco in rete funzionerà immediatamente senza nessun modulo, senza bisogno di programmi aggiuntivi perché interamente forniti dal server. +Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Minetest generalmente include un gioco predefinito semplice, chiamato "Minetest Game" (mostrato nelle immagini 1 e 2). Probabilmente lo avete già. Altri giochi per Minetest possono essere scaricati dai forum ufficiali di Minetest . +Sneaking=Strisciare +Sneaking makes you walk slower and prevents you from falling off the edge of a block.=Strisciare vi fa camminare più lentamente e vi impedisce di cadere dal bordo di un blocco. +To sneak, hold down the sneak key (default: [Shift]). When you release it, you stop sneaking. Careful: When you release the sneak key at a ledge, you might fall!=Per strisciare, tenete premuto il tasto per strisciare (predefinito [Maiusc]). Quando lo rilasciate, smettete di strisciare. Fate attenzione: quando rilasciate il tasto per strisciare vicino a un orlo, potreste cadere! +• Sneak: [Shift]=• Strisciare: [Maiusc] +Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.=È possibile strisciare solo quando siete su un terreno solido, non siete in un liquido e non vi state arrampicando. +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.=Lo strisciare potrebbe essere disabilitato da dei moduli. In questo caso, strisciando camminerete comunque più lentamente, ma non verrete più fermat* agli orli. +Controls=Controlli +These are the default controls:=Questi sono i controlli predefiniti: +Basic movement:=Movimento di base: +• Moving the mouse around: Look around=• Spostando il mouse in giro: guardarsi attorno +• W: Move forwards=• W: fa avanzare +• A: Move to the left=• A: sposta a sinistra +• D: Move to the right=• D: sposta a destra +• S: Move backwards=• S: fa indietreggiare +While standing on solid ground:=Stando su di un terreno solido: +• Space: Jump=• Spazio: saltare +• Shift: Sneak=• Maiusc: strisciare +While on a ladder, swimming in a liquid or fly mode is active=Stando su di una scala a pioli, nuotando in un liquido o mentre è attiva la modalità di volo +• Space: Move up=• Spazio: fa salire +• Shift: Move down=• Maiusc: fa scendere +Extended movement (requires privileges):=Movimento esteso (richiede privilegi): +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)=• J: Attiva o disattiva la modalità veloce, vi fa correre o volare velocemente (richiede il privilegio “fast”) +• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)=• K: Attiva o disattiva la modalità di volo, vi fa muovere liberamente in tutte le direzioni (richiede il privilegio “fly”) +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)=• H: Attiva o disattiva la modalità incorporea, in modalità volo vi fa passare attraverso i muri (richiede il privilegio “noclip”) +• E: Walk fast in fast mode=• E: Camminare velocemente in modalità veloce +World interaction:=Interazione col mondo: +• Left mouse button: Punch / mine blocks / take items=• Pulsante sinistro del mouse: colpire / scavare blocchi / prendere oggetti +• Right mouse button: Build or use pointed block=• Pulsante destro del mouse: costruire o usare il blocco puntato +• Shift+Right mouse button: Build=• Maiusc + pulsante destro del mouse: costruire +• Roll mouse wheel: Select next/previous item in hotbar=• Ruotare la rotella del mouse: selezionare il prossimo/precedente oggetto nella barra di uso frequente +• 0-9: Select item in hotbar directly=• 0-9: selezionare direttamente un oggetto nella barra di uso frequente +• Q: Drop item stack=• Q: lasciare una pila di oggetti +• Shift+Q: Drop 1 item=• Maiusc + Q: lasciare un oggetto +• I: Show/hide inventory menu=• I: mostrare/nascondere il menu dell'inventario +Inventory interaction:=Interazione con l'inventario: +See the entry “Basics > Inventory”.=Si veda la voce “Nozioni di base > Inventario” +Camera:=Telecamera: +• Z: Zoom (requires “zoom” privilege)=• Z: ingrandimento (richiede il privilegio “zoom”) +• F7: Toggle camera mode=• F7: cambiare la modalità della telecamera +• F8: Toggle cinematic mode=• F8: attiva/disattiva la modalità cinematic +Interface:=Interfaccia: +• Esc: Open menu window (pauses in single-player mode) or close window=• Esc: apre la finestra del menu (in modalità gioco locale mette in pausa) o chiude la finestra +• F1: Show/hide HUD=• F1: mostra/nasconde il visore +• F2: Show/hide chat=• F2: mostra/nasconde la messaggistica +• F9: Toggle minimap=• F9: attiva o disattiva la minimappa +• Shift+F9: Toggle minimap rotation mode=• Maiusc + F9: cambia la modalità di rotazione della minimappa +• F10: Open/close console/chat log=• F10: apre/chiude il registro della console/messaggistica +• F12: Take a screenshot=• F12: scatta un'istantanea +Server interaction:=Interazione col server +• T: Open chat window (chat requires the “shout” privilege)=• T: apre la finestra di messaggistica (la messaggistica richiede il privilegio “shout”) +• /: Start issuing a server command)=• /: precede l'invio di un comando al server +Technical:=Tecnici: +• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)=• R: attiva/disattiva la vista lontana (disabilita la nebbia e permette di vedere distante, può rendere il gioco molto lento) +• +: Increase minimal viewing distance=• +: aumenta la distanza visiva minima +• -: Decrease minimal viewing distance=• -: diminuisce la distanza visiva minima +• F3: Enable/disable fog=• F3: abilita/disabilita la nebbia +• F5: Enable/disable debug screen which also shows your coordinates=• F5: abilita/disabilita la schermata di debug che mostra anche le vostre coordinate +• F6: Only useful for developers. Enables/disables profiler=• F6: utile solo per sviluppatori/trici. Abilita/disabilita il generatore di profili +Players=Utenti +Players (actually: “player characters”) are the characters which users control.=Gli utenti (in realtà: “personaggi utente”) sono i personaggi controllati dagli/dalle utenti. +Players are living beings which occupy a space of about 1×2×1 cubes. They start with 20 health points (HP) and 10 breath points (BP).=Gli/le utenti sono entità viventi che occupano uno spazio di circa 1x2x1 cubi. Iniziano con venti punti salute (PS) e dieci punti ossigeno (PO). +Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.=Gli/le utenti sono in grado di camminare, strisciare, saltare, arrampicarsi, nuotare, immergersi, scavare, costruire, combattere e di usare strumenti e blocchi. +Players can take damage for a variety of reasons, here are some:\n• Taking fall damage\n• Touching a block which causes direct damage\n• Drowning\n• Being attacked by another player\n• Being attacked by a computer enemy=Gli/le utenti possono ferirsi per una serie di motivi, eccone alcune:\n• Cadendo\n• Toccando un blocco che danneggia\n• Affogando\n• Vendendo attaccat* da un* altr* utente\n• Vendendo attaccat* da un* nemic* controllato dal computer +At a health of 0, the player dies. The player can just respawn in the world.=A salute pari a 0, il/la utente muore. Il/la utente può solo ricomparire nel mondo. +Other consequences of death depend on the subgame. The player could lose all items, or lose the round in a competitive game.=Altre conseguenze della morte dipendono dal gioco. Il/la utente potrebbe perdere tutti gli oggetti, o perdere il turno in un gioco di competizione. +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.=Alcuni blocchi riducono l'ossigeno. Stando con la testa in un blocco che causa l'annegamento, i punti ossigeno vengono ridotti di uno ogni due secondi. Quando tutto l'ossigeno è finito, il/la utente inizia a subire il ferimento da annegamento. L'ossigeno viene ripristinato rapidamente in ogni altro blocco. +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.=Il ferimento può essere disabilitato in qualunque mondo. Senza ferimento, gli/le utenti sono immortali, e salute e ossigeno non hanno importanza. +In multi-player mode, the name of other players is written above their head.=Durante il gioco in rete, il nome degli/delle altr* giocatori/trici è scritto sopra la loro testa. +Items=Oggetti +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.=Gli oggetti sono cose che potete trasportare e immagazzinare negli inventari. Possono essere usati per assemblare, fondere, costruire, scavare, e altro. Tipologie di oggetti includono blocchi, strumenti, armi, e oggetti usati solo per l'assemblaggio. +An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.=Una pila di oggetti è una raccolta di oggetti dello stesso tipo che sta in un unico scomparto per oggetti. Le pile di oggetti possono essere lasciate a terra. Gli oggetti che si lasciano alle stesse coordinate formeranno una pila di oggetti. +Items have several properties, including the following:\n\n• Maximum stack size: Number of items which fit on 1 item stack\n• Pointing range: How close things must be to be pointed while wielding this item\n• Group memberships: See “Basics > Groups”\n• May be used for crafting or cooking=Gli oggetti possiedono diverse proprietà, incluse le seguenti:\n\n• Dimensione massima della pila: il numero di oggetti che stanno in una pila di oggetti\n• Raggio di puntamento: quanto vicino devono essere le cose per essere puntate mentre si impugna questo oggetto\n• Appartenenza a gruppi: si veda “Nozioni di base > Gruppi”\n• Possono essere usati per assemblare o cucinare +A dropped item stack can be collected by punching it.=Una pila di oggetti lasciata a terra può essere raccolta colpendola. +Tools=Strumenti +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Alcuni oggetti possono servire come strumento quando vengono impugnati. Ogni oggetto che possiede qualche uso speciale che può essere utilizzato da chi lo impugna è considerato uno strumento. +A common tool in Minetest are, of course, mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool in Minetest. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Uno strumento comune in Minetest sono, naturalmente, gli strumenti di scavo. Questi sono importanti per rompere tutti i tipi di blocchi. In Minetest le armi in sono un tipo di strumento. Certamente ci sono molti altri strumenti possibili. Le azioni speciali degli oggetti di solito sono eseguite cliccando il pulsante sinistro o destro. +When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of collecting dropped items by punching.=Quando non si impugna nulla, gli/le utenti usano la loro mano che può fungere come strumento e arma. La mano può raccogliere gli oggetti lasciati a terra colpendoli. +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=Molti strumenti si consumeranno usandoli e alla fine potrebbero rompersi. L'usura è mostrata in una barra sotto all'icona dello strumento. Se non è mostrata nessuna barra di usura, lo strumento è nuovo di zecca. Gli strumenti potrebbero essere riparabili tramite l'assemblaggio, si veda “Nozioni di base > Assemblaggio”. +Weapons=Armi +Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.=Alcuni oggetti sono utilizzabili come armi bianche quando sono impugnati. Le armi condividono la maggior parte delle proprietà degli strumenti. +Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:=Le armi bianche infliggono ferite colpendo i/le utenti e gli altri oggetti animati. Ci sono due modi per attaccare: +• Single punch: Left-click once to deal a single punch=• Colpo singolo: cliccate una volta il pulsante sinistro per sferrare un colpo singolo +• Quick punching: Hold down the left mouse button to deal quick repeated punches=• Colpo rapido: tenete premuto il pulsante sinistro del mouse per sferrare colpi rapidi ripetuti +There are two core attributes of melee weapons:=Esistono due attributi principali delle armi bianche: +• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered)=• Danno massimo: il ferimento inferto dopo un colpo quando l'arma è stata ritratta completamente +• Full punch interval: Time it takes for fully recovering from a punch=• Intervallo di colpo completo: il tempo richiesto per ritrarre completamente da un colpo +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Un'arma infligge una ferita completa solo quando è stata ritratta completamente dal colpo precedente. Altrimenti, l'arma infliggerà solo un ferimento ridotto. Ciò significa, colpire rapidamente è molto veloce, però infligge ferite piuttosto basse. Si noti che l'intervallo di colpo completo non limita la vostra velocità di attacco. +There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.=C'è una regola che a volte rende impossibili gli attacchi: utenti, oggetti animati e armi appartengono a gruppi di ferimento. Un'arma infligge ferite a quell* che condividono con essa almeno un gruppo di ferimento. Perciò se state usando l'arma sbagliata, potreste non infliggere ferite affatto. +Pointing=Puntare +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.=“Puntare” significa guardare qualcosa entro il raggio del mirino. Puntare è necessario per l'interazione, come scavare, colpire, usare, ecc. Le cose puntabili includono blocchi, oggetti lasciati a terra, utenti, nemic* controllat* dal computer e oggetti. +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Per puntare qualcosa, deve essere nel raggio di puntamento (chiamato anche solo “raggio”) del vostro oggetto impugnato. +A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.=Un po' di cose non possono essere puntate. La maggior parte dei blocchi sono puntabili. Pochi blocchi, come l'aria, non possono mai essere puntati. Altri blocchi, come i liquidi, possono essere puntati solo da oggetti speciali. +Camera=Telecamera +Minetest has 3 different views which determine the way you see the world. The modes are:\n\n• 1: First-person view (default)\n• 2: Third-person view from behind\n• 3: Third-person view from the front=Minetest possiede tre visuali diverse che stabiliscono il modo in cui vedete il mondo. Le modalità sono:\n\n• 1: Visuale in prima persona (predefinita)\n• 2: Visuale in terza persona da dietro\n• 3: Visuale in terza persona da davanti +You can change the camera mode by pressing [F7].=Potete cambiare la modalità della telecamera premendo [F7]. +By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.=Tenendo premuto il tasto [Z], potete ingrandire la visuale del vostro mirino. Per fare ciò vi serve il privilegio “zoom”. +• Switch camera mode: [F7]=• Cambiare modalità della telecamera: [F7] +• Zoom: [Z]=• Ingrandimento: [Z] +Blocks=Blocchi +The world of Minetest is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Il mondo di Minetest è fatto interamente di blocchi (voxel, per la precisione). I blocchi possono essere messi o tolti per mezzo degli strumenti adatti. +Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:=I blocchi possono avere un ampio spettro di proprietà differenti che stabiliscono tempi di scavo, comportamento, aspetto, forma e molto altro. Le loro proprietà includono: +• Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely=• Urtabile: non si può passare attraverso i blocchi urtabili; gli/le utenti possono camminare su di essi. I blocchi non urtabili possono essere attraversati liberamente +• Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools=• Puntabile: i blocchi puntabili mostrano una cornice o una scatola luminescente quando vengono puntati. Ma nel caso di blocchi non puntabili potrete solo puntare attraverso di essi. I liquidi normalmente non sono puntabili, ma possono essere puntati da alcuni strumenti speciali. +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools=• Proprietà di scavo: tramite quali strumenti possono essere scavati, quanto velocemente e quanto usurano gli strumenti +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys=• Scalabile: mentre siete su di un blocco scalabile, non cadrete e potrete muovervi su e giù con i tasti di salto e strisciamento +• Drowning damage: See the entry “Basics > Player”=• Ferimento da annegamento: si veda la voce “Nozioni di base > Utenti” +• Liquids: See the entry “Basics > Liquids”=• Liquidi: si veda la voce “Nozioni di base > Liquidi” +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more=• Appartenenze a gruppi: le appartenenze ai gruppi sono usate per stabilire le proprietà di scavo, assemblaggio, l'interazione tra blocchi e altro +Mining=Scavo +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=Scavare (o minare) è il processo di rompere i blocchi per toglierli. Per scavare un blocco, puntatelo e tenete premuto il pulsante sinistro del mouse finché si rompe. +Short explanation:=Spiegazione breve: +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in toughness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining go straight into your inventory.=Per scavare un blocco servono degli strumenti di scavo. Blocchi differenti si scavano con strumenti di scavo diversi, e alcuni blocchi non possono essere scavati da nessuno strumento. I blocchi variano in durezza e gli strumenti variano in forza. Gli strumenti di scavo si usurano nel tempo. Il tempo di scavo e l'usura dello strumento dipendono dal blocco e dallo strumento di scavo. Il modo più veloce di scoprire quanto sono efficienti i vostri strumenti di scavo è quello di provarli su diversi blocchi. Ogni oggetto che ottenete scavando va direttamente nel vostro inventario. +Detailed explanation:=Spiegazione dettagliata: +Mineable blocks have mining properties (based on groups) and a toughness level. Mining tools have the same properties. Each mining property of a block also has a rating, while tools can be able to break blocks within a range of ratings.=I blocchi scavabili possiedono proprietà di scavo (basate sui gruppi) e un livello di durezza. Gli strumenti di scavo possiedono le stesse proprietà. Ogni proprietà di scavo di un blocco ha anche un grado, mentre gli strumenti possono rompere blocchi all'interno di una scala di gradi. +In order to mine a block, these conditions need to be met:=Per scavare un blocco, è necessario soddisfare queste condizioni: +• The block and tool share at least one mining property for which they have a matching rating=• Il blocco e lo strumento condividono almeno una proprietà di scavo per la quale possiedono un grado corrispondente +• The tool's toughness level is equal or less than the block's toughness level=• Il livello di durezza dello strumento è uguale o inferiore alla durezza del blocco +Example: A block with the mining property “cracky”, rating 3 and toughness level 0 can only be broken by a tool which is able to break “cracky” blocks at rating 3 and it must have a toughness level of 0 or larger.=Esempio: un blocco avente la proprietà “cracky”, di grado 3 e un livello di durezza 0 può essere rotto solo da uno strumento che è in grado di rompere blocchi “cracky” di grado 3 e deve avere un livello di durezza pari a 0 o maggiore. +The time it takes to mine a block depends on the ratings and the toughness levels of both tool and block.=Il tempo necessario per scavare un blocco dipende dal grado e dal livello di durezza sia dello strumento che del blocco. +• The base mining time depends on the ratings of the block and the mining speed of the tool=• Il tempo base di scavo dipende dai gradi del blocco e dalla velocità di scavo dello strumento +• The mining speed of the tool differs for each mining property and its rating=• La velocità di scavo dello strumento varia per ogni proprietà di scavo ed il suo grado +• The toughness level further modifies the mining speed for this mining proeprty=• Il livello di durezza modifica ulteriormente la velocità di scavo per questa proprietà di scavo +• A high difference in toughness levels decreases the mining time considerably=• Una elevata differenza in livelli di durezza diminuisce considerevolmente il tempo di scavo +• If the toughness level difference is 2, the mining time is half of the base mining time=• Se la differenza del livello di durezza è pari a 2, il tempo di scavo è la metà del tempo di base di scavo +• If the a difference of 3, the mining time is a third, and so on=• Se la differenza è pari a 3, il tempo di scavo è un terzo, e così via +The item help shows the mining times of a tool listed by its mining properties and its ratings. The mining times are often expressed as a range. The low number stands for the mining time for toughness level 0 and the high number for the highest level the tool can mine.=L'aiuto sull'oggetto mostra i tempi di scavo di uno strumento, elencati dalle sue proprietà di scavo e dai suoi gradi. I tempi di scavo sono spesso espressi come un ventaglio. Il numero basso sta per il tempo di scavo per il livello di durezza 0 e il numero alto sta per il livello massimo che lo strumento può scavare. +Mining usually wears off tools. Each time you mine a block, your tool takes some damage until it is destroyed eventually. The wear per mined block determined by the difference between the tool's toughness level and the block's toughness level. The higher the difference, the lower the wear. This means:=Normalmente scavare usura gli strumenti. Ogni volta che scavate un blocco, il vostro strumento viene danneggiato un po' finché alla fine si rompe. L'usura per ciascun blocco scavato è stabilita dalla differenza tra il livello di durezza dello strumento e quello del blocco. Maggiore è la differenza, minore è l'usura. Ciò significa: +• High-level blocks wear off your tools faster=• Blocchi di alto livello usurano i vostri strumenti più velocemente +• You can use high-level tools to compensate this=• Per compensare ciò potete usare strumenti di alto livello +• The highest wear is caused when the level of both tool and block are equal=• L'usura maggiore è causata quando il livello di strumento e blocco sono uguali +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=Dopo averlo scavato, un blocco potrebbe lasciarsi alle spalle un “rilascio”. Questo è un numero di oggetti che ottenete dopo avere scavato. Più comunemente, otterrete il blocco stesso. Ci sono altre possibilità per un rilascio che dipendono dal tipo di blocco. I rilasci seguenti sono possibili: +• Always drops itself (the usual case)=• Rilascia sempre sé stesso (il caso normale) +• Always drops the same items=• Rilascia sempre gli stessi oggetti +• Drops items based on probability=• Rilascia oggetti in base a probabilità +• Drops nothing=• Non rilascia niente +The drop goes directly into your inventory, unless there's no more space left. In that case, the items literally drop on the floor.=Il rilascio va direttamente nel vostro inventario, a meno che non ci sia più spazio. In quel caso, l'oggetto cade per terra. +Building=Costruzione +Almost all blocks can be built (or placed). Building is very simple and has no delay.=Quasi tutti i blocchi possono essere costruiti (o posizionati). Costruire è molto semplice e non ha ritardo. +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.=Per posizionare il blocco che state impugnando, puntate ad un blocco nel mondo e cliccate col pulsante destro. Se ciò non è possibile perché il blocco puntato ha una azione speciale legata al pulsante destro, tenete premuto il tasto per strisciare prima di cliccare col pulsante destro. +Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.=I blocchi possono essere piazzati quasi sempre sui blocchi puntabili. Una eccezione sono i blocchi attaccati al pavimento; questi possono essere costruiti solo sul pavimento. +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.=Normalmente, i blocchi vengono posizionati di fronte al lato puntato del blocco puntato. Pochi blocchi sono differenti: quando tentate di costruirci, vengono rimpiazzati. +Liquids=Liquidi +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.=I liquidi sono blocchi speciali dinamici. Ai liquidi piace espandersi e fluire verso i blocchi circostanti. Gli/le utenti possono affogarci. +Liquids usually come in two forms: In source form (S) and in flowing form (F).=I liquidi normalmente sono di due tipi: il tipo fonte (S) e il tipo corrente (F). +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. A long it is left alone, a liquid source will normally keep its place and does not drain out.=Le fonti di liquidi hanno la forma di un piccolo cubo. Una fonte di liquidi di tanto in tanto produrrà intorno a sé dei liquidi correnti, e, se il liquido è rinnovabile, produrrà anche fonti di liquidi. Una fonte di liquidi può sostenersi. Finché è lasciata stare, normalmente una fonte di liquidi manterrà il suo posto e non si prosciugherà. +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.=I liquidi correnti assumono una forma inclinata. I liquidi correnti si espandono per il mondo finché si prosciugano. Un liquido corrente non può sostenersi e proviene sempre da una fonte di liquidi, o direttamente o indirettamente. Senza una fonte di liquidi, alla fine un liquido corrente si prosciugherà e sparirà. +All liquids share the following properties:=Tutti i liquidi condividono le proprietà seguenti: +• All properties of blocks (including drowning damage=• Tutte le proprietà dei blocchi (incluso il ferimento da annegamento) +• Renewability: Renewable liquids can create new sources=• Rinnovabilità: i liquidi rinnvabili possono creare nuove fonti +• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2=• Raggio di flusso: quanti liquidi correnti sono creati al massimo da una fonte di liquidi, stabilisce quanto lontano si espanderà il liquido. Sono possibili raggi da 0 a 8. A 0, non sarà creato nessun liquido corrente. L'immagine 5 mostra un liquido con raggio di flusso pari a 2 +• Viscosity: How slow players move through it and how slow the liquid spreads=• Viscosità: quanto lentamente si muovono gli/le utenti in esso e quanto lentamente si espande il liquido +Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:\n• Two renewable liquid blocks of the same type touch each other diagonally\n• These blocks are also on the same height\n• One of the two “corners” is open space which allows liquids to flow in=I liquidi rinnovabili generano nuove fonti di liquidi negli spazi aperti (immagine 2). Una nuova fonte di liquidi viene creata quando:\n• Due blocchi di liquidi rinnovabili dello stesso tipo si toccano l'un l'altro diagonalmente\n• Questi blocchi sono anche alla stessa altezza\n• Uno dei due “angoli” è uno spazio aperto che consente ai liquidi di scorrervi dentro +When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).=Quando questi criteri sono soddisfatti, lo spazio aperto viene riempito con una nuova fonte di liquidi dello stesso tipo (immagine 3). +Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.=Nuotare in un liquido è abbastanza semplice: i soliti tasti direzionali per il movimento di base, il tasto di salto per emergere e il tasto strisciare per immergersi. +The physics for swimming and diving in a liquid are:=Le regole fisiche per nuotare e immergersi in un liquido sono: +• The higher the viscosity, the slower you move=• Maggiore è la viscosità, più lentamente vi muoverete +• If you rest, you'll slowly sink=• Se vi riposate, affonderete lentamente +• There is no fall damage for falling into a liquid as such=• Non c'è nessun ferimento da caduta alla caduta in un liquido in quanto tale +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage=• Se cadete in un liquido, verrete rallentat* all'impatto (ma non vi fermerete immediatamente). La profondità del vostro impatto è determinata dalla vostra velocità e dalla viscosità del liquido. Per un tuffo sicuro in un liquido da grande altezza, assicuratevi che ci sia abbastanza liquido sopra il terreno, altrimenti potreste colpire il terreno e subire il ferimento da caduta. +Liquids are often not pointable. But some special items are able to point all liquids.=Spesso i liquidi non sono puntabili. Ma alcuni oggetti speciali possono puntare tutti i liquidi. +Crafting=Assemblaggio +Crafting is the task of combining several items to form a new item.=L'assemblaggio è l'azione di combinare diversi oggetti per formarne uno nuovo. +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.=Per assemblare qualcosa, vi servono uno o più oggetti, una griglia di assemblaggio (C) e una ricetta di assemblaggio. Una griglia di assemblaggio è come un comune inventario che può anche essere usata per assemblare. Gli oggetti devono essere messi nella griglia di assemblaggio secondo una certa disposizione. Vicino alla griglia di assemblaggio c'è la casella del prodotto (O). Lì comparirà il risultato quando avrete disposto correttamente gli oggetti. Quella è solo un'anteprima, non il vero oggetto. Le griglie di assemblaggio possono essere di varie dimensioni che limitano le possibili ricette che potete assemblare. +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.=Per completare l'assemblaggio, prendete dalla casella del prodotto l'oggetto risultante, così facendo consumerete gli oggetti disposti nella griglia di assemblaggio creando il nuovo oggetto. Non è possibile posizionare oggetti nella casella del prodotto. +A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some subgames provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the subgame (if one is available).=La descrizione di come si assembla un oggetto è chiamata “ricetta di assemblaggio”. Per assemblare vi servirà questa conoscenza. Esistono svariati modi per imparare le ricette di assemblaggio. Un modo è usare una guida di assemblaggio, che contiene un elenco delle ricette di assemblaggio disponibili. Alcuni giochi forniscono guide di assemblaggio. Esistono anche alcuni moduli che potete scaricare dalla rete per installare una guida di assemblaggio. Un altro modo è leggere il manuale in rete del gioco (se questo è disponibile). +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.=Le ricette di assemblaggio sono formate da almeno un oggetto iniziale ed esattamente una pila di oggetti finali. Quando si esegue un assemblaggio singolo, questo consumerà esattamente un oggetto dalla griglia di assemblaggio, a meno che la ricetta di assemblaggio stabilisca dei rimpiazzi. +There are multiple types of crafting recipes:\n\n• Shaped (image 2): Items need to be placed in a particular shape\n• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)\n• Cooking: Explained in “Basics > Cooking”\n• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by a certain percentage. This recipe may not be available in all subgames=Esistono tipi multipli di ricette di assemblaggio:\n\n• Con una forma (immagine 2): gli oggetti devono essere disposti nella griglia secondo un ordine particolare\n• Senza una forma (immagini 3 e 4): gli oggetti devono essere messi da qualche parte nella griglia (entrambe le immagini mostrano la stessa ricetta)\n• Cottura: spiegata in “Nozioni di base > Cottura”\n• Riparazione (immagine 5): mettete nella griglia due strumenti usurati in punti qualsiasi per ottenere uno strumento riparato per una certa percentuale. Questa ricetta potrebbe non essere disponibile in tutti i giochi +In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.=In alcune ricette di assemblaggio, alcuni oggetti iniziali non devono essere un oggetto preciso, devono essere invece membri di un gruppo (si veda “Nozioni di base > Gruppi”). Queste ricette offrono una maggiore libertà per gli oggetti iniziali. Le immagini 6-8 mostrano la stessa ricetta basata sui gruppi. In questa, servono otto oggetti del gruppo “stone” (“pietra”), cosa valida per tutti gli oggetti mostrati. +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.=Raramente, le ricette di assemblaggio hanno dei rimpiazzi. Questo significa, ogni volta che eseguite un assemblaggio, alcuni oggetti nella griglia di assemblaggio non verranno consumati, ma invece verranno rimpiazzati da un altro oggetto. +Cooking=Cottura +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.=La cottura (o fusione) è una forma di creazione che non coinvolge una griglia di assemblaggio. La cottura viene eseguita con un blocco speciale (come una fornace), un oggetto cucinabile, un oggetto combustibile e del tempo per ottenere un nuovo oggetto. +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.=Ciascun combustibile possiede un tempo di bruciatura. Questo è il tempo per cui un singolo oggetto di combustibile tiene accesa una fornace. +Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.=Ciascun oggetto cucinabile richiede del tempo per essere cotto. Questo tempo è specifico per il tipo di oggetto, e l'oggetto deve essere “sulla fiamma” per l'intero tempo di cottura per produrre effettivamente il risultato. +Hotbar=Barra di uso frequente +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.=Nella parte inferiore dello schermo si vedono alcuni riquadri. Questi sono chiamati “barra di uso frequente”. La barra di uso frequente vi permette di accedere rapidamente ai primi oggetti dell'inventario del vostro personaggio. +You can change the selected item with the mouse wheel or the number keys.=Potete cambiare l'oggetto selezionato con la rotella del mouse o i tasti numerici. +• Select previous item in hotbar: [Mouse wheel up]=• Selezionare l'oggetto precedente dalla barra di uso frequente: [Rotella del mouse in avanti] +• Select next item in hotbar: [Mouse wheel down]=• Selezionare l'oggetto successivo dalla barra di uso frequente: [Rotella del mouse indietro] +• Select item in hotbar directly: [0]-[9]=• Selezionare direttamente un oggetto dalla barra di uso frequente: [0]-[9] +The selected item is also your wielded item.=L'oggetto selezionato è anche l'oggetto impugnato. +Minimap=Minimappa +Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.=Premete [F9] per fare comparire una minimappa in alto a destra. La minimappa vi aiuta a trovare la vostra strada nel mondo. Premetelo ancora per selezionare modalità e livelli di ingrandimento differenti. La minimappa mostra anche la posizione degli/delle altre utenti. +There are 2 minimap modes and 3 zoom levels.=Esistono due modalità della minimappa e tre livelli di ingrandimento. +Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.=La modalità di superficie (immagine 1) è una visuale del mondo dall'alto, rappresentante approssimativamente i colori dei blocchi di cui è composto questo mondo. Mostra solo i blocchi più elevati, ogni cosa al di sotto è nascosta, come nella foto scattata da un satellite. La modalità di superficie è utile se vi perdete. +Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon.=La modalità radar (immagine 2) è più complessa. Mostra la “densità” dell'area che vi circonda e varia col variare della vostra altitudine. Grosso modo, più verde è l'area, e meno “compatta” è. Le aree nere possiedono molti blocchi. Usate il radar per trovare caverne, aree nascoste, muri e altro. Le forme rettangolari nell'immagine 2 rivelano chiaramente la posizione di un sotterraneo. +There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.=Esistono anche due modalità di rotazione diverse. Nella “modalità quadrata”, la rotazione della minimappa è fissa. Se premete [Maiusc]+[F9] per passare alla “modalità circolare”, la minimappa ruoterà invece con la vostra direzione di sguardo, perciò “su” è sempre la vostra direzione di sguardo. +In some subgames, the minimap may be disabled.=In alcuni giochi, la minimappa potrebbe essere disabilitata. +• Toggle minimap mode: [F9]=• Cambiare la modalità della minimappa: [F9] +• Toggle minimap rotation mode: [Shift]+[F9]=• Cambiare la modalità di rotazione della minimappa: [Maiusc]+[F9] +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.=Gli inventari sono usati per immagazzinare pile di oggetti. Esistono altri usi, come l'assemblaggio. Un inventario è composto da una griglia rettangolare di alloggi per oggetti. Ogni alloggio per oggetto può essere vuoto o contenere una pila di oggetti. Le pile di oggetti possono essere spostate liberamente nella maggior parte degli alloggi. +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.=Voi avete il vostro inventario personale che è chiamato “inventario utente”, potete aprirlo con il tasto dell'inventario (predefinito: [I]). I primi alloggi dell'inventario sono anche usati come alloggi nella vostra barra di uso frequente. +Blocks can also have their own inventory, e.g. chests and furnaces.=Anche i blocchi possono avere il proprio inventario, per es. bauli e fornaci. +Inventory controls:=Controlli dell'inventario +Taking: You can take items from an occupied slot if the cursor holds nothing.=Prendere: potete prendere oggetti da un alloggio occupato se il cursore non sta tenendo nulla. +• Left click: take entire item stack=• Click sinistro: prende tutta la pila di oggetti +• Right click: take half from the item stack (rounded up)=• Click destro: prende metà della pila di oggetti (arrotondando) +• Middle click: take 10 items from the item stack=• Click centrale: prende dieci oggetti dalla pila di oggetti +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.=Mettere: potete mettere oggetti in un alloggio se il cursore sta tenendo uno o più oggetti e se l'alloggio è vuoto o contiene una pila di oggetti dello stesso tipo. +• Left click: put entire item stack=• Click sinistro: mette una intera pila di oggetti +• Right click: put 1 item of the item stack=• Click destro: mette un oggetto della pila di oggetti +• Middle click: put 10 items of the item stack=• Click centrale: mette dieci oggetti della pila di oggetti +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.= Scambiare: potete scambiare gli oggetti se il cursore sta tenendo uno o più oggetti e l'alloggio di destinazione è occupato da un tipo di oggetto differente. +• Click: exchange item stacks=• Click: scambiare le pile di oggetti +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.=Gettare via: se state tenendo una pila di oggetti e cliccate con essa da qualche parte fuori dal menu, la pila di oggetti viene gettata nell'ambiente. +Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.=Trasferimento rapido: potete trasferire rapidamente una pila di oggetti da/nell'inventario utente da/in un altro alloggio per oggetti di un inventario come quello di una fornace, un baule, o di ogni altro oggetto che abbia un alloggio per oggetti quando si accede all'inventario di quell'oggetto. In questo contesto generalmente l'inventario di destinazione è quello più importante. +• Sneak+Left click: Automatically transfer item stack=• Strisciare + click sinistro: trasferire automaticamente una pila di oggetti +Online help=Aiuto in rete +You may want to check out these online resources related to Minetest:=Potreste volere controllare queste risorse in rete collegate a Minetest: +Official homepage of Minetest: =Pagina ufficiale di Minetest: +The main place to find the most recent version of Minetest.=Il luogo principale dove trovare la versione più recente di Minetest. +Community wiki: =Wiki della comunità: +A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.=Un sito in rete di documentazione per Minetest basato sulla comunità. Chiunque abbia un account può modificarlo! Presenta anche una documentazione del Minetest Game. +Web forums: =Forum in rete: +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and subgames are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.=Una piattaforma di discussione basata sulla rete dove potete discutere ogni cosa riguardante Minetest. Questo è anche il luogo dove sono pubblicati e discussi i moduli e i giochi fatti dagli/dalle utenti. Le conversazioni sono principalmente in Inglese, ma c'è spazio anche per le conversazioni in altre lingue. +Chat: =Messaggistica: +A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.=Un canale Internet Relay Chat generico per tutto ciò che riguarda Minetest dove le persone possono incontrarsi per discutere in tempo reale. Se non capite IRC, leggete la Wiki della comunità per ottenere aiuto. +Groups=Gruppi +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:=Cose, utenti e oggetti (animati e inanimati) possono essere membri di qualunque numero di gruppi. I gruppi servono a svariati scopi: +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups=• Ricette di assemblaggio: gli alloggi in una ricetta di assemblaggio potrebbero non richiedere un oggetto specifico, ma invece un oggetto che sia membro di un gruppo particolare, o di più gruppi +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups=• Tempi di scavo: i blocchi scavabili appartengono a gruppi che sono usati per stabilire i tempi di scavo. Gli strumenti di scavo possono scavare blocchi che appartengono a certi gruppi +• Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group=• Comportamento del blocco: i blocchi possono mostrare un comportamento speciale e interagire con altri blocchi quando questi appartengono a un gruppo particolare +• Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”=• Ferimento e armatura: gli oggetti e i personaggi possiedono gruppi di armatura, le armi possiedono gruppi di ferimento. Questi gruppi stabiliscono il ferimento. Si veda anche: “Nozioni di base > Armi” +• Other uses=• Altri usi +In the item help, many important groups are usually mentioned and explained.=Nell'aiuto sull'oggetto, solitamente sono nominati e spiegati molti gruppi importanti. +Glossary=Glossario +This is a list of commonly used terms in Minetest:=Questo è un elenco dei termini usati comunemente in Minetest: +Controls:=Controlli: +• Wielding: Holding an item in hand=• Impugnare: tenere un oggetto nella mano +• Pointing: Looking with the crosshair at something in range=• Puntare: guardare col mirino a qualcosa entro il suo raggio +• Dropping: Throwing an item or item stack to the ground=• Rilasciare: gettare a terra un oggetto o una pila di oggetti +• Punching: Attacking with left-click, is also used on blocks=• Colpire: attaccare cliccando col pulsante destro, si usa anche sui blocchi +• Sneaking: Walking slowly while (usually) avoiding to fall over edges=• Strisciare: camminare lentamente evitando (normalmente) di cadere dagli orgli +• Climbing: Moving up or down a climbable block=• Arrampicarsi: muoversi in alto o in basso su di un blocco arrampicabile +Blocks:=Blocchi: +• Block: Cubes that the worlds are made of=• Blocco: cubi di cui è fatto il mondo +• Mining/digging: Using a mining tool to break a block=• Scavare/minare: usare uno strumento di scavo per rompere un blocco +• Building/placing: Putting a block somewhere=• Costruire/piazzare: mettere un blocco da qualche parte +• Drop: Items you get after mining a block=• Rilascio: oggetti che ottenete dopo avere scavato un blocco +• Using a block: Right-clicking a block to access its special function=• Usare un blocco: cliccare col pulsante destro un blocco per accedere alla sua funzione speciale +Items:=Oggetti: +• Item: A single thing that players can possess=• Oggetto: una cosa singola che gli/le utenti possono possedere +• Item stack: A collection of items of the same kind=• Pila di oggetti: una raccolta di oggetti dello stesso tipo +• Maximum stack size: Maximum amount of items in an item stack=• Dimensione massima della pila: numero massimo di oggetti in una pila di oggetti +• Slot / inventory slot: Can hold one item stack=• Alloggo / alloggio dell'inventario: può contenere una pila di oggetti +• Inventory: Provides several inventory slots for storage=• Inventario: fornisce numerosi alloggi inventario per l'immagazzinamento +• Player inventory: The main inventory of a player=• Inventario utente: l'inventario principale di un* utente +• Tool: An item which you can use to do special things with when wielding=• Strumento: un oggetto che potete usare per fare cose speciali mentre lo impugnate +• Range: How far away things can be to be pointed by an item=• Raggio: quanto possono essere distanti le cose per poter essere puntate da un oggetto +• Mining tool: A tool which allows to break blocks=• Strumento di scavo: uno strumento che permette di rompere blocchi +• Craftitem: An item which is (primarily or only) used for crafting=• Oggetto da assemblaggio: un oggetto che è usato (solamente o principalmente) per assemblare +Gameplay:=Esperienza di gioco: +• “heart”: A single health symbol, indicates 2 HP=• “cuore”: un singolo simbolo di salute, indica 2 PS +• “bubble”: A single breath symbol, indicates 1 BP=• “bolla”: un singolo simbolo di ossigeno, indica 1 PO +• HP: Hit point (equals half 1 “heart”)=• PS: punto salute (pari a metà di 1 “cuore”) +• BP: Breath point, indicates breath when diving=• PO: punto ossigeno, indica l'ossigeno quando ci si immerge +• Mob: Computer-controlled enemy=• Mob: nemic* controllat* dal computer (abbreviazione di “mobile”) +• Crafting: Combining multiple items to create new ones=• Assemblare: combinare diversi oggetti per crearne di nuovi +• Crafting guide: A helper which shows available crafting recipes=• Guida di assemblaggio: una fonte di aiuto che mostra le ricette di assemblaggio disponibili +• Spawning: Appearing in the world=• Comparire: comparire nel mondo +• Respawning: Appearing again in the world after death=• Ricomparire: ricomparire ancora nel mondo dopo la morte +• Group: Puts similar things together, often affects gameplay=• Gruppo: mette assieme cose simili, spesso influenza l'esperienza di gioco +• noclip: Allows to fly through walls=• Modalità incorporea: permette di volare attraverso i muri +Interface=Interfaccia +• Hotbar: Inventory slots at the bottom=• Barra di uso frequente: alloggi dell'inventario sottostanti +• Statbar: Indicator made out of half-symbols, used for health and breath=• Barra delle caratteristiche: indicatore composto di mezzi-simboli, usato per salute e ossigeno +• Minimap: The map or radar at the top right=• Minimappa: la mappa o radar in alto a destra +• Crosshair: Seen in the middle, used to point at things=• Mirino: visibile al centro, usato per puntare le cose +Online multiplayer:=Gioco in rete: +• PvP: Player vs Player. If active, players can deal damage to each other=• UcU: Utente contro Utente (“PvP” in Inglese). Se attivata, gli/le utenti possono ferirsi a vicenda +• Griefing: Destroying the buildings of other players against their will=• Vandalizzare: (“griefing” in Inglese) distruggere le costruzioni degli/delle altr* utenti contro la loro volontà +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside=• Protezione: meccanismo per possedere aree del mondo, che permette solo al/alla proprietari* di modificare i blocchi al loro interno +Technical terms:=Termini tecnici: +• Minetest: This game engine=• Minetest: questo motore di gioco +• Minetest Game: A subgame for Minetest by the Minetest developers=• Minetest Game: un gioco per Minetest degli sviluppatori di Minetest +• Subgame: A complete playing experience to be used in Minetest; such as a game or sandbox or similar=• Gioco: una esperienza di gioco completa da usarsi in Minetest; come un gioco, una sandbox o simili +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of subgames and can be used to further enhance or modify them=• Modulo: un singolo sottosistema che aggiunge o modifica funzionalità; è il “mattone” di costruzione di base dei giochi e può essere usato per migliorarli o modificarli ulteriormente +• Privilege: Allows a player to do something=• Privilegio: permette a un* utente di fare qualcosa +• Node: Other word for “block”=• Nodo: parola alternativa per “blocco” +Settings=Impostazioni +There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.=Esiste una grande varietà di impostazioni per configurare Minetest. Quasi ogni aspetto può essere cambiato in quel modo. +These are a few of the most important gameplay settings:=Queste sono alcune delle impostazioni di gioco più importanti: +• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal=• Ferimento abilitato (enable_damage): abilita gli attributi di salute e ossigeno per tutt* gli/le utenti. Se è disabilitato, gli/le utenti sono immortali +• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the subgame; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.=• Modalità creativa (creative_mode): abilita lo stile di gioco sandbox incentrato sulla creatività piuttosto di quello impegnativo. Il significato dipende dal gioco; i cambiamenti comuni sono: tempi di scavo ridotti, accesso facile a quasi tutti gli oggetti, gli strumenti non si usurano mai, ecc. +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other=• UcU (enable_pvp): abbreviazione per “Utente contro Utente” (“PvP” in Inglese). Se abilitata, gli/le utenti possono ferirsi a vicenda. +For a full list of all available settings, use the “Advanced settings” dialog in the main menu.=Per un elenco completo delle impostazioni disponibili, usate il pulsante “Impostazioni avanzate” nel menu principale. +Movement modes=Modalità di movimento +If you have the required privileges, you can use up to three special movement modes. Using these may be considered cheating.=Se disponete dei privilegi necessari, potete usare fino a tre modalità speciali di movimento. Usarle potrebbe essere considerato barare. +Fast mode:=Modalità veloce: +• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.=• Descrizione: vi consente di muovervi molto più velocemente. Tenete premuto il tasto “Usare” [E] per muovervi più velocemente. Potete personalizzare ulteriormente la modalità veloce nella configurazione del client. +• Default key: [J]=• Tasto predefinito: [J] +• Required privilege: fast=• Privilegio richiesto: fast (“veloce”) +Fly mode:=Modalità volo: +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.=• Descrizione: la gravità non ha effetto su di voi e potete muovervi liberamente in tutte le direzioni. Usate il tasto di salto per ascendere e quello di strisciamento per discendere. +• Default key: [K]=• Tasto predefinito: [K] +• Required privilege: fly=• Privilegio richiesto: fly (“volo”) +Noclip mode:=Modalità incorporea: +• Description: Allows you to move through walls. Only works when fly mode is enabled, too.=• Descrizione: vi consente di passare attraverso i muri. Funziona solo quando è attivata anche la modalità volo. +• Default key: [H]=• Tasto predefinito: [H] +• Required privilege: noclip=• Privilegio richiesto: noclip (“nessun aggancio”) +Console=Console +With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.=Con [F10] potete aprire e chiudere la console. L'uso principale della console è mostrare il registro della messaggistica, o inviare messaggi, o comandi per il sever. +Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.=La console può essere aperta anche col tasto della messaggistica, o con quello che precede l'invio dei comandi, ma è più piccola e verrà chiusa dopo che avrete inviato un messaggio. +Use the chat to communicate with other players. This requires you to have the “shout” privilege.=Usate la messaggistica per comunicare con gli/le altr* utenti. Ciò richiede il privilegio “shout” (“urlare”). +Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.=Scrivete il messaggio e premete [Invio]. I messaggi inviati pubblicamente non possono iniziare con “/”. +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .=Potete inviare messaggi privati: scrivete “/msg Nome Messaggio” (senza virgolette) nell'area di messaggistica per mandare un “Messaggio” che potrà essere visto solo da “Nome”. +There are some special controls for the console:=Per la console esistono alcuni controlli speciali: +• [F10] Open/close console=• [F10] apre/chiude la console +• [Enter]: Send message or command=• [Invio]: manda un messaggio o un comando +• [Tab]: Try to auto-complete a partially-entered player name=• [Tab]: prova a completare automaticamente il nome di un* utente già parzialmente scritto +• [Ctrl]+[Left]: Move cursor to the beginning of the previous word=• [Ctrl] + [Sinistra]: sposta il cursore all'inizio della parola precedente +• [Ctrl]+[Right]: Move cursor to the beginning of the next word=• [Ctrl] + [Destra]: sposta il cursore all'inizio della parola successiva +• [Ctrl]+[Backspace]: Delete previous word=• [Ctrl] + [Backspace]: cancella la parola precedente +• [Ctrl]+[Delete]: Delete next word=• [Ctrl] + [Canc]: cancella la parola successiva +• [Ctrl]+[U]: Delete all text before the cursor=• [Ctrl] + [U]: cancella tutto il testo prima del cursore +• [Ctrl]+[K]: Delete all text after the cursor=• [Ctrl] + [K]: cancella tutto il testo dopo il cursore +• [Page up]: Scroll up=• [Pag su]: scorre indietro il testo +• [Page down]: Scroll down=• [Pag giù]: scorre in avanti il testo +There is also an input history. Minetest saves your previous console inputs which you can quickly access later:=Esiste anche uno storico dei contenuti inseriti. Minetest salva i vostri inserimenti precendenti nella console, in modo che possiate accedervi rapidamente più tardi: +• [Up]: Go to previous entry in history=• [Su]: va alla voce precedente nello storico +• [Down]: Go to next entry in history=• [Giù]: va alla voce successiva nello storico +Server commands=Comandi del server +Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.=I comandi del server (chiamati anche “comandi di messaggistica”) sono piccoli aiutanti per gli/le utenti avanzat*. Quando giocate non vi serve usare questi comandi. Ma potrebbero esservi utili per eseguire compiti più avanzati. I comandi del server funzionano sia nella modalità di gioco locale che in quella in rete. +Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.=I comandi del server possono essere inseriti dai/dalle utenti usando la messaggistica per eseguire una azione speciale del server. Esistono un po' di comandi che possono essere usati da tutt*, ma alcuni comandi funzionano solo se sul server vi sono stati concessi certi privilegi. Esiste un piccolo numero di comandi di base che sono sempre disponibili, altri comandi possono essere aggiunti dai moduli. +To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.=Per inviare un comando, scrivetelo come se fosse un messaggio o premete il tasto di comando di Minetest (predefinito: [/]). Tutti i comandi devono iniziare con “/”, per esempio “/mods”. Il tasto di comando di Minetest si comporta come il tasto della messaggistica, eccetto il fatto che la sbarra “/” è già inserita. +Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.=I comandi possono non dare una risposta nel registro della messaggistica, ma in genere gli errori saranno mostrati. Provate voi stess*: chiudete questa finestra e inviate il comando “/mods” (senza virgolette). Vi mostrerà l'elenco dei moduli disponibili su questo server. +“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.=“/help all” è un comando molto importante: ottenete un elenco di tutti i comandi disponibili sul server, una breve spiegazione e i parametri consentiti. Questo comando è importante anche perhé i comandi disponibili spesso variano da server a server. +Commands are followed by zero or more parameters.=I comandi sono seguiti da zero o più parametri. +In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:=Nella guida di riferimento dei comandi, vedrete alcuni segnaposto che dovrete sostituire con un valore effettivo. Ecco una spiegazione: +• Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter=• Testo racchiuso tra i simboli minore-di e maggiore-di (per es. “”): segnaposto per un parametro +• Anything in square brackets (e.g. “[text]”) is optional and can be omitted=• Tutto quello che è tra parentesi quadre (per esempio “[testo]”) è facoltativo è si può omettere +• Pipe or slash (e.g. “text1 | text2 | text3”): Alternation. One of multiple texts must be used (e.g. “text2”)=• Simbolo alternativo “|” barretta, o “/” sbarra (per es. “testo1 | testo2 | testo3”): alternanza. Si devono usare uno o più testi (per es. “testo2”) +• Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations=• Parentesi tonde (per es. “(parola1 parola2) | parola3”): raggruppano assieme più parole, usate per le alternanze +• Everything else is to be read as literal text=Tutto il resto va letto come testo letterale +Here are some examples to illustrate the command syntax:=Ecco alcuni esempi per illustrare la sintassi dei comandi: +• /mods: No parameters. Just enter “/mods”=• /mods: nessun parametro. Scrivete solo “/mods” +• /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”=• /me : un parametro. Dovete scrivere “/me ” seguito da del testo, per es. “/me ordina una pizza” +• /give : Two parameters. Example: “/give Player default:apple”=• /give : due parametri. Esempio: “/give Utente default:apple” +• /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”=• /help [all|privs|]: i valori validi sono “/help”, “/help all”, “/help privs”, o “/help ” seguito dal nome di un comando, come “/help time” +• /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”=• /spawnentity [,,]: i valori validi includono “/spawnentity boats:boat” e “/spawnentity boats:boat 0,0,0” +Some final remarks:=Alcune osservazioni finali: +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege=Per /give e /giveme, vi serve una stringa oggetto. Questa è un identificatore unico usato internamente che potreste trovare nell'aiuto sull'oggetto se avete il privilegio “give” o “debug” +• For /spawnentity you need an entity name, which is another identifier=• Per /spawnentity vi serve il nome di una entità, che è un altro identificatore +Privileges=Privilegi +Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.=Ogni utente ha un numero di privilegi, che variano da server a server. I vostri privilegi stabiliscono cosa potete e non potete fare. I privilegi possono essere concessi e revocati ad altr* utenti da qualunque utente che abbia il privilegio chiamato “privs”. +On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.=Su di un server in rete avente la configurazione predefinita, i/le nuov* utenti iniziano coi privilegi chiamati “interact” (“interagire”) e “shout” (“urlare”). Il privilegio “interact” è necessario per le azioni di gioco di base, come costruire, scavare, usare, ecc. Il privilegio “shout” permette di conversare. +There is a small set of core privileges which you'll find on every server, other privileges might be added by mods.=Esiste un piccolo numero di privilegi fondamentali che troverete su ogni server, altri privilegi potrebbero essere aggiunti dai moduli. +To view your own privileges, issue the server command “/privs”.=Per vedere i vostri privilegi, inviate il comando “/privs”. +Here are a few basic privilege-related commands:=Ecco alcuni comandi di base legati ai privilegi: +• /privs: Lists your privileges=• /privs: elenca i vostri privilegi +• /privs : Lists the privileges of =• /privs : elenca i privilegi di +• /help privs: Shows a list and description about all privileges=• /help privs: mostra un elenco e una descrizione di tutti i privilegi +Players with the “privs” privilege can modify privileges at will:=Gli/le utenti con il privilegio “privs” possono cambiare i privilegi a volontà: +• /grant : Grant to =• /grant : concede a +• /revoke : Revoke from =• /revoke : revoca a +In single-player mode, you can use “/grant singleplayer all” to unlock all abilities (which is often considered cheating).=Nella modalità di gioco locale, potete usare “/grant singleplayer all” per sbloccare tutte le abilità (che spesso è considerato barare). +Light=Luce +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).=Essendo il mondo completamente basato su blocchi, lo è anche la luce nel mondo. Ogni blocco ha la propria luminosità. La luminosità di un blocco è espressa in un “livello di luce” che va da 0 (oscurità completa) a 15 (luminoso quanto il sole). +There are two types of light: Sunlight and artificial light.=Esistono due tipi di luce: la luce solare e la luce artificiale. +Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.=La luce artificiale è emessa dai blocchi luminosi. La luce artificiale ha un livello di luce tra 1 e 14. +Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. blocks. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.=La luce solare è quella più luminosa e discende dal cielo perfettamente dritta a ogni ora del giorno. Di notte, la luce solare diverrà invece luce lunare, che fornisce comunque un po' di luce. Il livello di luce della luce solare è 15. +Blocks have 3 levels of transparency:=I blocchi hanno tre livelli di trasparenza: +• Transparent: Sunlight goes through limitless, artificial light goes through with losses=• Trasparente: la luce solare li attraversa senza perdite, la luce artificiale li attraversa con delle perdite +• Semi-transparent: Sunlight and artificial light go through with losses=• Semi-trasparenti: la luce solare e la luce artificiale li attraversano con delle perdite +• Opaque: No light passes through=• Opachi: nessuna luce li attraversa +Artificial light will lose one level of brightness for each transparent or semi-transparent block it passes through, until only darkness remains (image 1).=La luce artificiale perderà un livello di luminosità per ciascun nodo trasparente o semi-trasparente che attraversa, finché resterà solo oscurità (immagine 1). +Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.=La luce solare conserverà la propria luminosità finché attraverserà solo blocchi trasparenti. Quando passa attraverso un blocco semi-trasparente, si trasforma in luce artificiale. L'immagine 2 mostra la differenza. +Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.=Si noti che per “trasparenza” qui si intende solo che il blocco può trasferire la luminosità ai nodi vicini. È possibile che un blocco sia trasparente alla luce, ma che voi non possiate guardarci attraverso. +Coordinates=Coordinate +The Minetest world is a large cube. And because of this, a position in the world can be easily expressed with Cartesian coordinates. That is, for each position in the world, there are 3 values X, Y and Z.=Il mondo di Minetest è un grande cubo. E per questo, una posizione nel mondo può essere facilmente espressa tramite coordinate Cartesiane. Cioè, per ogni posizione nel mondo, esistono tre valori: X, Y e Z. +Like this: (5, 45, -12)=Come questi: (5, 45, -12) +This refers to the position where X=5, Y=45 and Z=-12. The 3 letters are called “axes”: Y is for the height. X and Z are for the horizontal position.=Ciò si riferisce alla posizione dove X=5 (si legga “X vale 5”, NdT), Y=45 e Z=-12. Le tre lettere sono chiamate “assi”: Y si riferisce all'altezza. X e Z si riferiscono alla posizione orizzontale. +The values for X, Y and Z work like this:=I valori di X, Y e Z funzionano così: +• If you go up, Y increases=• Se salite, Y aumenta +• If you go down, Y decreases=• Se scendete, Y diminuisce +• If you follow the sun, X increases=• Se seguite il sole, X aumenta +• If you go to the reverse direction, X decreases=• Se andate nella direzione opposta, X diminuisce +• Follow the sun, then go right: Z increases=• Seguite il sole, poi andate a destra: Z aumenta +• Follow the sun, then go left: Z decreases=• Seguite il sole, poi andate a sinistra: Z diminuisce +• The side length of a full cube is 1=• La larghezza di un cubo completo è pari a 1 +You can view your current position in the debug screen (open with [F5]). This is considered cheating in some games.=Potete vedere la vostra posizione attuale nella schermata di debug (visibile con [F5]). In alcuni giochi questo è considerato barare. diff --git a/mods/HELP/mcl_doc_basics/locale/template.txt b/mods/HELP/mcl_doc_basics/locale/template.txt new file mode 100644 index 00000000..5abc582e --- /dev/null +++ b/mods/HELP/mcl_doc_basics/locale/template.txt @@ -0,0 +1,511 @@ +# textdomain: mcl_doc_basics +Basics= +Everything you need to know to get started with playing= +Advanced usage= +Advanced information which may be nice to know, but is not crucial to gameplay= +Quick start= +This is a very brief introduction to the basic gameplay:= +Basic controls:= +• Move mouse to look= +• [W], [A], [S] and [D] to move= +• [E] to sprint= +• [Space] to jump or move upwards= +• [Shift] to sneak or move downwards= +• Mouse wheel or [1]-[9] to select item= +• Left-click to mine blocks or attack= +• Recover from swings to deal full damage= +• Right-click to build blocks and use things= +• [I] for the inventory= +• First items in inventory appear in hotbar below= +• Lowest row in inventory appears in hotbar below= +• [Esc] to close this window= +How to play:= +• Punch a tree trunk until it breaks and collect wood= +• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks= +• Place them in a 2×2 shape in the crafting grid to craft a crafting table= +• Place the crafting table on the ground= +• Rightclick it for a 3×3 crafting grid= +• Use the crafting guide (book icon) to learn all the possible crafting recipes= +• Craft a wooden pickaxe so you can dig stone= +• Different tools break different kinds of blocks. Try them out!= +• Read entries in this help to learn the rest= +• Continue playing as you wish. There's no goal. Have fun!= +Minetest= +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).= +The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.= +A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.= +Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.= +Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .= +Minetest as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly.= +Sneaking= +Sneaking makes you walk slower and prevents you from falling off the edge of a block.= +To sneak, hold down the sneak key (default: [Shift]). When you release it, you stop sneaking. Careful: When you release the sneak key at a ledge, you might fall!= +• Sneak: [Shift]= +Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.= +If you jump while holding the sneak key, you also jump slightly higher than usual.= +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.= +Controls= +These are the default controls:= +Basic movement:= +• Moving the mouse around: Look around= +• W: Move forwards= +• A: Move to the left= +• D: Move to the right= +• S: Move backwards= +• E: Sprint= +While standing on solid ground:= +• Space: Jump= +• Shift: Sneak= +While on a ladder, swimming in a liquid or fly mode is active= +• Space: Move up= +• Shift: Move down= +Extended movement (requires privileges):= +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)= +• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)= +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)= +• E: Move even faster when in fast mode= +• E: Walk fast in fast mode= +World interaction:= +• Left mouse button: Punch / mine blocks / take items= +• Left mouse button: Punch / mine blocks= +• Right mouse button: Build or use pointed block= +• Shift+Right mouse button: Build= +• Roll mouse wheel: Select next/previous item in hotbar= +• Roll mouse wheel / B / N: Select next/previous item in hotbar= +• 1-9: Select item in hotbar directly= +• Q: Drop item stack= +• Shift+Q: Drop 1 item= +• I: Show/hide inventory menu= +Inventory interaction:= +See the entry “Basics > Inventory”.= +Camera:= +• Z: Zoom= +• F7: Toggle camera mode= +• F8: Toggle cinematic mode= +Interface:= +• Esc: Open menu window (pauses in single-player mode) or close window= +• F1: Show/hide HUD= +• F2: Show/hide chat= +• F9: Toggle minimap= +• Shift+F9: Toggle minimap rotation mode= +• F10: Open/close console/chat log= +• F12: Take a screenshot= +Server interaction:= +• T: Open chat window (chat requires the “shout” privilege)= +• /: Start issuing a server command= +Technical:= +• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)= +• +: Increase minimal viewing distance= +• -: Decrease minimal viewing distance= +• F3: Enable/disable fog= +• F5: Enable/disable debug screen which also shows your coordinates= +• F6: Only useful for developers. Enables/disables profiler= +• P: Only useful for developers. Writes current stack traces= +Players= +Players (actually: “player characters”) are the characters which users control.= +Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).= +Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.= +Players can take damage for a variety of reasons, here are some:= +• Taking fall damage= +• Touching a block which causes direct damage= +• Drowning= +• Being attacked by another player= +• Being attacked by a computer enemy= +At a health of 0, the player dies. The player can just respawn in the world.= +Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.= +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.= +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.= +In multi-player mode, the name of other players is written above their head.= +Items= +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.= +An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.= +Dropped item stacks will be collected automatically when you stand close to them.= +Items have several properties, including the following:= +• Maximum stack size: Number of items which fit on 1 item stack= +• Pointing range: How close things must be to be pointed while wielding this item= +• Group memberships: See “Basics > Groups”= +• May be used for crafting or cooking= +Tools= +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.= +A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.= +When nothing is wielded, players use their hand which may act as tool and weapon.= +Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.= +When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.= +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.= +Weapons= +Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.= +Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:= +• Single punch: Left-click once to deal a single punch= +• Quick punching: Hold down the left mouse button to deal quick repeated punches= +There are two core attributes of melee weapons:= +• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered= +• Full punch interval: Time it takes for fully recovering from a punch= +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.= +There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.= +Pointing= +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.= +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.= +A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.= +Camera= +There are 3 different views which determine the way you see the world. The modes are:= +• 1: First-person view (default)= +• 2: Third-person view from behind= +• 3: Third-person view from the front= +You can change the camera mode by pressing [F7].= +You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.= +Zooming is a gameplay feature that might be enabled or disabled by the game. By default, zooming is enabled when in Creative Mode but disabled otherwise.= +There is also Cinematic Mode which can be toggled with [F8]. With Cinematic Mode enabled, the camera movements become more smooth. Some players don't like it, it is a matter of taste.= +By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.= +• Switch camera mode: [F7]= +• Toggle Cinematic Mode: [F8]= +• Zoom: [Z]= +Blocks= +The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.= +The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.= +Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:= +• Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely= +• Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools= +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools= +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys= +• Drowning damage: See the entry “Basics > Player”= +• Liquids: See the entry “Basics > Liquids”= +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more= +Mining= +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.= +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.= +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:= +• Always drops itself (the usual case)= +• Always drops the same items= +• Drops items based on probability= +• Drops nothing= +Building= +Almost all blocks can be built (or placed). Building is very simple and has no delay.= +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.= +Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.= +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.= +Liquids= +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.= +Liquids usually come in two forms: In source form (S) and in flowing form (F).= +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.= +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.= +All liquids share the following properties:= +• All properties of blocks (including drowning damage)= +• Renewability: Renewable liquids can create new sources= +• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2= +• Viscosity: How slow players move through it and how slow the liquid spreads= +Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:= +• Two renewable liquid blocks of the same type touch each other diagonally= +• These blocks are also on the same height= +• One of the two “corners” is open space which allows liquids to flow in= +When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).= +Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.= +The physics for swimming and diving in a liquid are:= +• The higher the viscosity, the slower you move= +• If you rest, you'll slowly sink= +• There is no fall damage for falling into a liquid as such= +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage= +Liquids are often not pointable. But some special items are able to point all liquids.= +Crafting= +Crafting is the task of combining several items to form a new item.= +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.= +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.= +A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).= +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.= +There are multiple types of crafting recipes:= +• Shaped (image 2): Items need to be placed in a particular shape= +• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)= +• Cooking: Explained in “Basics > Cooking”= +• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%= +In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.= +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.= +Cooking= +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.= +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.= +Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.= +Hotbar= +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.= +You can change the selected item with the mouse wheel or the keyboard.= +• Select previous item in hotbar: [Mouse wheel up] or [B]= +• Select next item in hotbar: [Mouse wheel down] or [N]= +• Select item in hotbar directly: [1]-[9]= +The selected item is also your wielded item.= +Minimap= +If you have a map item in any of your hotbar slots, you can use the minimap.= +Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.= +There are 2 minimap modes and 3 zoom levels.= +Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.= +Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon.= +There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.= +In some games, the minimap may be disabled.= +• Toggle minimap mode: [F9]= +• Toggle minimap rotation mode: [Shift]+[F9]= +Inventory= +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.= +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.= +Blocks can also have their own inventory, e.g. chests and furnaces.= +Inventory controls:= +Taking: You can take items from an occupied slot if the cursor holds nothing.= +• Left click: take entire item stack= +• Right click: take half from the item stack (rounded up)= +• Middle click: take 10 items from the item stack= +• Mouse wheel down: take 1 item from the item stack= +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.= +• Left click: put entire item stack= +• Right click: put 1 item of the item stack= +• Right click or mouse wheel up: put 1 item of the item stack= +• Middle click: put 10 items of the item stack= +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.= +• Click: exchange item stacks= +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.= +Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.= +• Sneak+Left click: Automatically transfer item stack= +Online help= +You may want to check out these online resources related to MineClone 2.= +MineClone 2 download and forum discussion: = +Here you find the most recent version of MineClone 2 and can discuss it.= +Bug tracker: = +Report bugs here.= +Minetest links:= +You may want to check out these online resources related to Minetest:= +Official homepage of Minetest: = +The main place to find the most recent version of Minetest, the engine used by MineClone 2.= +The main place to find the most recent version of Minetest.= +Community wiki: = +A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.= +Minetest forums: = +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.= +Chat: = +A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.= +Groups= +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:= +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups= +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups= +• Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group= +• Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”= +• Other uses= +In the item help, many important groups are usually mentioned and explained.= +Glossary= +This is a list of commonly used terms:= +Controls:= +• Wielding: Holding an item in hand= +• Pointing: Looking with the crosshair at something in range= +• Dropping: Throwing an item or item stack to the ground= +• Punching: Attacking with left-click, is also used on blocks= +• Sneaking: Walking slowly while (usually) avoiding to fall over edges= +• Climbing: Moving up or down a climbable block= +Blocks:= +• Block: Cubes that the worlds are made of= +• Mining/digging: Using a mining tool to break a block= +• Building/placing: Putting a block somewhere= +• Drop: Items you get after mining a block= +• Using a block: Right-clicking a block to access its special function= +Items:= +• Item: A single thing that players can possess= +• Item stack: A collection of items of the same kind= +• Maximum stack size: Maximum amount of items in an item stack= +• Slot / inventory slot: Can hold one item stack= +• Inventory: Provides several inventory slots for storage= +• Player inventory: The main inventory of a player= +• Tool: An item which you can use to do special things with when wielding= +• Range: How far away things can be to be pointed by an item= +• Mining tool: A tool which allows to break blocks= +• Craftitem: An item which is (primarily or only) used for crafting= +Gameplay:= +• “heart”: A single health symbol, indicates 2 HP= +• “bubble”: A single breath symbol, indicates 1 BP= +• HP: Hit point (equals half 1 “heart”)= +• BP: Breath point, indicates breath when diving= +• Mob: Computer-controlled enemy= +• Crafting: Combining multiple items to create new ones= +• Crafting guide: A helper which shows available crafting recipes= +• Spawning: Appearing in the world= +• Respawning: Appearing again in the world after death= +• Group: Puts similar things together, often affects gameplay= +• noclip: Allows to fly through walls= +Interface= +• Hotbar: Inventory slots at the bottom= +• Statbar: Indicator made out of half-symbols, used for health and breath= +• Minimap: The map or radar at the top right= +• Crosshair: Seen in the middle, used to point at things= +Online multiplayer:= +• PvP: Player vs Player. If active, players can deal damage to each other= +• Griefing: Destroying the buildings of other players against their will= +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside= +Technical terms:= +• Minetest: This game engine= +• MineClone 2: What you play right now= +• Minetest Game: A game for Minetest by the Minetest developers= +• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar= +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them= +• Privilege: Allows a player to do something= +• Node: Other word for “block”= +Settings= +There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.= +These are a few of the most important gameplay settings:= +• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal= +• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the game; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.= +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other= +For a full list of all available settings, use the “All Settings” dialog in the main menu.= +Movement modes= +You can enable some special movement modes that change how you move.= +Pitch movement mode:= +• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.= +• Default key: [L]= +• No privilege required= +Fast mode:= +• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.= +• Default key: [J]= +• Required privilege: fast= +Fly mode:= +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.= +• Default key: [K]= +• Required privilege: fly= +Noclip mode:= +• Description: Allows you to move through walls. Only works when fly mode is enabled, too.= +• Default key: [H]= +• Required privilege: noclip= +Console= +With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.= +Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.= +Use the chat to communicate with other players. This requires you to have the “shout” privilege.= +Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.= +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .= +There are some special controls for the console:= +• [F10] Open/close console= +• [Enter]: Send message or command= +• [Tab]: Try to auto-complete a partially-entered player name= +• [Ctrl]+[Left]: Move cursor to the beginning of the previous word= +• [Ctrl]+[Right]: Move cursor to the beginning of the next word= +• [Ctrl]+[Backspace]: Delete previous word= +• [Ctrl]+[Delete]: Delete next word= +• [Ctrl]+[U]: Delete all text before the cursor= +• [Ctrl]+[K]: Delete all text after the cursor= +• [Page up]: Scroll up= +• [Page down]: Scroll down= +There is also an input history. Minetest saves your previous console inputs which you can quickly access later:= +• [Up]: Go to previous entry in history= +• [Down]: Go to next entry in history= +Server commands= +Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.= +Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.= +To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.= +Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.= +“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.= +Commands are followed by zero or more parameters.= +In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:= +• Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter= +• Anything in square brackets (e.g. “[text]”) is optional and can be omitted= +• Pipe or slash (e.g. “text1 | text2 | text3”): Alternation. One of multiple texts must be used (e.g. “text2”)= +• Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations= +• Everything else is to be read as literal text= +Here are some examples to illustrate the command syntax:= +• /mods: No parameters. Just enter “/mods”= +• /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”= +• /give : Two parameters. Example: “/give Player default:apple”= +• /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”= +• /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”= +Some final remarks:= +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege= +• For /spawnentity you need an entity name, which is another identifier= +Privileges= +Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.= +On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.= +There is a small set of core privileges which you'll find on every server, other privileges might be added by mods.= +To view your own privileges, issue the server command “/privs”.= +Here are a few basic privilege-related commands:= +• /privs: Lists your privileges= +• /privs : Lists the privileges of = +• /help privs: Shows a list and description about all privileges= +Players with the “privs” privilege can modify privileges at will:= +• /grant : Grant to = +• /revoke : Revoke from = +In single-player mode, you can use “/grantme all” to unlock all abilities.= +Light= +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).= +There are two types of light: Sunlight and artificial light.= +Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.= +Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.= +Blocks have 3 levels of transparency:= +• Transparent: Sunlight goes through limitless, artificial light goes through with losses= +• Semi-transparent: Sunlight and artificial light go through with losses= +• Opaque: No light passes through= +Artificial light will lose one level of brightness for each transparent or semi-transparent block it passes through, until only darkness remains (image 1).= +Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.= +Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.= +Coordinates= +The world is a large cube. And because of this, a position in the world can be easily expressed with Cartesian coordinates. That is, for each position in the world, there are 3 values X, Y and Z.= +Like this: (5, 45, -12)= +This refers to the position where X@=5, Y@=45 and Z@=-12. The 3 letters are called “axes”: Y is for the height. X and Z are for the horizontal position.= +The values for X, Y and Z work like this:= +• If you go up, Y increases= +• If you go down, Y decreases= +• If you follow the sun, X increases= +• If you go to the reverse direction, X decreases= +• Follow the sun, then go right: Z increases= +• Follow the sun, then go left: Z decreases= +• The side length of a full cube is 1= +You can view your current position in the debug screen (open with [F5]).= + +# MCL2 extensions +Creative Mode= +Enabling Creative Mode in MineClone 2 applies the following changes:= +• You keep the things you've placed= +• Creative inventory is available to obtain most items easily= +• Hand breaks all default blocks instantly= +• Greatly increased hand pointing range= +• Mined blocks don't drop items= +• Items don't get used up= +• Tools don't wear off= +• You can eat food whenever you want= +• You can always use the minimap (including radar mode)= +Damage is not affected by Creative Mode, it needs to be disabled separately.= +Mobs= +Mobs are the living beings in the world. This includes animals and monsters.= +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).= +Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.= +Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.= +Animals= +Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.= +Feeding:= +Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.= +Animals are attraced to the food they like and follow you as long you hold the food item in hand.= +Feeding an animal has three uses: Taming, healing and breeding.= +Feeding heals animals instantly, depending on the quality of the food item.= +Taming:= +A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.= +Breeding:= +When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.= +Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.= +Baby animals:= +Baby animals are just like their adult couterparts, but they can't be tamed or bred and don't drop anything when they die. They grow to adults after a short time. When fed, they grow to adults faster.= +Hunger= +Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.= +Core hunger rules:= +• You start with 20/20 hunger points (more points @= less hungry)= +• Actions like combat, jumping, sprinting, etc. decrease hunger points= +• Food restores hunger points= +• If your hunger bar decreases, you're hungry= +• At 18-20 hunger points, you regenerate 1 HP every 4 seconds= +• At 6 hunger points or less, you can't sprint= +• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)= +• Poisonous food decreases your health= +Details:= +You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.= +Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.= +Each food item increases both your hunger level as well your saturation.= +Food with a high saturation boost has the advantage that it will take longer until you get hungry again.= +A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.= +You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.= +If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.= +Saturation decreases by doing things which exhaust you (highest exhaustion first):= +• Regenerating 1 HP= +• Suffering food poisoning= +• Sprint-jumping= +• Sprinting= +• Attacking= +• Taking damage= +• Swimming= +• Jumping= +• Mining a block= +Other actions, like walking, do not exaust you.= +If you have a map item in any of your hotbar slots, you can use the minimap.= diff --git a/mods/HELP/mcl_doc_basics/mcl_extension.lua b/mods/HELP/mcl_doc_basics/mcl_extension.lua new file mode 100644 index 00000000..c6f9f0aa --- /dev/null +++ b/mods/HELP/mcl_doc_basics/mcl_extension.lua @@ -0,0 +1,97 @@ +local S = minetest.get_translator("mcl_doc_basics") + +doc.add_entry("advanced", "creative", { + name = S("Creative Mode"), + data = { text = +S("Enabling Creative Mode in MineClone 2 applies the following changes:").."\n\n".. + +S("• You keep the things you've placed").."\n".. +S("• Creative inventory is available to obtain most items easily").."\n".. +S("• Hand breaks all default blocks instantly").."\n".. +S("• Greatly increased hand pointing range").."\n".. +S("• Mined blocks don't drop items").."\n".. +S("• Items don't get used up").."\n".. +S("• Tools don't wear off").."\n".. +S("• You can eat food whenever you want").."\n".. +S("• You can always use the minimap (including radar mode)").."\n\n".. + +S("Damage is not affected by Creative Mode, it needs to be disabled separately.") +}}) + +doc.add_entry("basics", "mobs", { + name = S("Mobs"), + data = { text = +S("Mobs are the living beings in the world. This includes animals and monsters.").."\n\n".. + +S("Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).").."\n\n".. + +S("Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.").."\n\n".. + +S("Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.") +}}) + +doc.add_entry("basics", "animals", { + name = S("Animals"), + data = { text = +S("Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.").."\n\n".. + +S("Feeding:").."\n".. +S("Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.").."\n".. +S("Animals are attraced to the food they like and follow you as long you hold the food item in hand.").."\n".. +S("Feeding an animal has three uses: Taming, healing and breeding.").."\n".. +S("Feeding heals animals instantly, depending on the quality of the food item.").."\n\n".. + +S("Taming:").."\n".. +S("A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.").."\n\n".. + +S("Breeding:").."\n".. +S("When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.").."\n".. +S("Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.").."\n\n".. + +S("Baby animals:").."\n".. +S("Baby animals are just like their adult couterparts, but they can't be tamed or bred and don't drop anything when they die. They grow to adults after a short time. When fed, they grow to adults faster.") + +}}) + +doc.add_entry("basics", "hunger", { + name = S("Hunger"), + data = { text = +S("Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.").."\n\n".. + +S("Core hunger rules:").."\n\n".. +S("• You start with 20/20 hunger points (more points = less hungry)").."\n".. +S("• Actions like combat, jumping, sprinting, etc. decrease hunger points").."\n".. +S("• Food restores hunger points").."\n".. +S("• If your hunger bar decreases, you're hungry").."\n".. +S("• At 18-20 hunger points, you regenerate 1 HP every 4 seconds").."\n".. +S("• At 6 hunger points or less, you can't sprint").."\n".. +S("• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)").."\n".. +S("• Poisonous food decreases your health").."\n\n".. + + +S("Details:").."\n\n".. +S("You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.").."\n".. +S("Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.").."\n\n".. + +S("Each food item increases both your hunger level as well your saturation.").."\n".. +S("Food with a high saturation boost has the advantage that it will take longer until you get hungry again.").."\n".. +S("A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.").."\n\n".. + +S("You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.").."\n".. +S("If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.").."\n\n".. + +S("Saturation decreases by doing things which exhaust you (highest exhaustion first):").."\n".. +S("• Regenerating 1 HP").."\n".. +S("• Suffering food poisoning").."\n".. +S("• Sprint-jumping").."\n".. +S("• Sprinting").."\n".. +S("• Attacking").."\n".. +S("• Taking damage").."\n".. +S("• Swimming").."\n".. +S("• Jumping").."\n".. +S("• Mining a block").."\n\n".. + +S("Other actions, like walking, do not exaust you.") + +}}) + diff --git a/mods/HELP/mcl_doc_basics/mod.conf b/mods/HELP/mcl_doc_basics/mod.conf index 8138f7d8..52561904 100644 --- a/mods/HELP/mcl_doc_basics/mod.conf +++ b/mods/HELP/mcl_doc_basics/mod.conf @@ -1 +1,3 @@ -name = doc_basics +name = mcl_doc_basics +depends = doc +description = Adds some help texts explaining how to use MineClone 2. diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_build.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_build.png index 3f89001f..0d071ddc 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_build.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_build.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_behind.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_behind.png index 2f17e475..72e05b82 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_behind.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_behind.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_ego.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_ego.png index 98b533d2..5484190d 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_ego.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_ego.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_front.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_front.png index 71adb89f..a6cba11f 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_front.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_camera_front.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_grid.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_grid.png index bff1f91b..b504c87c 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_grid.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_grid.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_1.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_1.png index 878bc681..4e95e1c9 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_1.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_1.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_2.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_2.png index eb23f5e0..299a5bac 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_2.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_2.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_3.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_3.png index 149dc61d..c127f51c 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_3.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_groups_3.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_repair.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_repair.png index fa21ddf9..7586c19a 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_repair.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_repair.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shaped.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shaped.png index a5e2f8e7..cd93754b 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shaped.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shaped.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shapeless_1.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shapeless_1.png index 68fb5811..b206b6cd 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shapeless_1.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shapeless_1.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shapeless_2.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shapeless_2.png index 77a45691..f7895380 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shapeless_2.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_craft_shapeless_2.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_carbone_ng.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_carbone_ng.png index 7ac6178f..aa4fdec0 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_carbone_ng.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_carbone_ng.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_hades.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_hades.png index debc08f8..90b5477f 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_hades.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_hades.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_lott.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_lott.png index db27d0ac..0ae9c11c 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_lott.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_lott.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_moontest.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_moontest.png index 47ea2192..6c4728d3 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_moontest.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_moontest.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_mtg_1.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_mtg_1.png index d85d1cce..7272de5e 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_mtg_1.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_mtg_1.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_mtg_2.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_mtg_2.png index 1ab57ba3..c565d1b7 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_mtg_2.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_mtg_2.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_outback.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_outback.png index 540f4bbe..c8c29d31 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_outback.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_outback.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_pixture.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_pixture.png index ead1a160..3b586b9b 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_pixture.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_pixture.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_xtraores_xtension.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_xtraores_xtension.png index 7b195750..e757dd3d 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_xtraores_xtension.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_gameplay_xtraores_xtension.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_hotbar.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_hotbar.png index 406f94db..95863969 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_hotbar.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_hotbar.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_hotbar_relations.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_hotbar_relations.png index 4286d274..dc46cad7 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_hotbar_relations.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_hotbar_relations.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_inventory.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_inventory.png index d23632f9..1fca40cb 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_inventory.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_inventory.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_inventory_detail.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_inventory_detail.png index 631daa6e..95522ef9 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_inventory_detail.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_inventory_detail.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_items_dropped.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_items_dropped.png index 4cbe82db..9ebb142c 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_items_dropped.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_items_dropped.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_light_test.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_light_test.png index 49f15036..7e09a4c1 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_light_test.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_light_test.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_light_torch.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_light_torch.png index d64fdedd..a35ee4d3 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_light_torch.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_light_torch.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_nonrenewable.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_nonrenewable.png index a0d238ac..5501ce79 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_nonrenewable.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_nonrenewable.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_range.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_range.png index 622e98de..92eb9db0 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_range.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_range.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_renewable_1.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_renewable_1.png index ffb23fd1..bada9c77 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_renewable_1.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_renewable_1.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_renewable_2.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_renewable_2.png index 0eb44c54..1a0ec43e 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_renewable_2.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_renewable_2.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_types.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_types.png index ac72b0cf..196371c3 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_types.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_liquids_types.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_map.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_map.png index b574f8b0..3b504f3d 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_map.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_map.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_radar.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_radar.png index a743d6d9..0bfda651 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_radar.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_radar.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_round.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_round.png index 083903d3..65e82a8f 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_round.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_minimap_round.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_nodes.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_nodes.png index 9f436ca3..0ae1c2f7 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_nodes.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_nodes.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_players_flat.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_players_flat.png index 868cdb64..e4fc875a 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_players_flat.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_players_flat.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_players_lott.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_players_lott.png index 7427f2a7..a576d5a4 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_players_lott.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_players_lott.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_players_sam.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_players_sam.png index afcd3111..93bc6d8b 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_players_sam.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_players_sam.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_pointing.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_pointing.png index 23b0dff1..9c1929ae 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_pointing.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_pointing.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_sneak.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_sneak.png index 00325a2a..bdebec20 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_sneak.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_sneak.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_tools.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_tools.png index 9bd63934..1c16628e 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_tools.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_tools.png differ diff --git a/mods/HELP/mcl_doc_basics/textures/doc_basics_tools_mining.png b/mods/HELP/mcl_doc_basics/textures/doc_basics_tools_mining.png index 8655c5e2..aa3613f3 100644 Binary files a/mods/HELP/mcl_doc_basics/textures/doc_basics_tools_mining.png and b/mods/HELP/mcl_doc_basics/textures/doc_basics_tools_mining.png differ diff --git a/mods/HELP/mcl_tt/depends.txt b/mods/HELP/mcl_tt/depends.txt new file mode 100644 index 00000000..c49c556e --- /dev/null +++ b/mods/HELP/mcl_tt/depends.txt @@ -0,0 +1 @@ +tt diff --git a/mods/HELP/mcl_tt/init.lua b/mods/HELP/mcl_tt/init.lua new file mode 100644 index 00000000..569dbe68 --- /dev/null +++ b/mods/HELP/mcl_tt/init.lua @@ -0,0 +1,103 @@ +local S = minetest.get_translator("mcl_tt") + +-- Armor +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + local s = "" + local head = minetest.get_item_group(itemstring, "armor_head") + local torso = minetest.get_item_group(itemstring, "armor_torso") + local legs = minetest.get_item_group(itemstring, "armor_legs") + local feet = minetest.get_item_group(itemstring, "armor_feet") + if head > 0 then + s = s .. S("Head armor") + end + if torso > 0 then + s = s .. S("Torso armor") + end + if legs > 0 then + s = s .. S("Legs armor") + end + if feet > 0 then + s = s .. S("Feet armor") + end + if s == "" then + s = nil + end + return s +end) +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + local s = "" + local use = minetest.get_item_group(itemstring, "mcl_armor_uses") + local pts = minetest.get_item_group(itemstring, "mcl_armor_points") + if pts > 0 then + s = s .. S("Armor points: @1", pts) + s = s .. "\n" + end + if use > 0 then + s = s .. S("Armor durability: @1", use) + end + if s == "" then + s = nil + end + return s +end) +-- Horse armor +tt.register_snippet(function(itemstring) + local armor_g = minetest.get_item_group(itemstring, "horse_armor") + if armor_g and armor_g > 0 then + return S("Protection: @1%", 100 - armor_g) + end +end) + +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + local s = "" + if def.groups.eatable and def.groups.eatable > 0 then + s = s .. S("Hunger points: +@1", def.groups.eatable) + end + if def._mcl_saturation and def._mcl_saturation > 0 then + if s ~= "" then + s = s .. "\n" + end + s = s .. S("Saturation points: +@1", string.format("%.1f", def._mcl_saturation)) + end + if s == "" then + s = nil + end + return s +end) + +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + if minetest.get_item_group(itemstring, "crush_after_fall") == 1 then + return S("Deals damage when falling"), "#FFFF00" + end +end) + +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + if def.groups.place_flowerlike == 1 then + return S("Grows on grass blocks or dirt") + elseif def.groups.place_flowerlike == 2 then + return S("Grows on grass blocks, podzol, dirt or coarse dirt") + end +end) + +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + if def.groups.flammable then + return S("Flammable") + end +end) + +tt.register_snippet(function(itemstring) + if itemstring == "mcl_heads:zombie" then + return S("Zombie view range: -50%") + elseif itemstring == "mcl_heads:skeleton" then + return S("Skeleton view range: -50%") + elseif itemstring == "mcl_heads:creeper" then + return S("Creeper view range: -50%") + end +end) + diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.de.tr b/mods/HELP/mcl_tt/locale/mcl_tt.de.tr new file mode 100644 index 00000000..f793e59a --- /dev/null +++ b/mods/HELP/mcl_tt/locale/mcl_tt.de.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_tt +Head armor=Kopfrüstung +Torso armor=Torsorüstung +Legs armor=Beinrüstung +Feet armor=Fußrüstung +Armor points: @1=Rüstungspunkte: @1 +Armor durability: @1=Rüstungshaltbarkeit: @1 +Protection: @1%=Schutz: @1% +Hunger points: +@1=Hungerpunkte: +@1 +Saturation points: +@1=Sättigungspunkte: +@1 +Deals damage when falling=Macht Schaden beim Fallen +Grows on grass blocks or dirt=Wächst auf Grasblöcken oder Erde +Grows on grass blocks, podzol, dirt or coarse dirt=Wächst auf Grasblöcken, Podsol, Erde oder grober Erde +Flammable=Entzündlich +Zombie view range: -50%=Zombiesichtweite: -50% +Skeleton view range: -50%=Skelettsichtweite: -50% +Creeper view range: -50%=Creepersichtweite: -50% diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.fr.tr b/mods/HELP/mcl_tt/locale/mcl_tt.fr.tr new file mode 100644 index 00000000..e3a9ec0b --- /dev/null +++ b/mods/HELP/mcl_tt/locale/mcl_tt.fr.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_tt +Head armor=Armure de tête +Torso armor=Armure de torse +Legs armor=Armure de jambes +Feet armor=Armure de pieds +Armor points: @1=Points d'armure: @1 +Armor durability: @1=Durabilité d'armure: @1 +Protection: @1%=Protection: @1% +Hunger points: +@1=Points de faim: +@1 +Saturation points: +@1=Points de saturation: +@1 +Deals damage when falling=Inflige des dégâts en tombant +Grows on grass blocks or dirt=Pousse sur des blocs d'herbe ou de terre +Grows on grass blocks, podzol, dirt or coarse dirt=Pousse sur les blocs de gazon, le podzol, la terre ou la terre grossière +Flammable=Inflammable +Zombie view range: -50%=Distance de vue de Zombie: -50% +Skeleton view range: -50%=Distance de vue de Squelette: -50% +Creeper view range: -50%=Distance de vue de Creeper: -50% diff --git a/mods/HELP/mcl_tt/locale/template.txt b/mods/HELP/mcl_tt/locale/template.txt new file mode 100644 index 00000000..357830bc --- /dev/null +++ b/mods/HELP/mcl_tt/locale/template.txt @@ -0,0 +1,17 @@ +# textdomain: mcl_tt +Head armor= +Torso armor= +Legs armor= +Feet armor= +Armor points: @1= +Armor durability: @1= +Protection: @1%= +Hunger points: +@1= +Saturation points: +@1= +Deals damage when falling= +Grows on grass blocks or dirt= +Grows on grass blocks, podzol, dirt or coarse dirt= +Flammable= +Zombie view range: -50%= +Skeleton view range: -50%= +Creeper view range: -50%= diff --git a/mods/HELP/modpack.conf b/mods/HELP/modpack.conf new file mode 100644 index 00000000..b53ceb61 --- /dev/null +++ b/mods/HELP/modpack.conf @@ -0,0 +1,2 @@ +name = HELP +description = Meta-modpack containing help-related mods for MineClone 2 diff --git a/mods/HELP/modpack.txt b/mods/HELP/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/HELP/tt/API.md b/mods/HELP/tt/API.md new file mode 100644 index 00000000..0f24e472 --- /dev/null +++ b/mods/HELP/tt/API.md @@ -0,0 +1,33 @@ +# 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 +* `_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 + +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/HELP/tt/README.md b/mods/HELP/tt/README.md new file mode 100644 index 00000000..ca76902e --- /dev/null +++ b/mods/HELP/tt/README.md @@ -0,0 +1,12 @@ +# Extended Tooltip (`tt`) +This mod extends the tooltip of items to add more informative texts. + +It displays the following useful information: +* Weapon damage and speed +* Tool properties +* Noteworthy block properties +* Food satiation +* Custom help text (added by mods) + +## License +MIT License. diff --git a/mods/HELP/tt/init.lua b/mods/HELP/tt/init.lua new file mode 100644 index 00000000..1e639bae --- /dev/null +++ b/mods/HELP/tt/init.lua @@ -0,0 +1,55 @@ +local S = minetest.get_translator("tt") + +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 + +-- Register core snippets + +dofile(minetest.get_modpath(minetest.get_current_modname()).."/snippets_core.lua") +dofile(minetest.get_modpath(minetest.get_current_modname()).."/snippets_builtin.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/HELP/tt/locale/template.txt b/mods/HELP/tt/locale/template.txt new file mode 100644 index 00000000..b5f11762 --- /dev/null +++ b/mods/HELP/tt/locale/template.txt @@ -0,0 +1,31 @@ +# textdomain:tt +Damage: @1= +Damage (@1): @2= +Healing: @1= +Healing (@1): @2= +Full punch interval: @1s= +Contact damage: @1 per second= +Contact healing: @1 per second= +Drowning damage: @1= +Bouncy (@1%)= +Luminance: @1= +Slippery= +Climbable= +Climbable (only downwards)= +No jumping= +No swimming upwards= +No rising= +Fall damage: @1%= +Fall damage: +@1%= +No fall damage= +Mining speed: @1= +Very fast= +Extremely fast= +Fast= +Slow= +Very slow= +Painfully slow= +Mining durability: @1= +Block breaking strength: @1= +@1 uses= +Unlimited uses= diff --git a/mods/HELP/tt/locale/tt.de.tr b/mods/HELP/tt/locale/tt.de.tr new file mode 100644 index 00000000..508787de --- /dev/null +++ b/mods/HELP/tt/locale/tt.de.tr @@ -0,0 +1,31 @@ +# textdomain:tt +Damage: @1=Schaden: @1 +Damage (@1): @2=Schaden (@1): @2 +Healing: @1=Heilung: @1 +Healing (@1): @2=Heilung (@1): @2 +Full punch interval: @1s=Zeit zum Ausholen: @1s +Contact damage: @1 per second=Kontaktschaden: @1 pro Sekunde +Contact healing: @1 per second=Kontaktheilung: @1 pro Sekunde +Drowning damage: @1=Ertrinkensschaden: @1 +Bouncy (@1%)=Sprunghaft (@1%) +Luminance: @1=Lichtstärke: @1 +Slippery=Rutschig +Climbable=Erkletterbar +Climbable (only downwards)=Erkletterbar (nur nach unten) +No jumping=Kein Springen +No swimming upwards=Kein nach oben schwimmen +No rising=Kein Aufsteigen +Fall damage: @1%=Fallschaden: @1% +Fall damage: +@1%=Fallschaden: +@1% +No fall damage=Kein Fallschaden +Mining speed: @1=Grabegeschwindigkeit: @1 +Very fast=Sehr schnell +Extremely fast=Extrem schnell +Fast=Schnell +Slow=Langsam +Very slow=Sehr langsam +Painfully slow=Furchtbar langsam +Mining durability: @1=Grabehaltbarkeit: @1 +Block breaking strength: @1=Blockbruchstärke: @1 +@1 uses=@1 Verwendungen +Unlimited uses=Unbegrenzte Verwendungen diff --git a/mods/HELP/tt/locale/tt.fr.tr b/mods/HELP/tt/locale/tt.fr.tr new file mode 100644 index 00000000..70bc43ff --- /dev/null +++ b/mods/HELP/tt/locale/tt.fr.tr @@ -0,0 +1,31 @@ +# textdomain:tt +Damage: @1=Dégâts: @1 +Damage (@1): @2=Dégâts (@1): @2 +Healing: @1=Guérison: @1 +Healing (@1): @2=Guérison (@1): @2 +Full punch interval: @1s=Intervalle de coup: @1s +Contact damage: @1 per second=Dégâts de contact: @1 par seconde +Contact healing: @1 per second=Guérison de contact: @1 par seconde +Drowning damage: @1=Dégâts de noyade: @1 +Bouncy (@1%)=Rebondissant (@1%) +Luminance: @1=Luminance: @1 +Slippery=Glissant +Climbable=Grimpable +Climbable (only downwards)=Grimpable (uniquement vers le bas) +No jumping=Ne pas sauter +No swimming upwards=Ne pas nager vers le haut +No rising=Pas de montée +Fall damage: @1%=Dégâts de chute: @1% +Fall damage: +@1%=Dégâts de chute: +@1% +No fall damage=Pas de dégâts de chute +Mining speed: @1=Vitesse de minage: @1 +Very fast=Très rapide +Extremely fast=Extremement rapide +Fast=Rapide +Slow=Lent +Very slow=Très lent +Painfully slow=Péniblement lent +Mining durability: @1=Durabilité de minage: @1 +Block breaking strength: @1=Résistance à la rupture: @1 +@1 uses=@1 utilisations +Unlimited uses=Utilisations illimitées diff --git a/mods/HELP/tt/mod.conf b/mods/HELP/tt/mod.conf new file mode 100644 index 00000000..aee1572f --- /dev/null +++ b/mods/HELP/tt/mod.conf @@ -0,0 +1,2 @@ +name = tt +description = Appends a helpful tooltip to the item description diff --git a/mods/HELP/tt/snippets_builtin.lua b/mods/HELP/tt/snippets_builtin.lua new file mode 100644 index 00000000..b61cc7cc --- /dev/null +++ b/mods/HELP/tt/snippets_builtin.lua @@ -0,0 +1,250 @@ +local S = minetest.get_translator("tt") + +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 + +-- Digging capabilities of tool +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + if not def.tool_capabilities then + return + end + local groupcaps = def.tool_capabilities.groupcaps + if not groupcaps then + return + end + local minestring = "" + local capstr = "" + local caplines = 0 + for k,v in pairs(groupcaps) do + local speedstr = "" + local miningusesstr = "" + -- Mining capabilities + caplines = caplines + 1 + local maxlevel = v.maxlevel + if not maxlevel then + -- Default from tool.h + maxlevel = 1 + end + + -- Digging speed + local speed_class = def.groups and def.groups.dig_speed_class + if speed_class == 1 then + speedstr = S("Painfully slow") + elseif speed_class == 2 then + speedstr = S("Very slow") + elseif speed_class == 3 then + speedstr = S("Slow") + elseif speed_class == 4 then + speedstr = S("Fast") + elseif speed_class == 5 then + speedstr = S("Very fast") + elseif speed_class == 6 then + speedstr = S("Extremely fast") + elseif speed_class == 7 then + speedstr = S("Instantaneous") + end + + -- Number of mining uses + local base_uses = v.uses + if not base_uses then + -- Default from tool.h + base_uses = 20 + end + if def._doc_items_durability == nil and base_uses > 0 then + local real_uses = base_uses * math.pow(3, maxlevel) + if real_uses < 65535 then + miningusesstr = S("@1 uses", real_uses) + else + miningusesstr = S("Unlimited uses") + end + end + + if speedstr ~= "" then + capstr = capstr .. S("Mining speed: @1", speedstr) .. "\n" + end + if miningusesstr ~= "" then + capstr = capstr .. S("Mining durability: @1", miningusesstr) .. "\n" + end + + -- Only show one group at max + break + end + if caplines > 0 then + -- Capabilities + minestring = minestring .. capstr + -- Max. drop level + local mdl = def.tool_capabilities.max_drop_level + if not def.tool_capabilities.max_drop_level then + mdl = 0 + end + minestring = minestring .. S("Block breaking strength: @1", mdl) + end + + local weaponstring = "" + -- 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 + end + weaponstring = newline(weaponstring) + weaponstring = weaponstring .. msg + end + local full_punch_interval = def.tool_capabilities.full_punch_interval + if not full_punch_interval then + full_punch_interval = 1 + end + weaponstring = newline(weaponstring) + weaponstring = weaponstring .. S("Full punch interval: @1s", string.format("%.2f", full_punch_interval)) + end + + local ret + if minetest.get_item_group(itemstring, "weapon") == 1 then + ret = weaponstring + ret = newline(ret) + ret = ret .. minestring + else + ret = minestring + ret = newline(ret) + ret = ret .. weaponstring + end + + if ret == "" then + ret = nil + end + return ret +end) + +-- Weapon stats +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] +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 = S("+@1 food points", def._tt_food_hp) + 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 + local 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/HELP/tt/snippets_core.lua b/mods/HELP/tt/snippets_core.lua new file mode 100644 index 00000000..cc67a10c --- /dev/null +++ b/mods/HELP/tt/snippets_core.lua @@ -0,0 +1,11 @@ +-- CORE 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/HUD/awards/api.lua b/mods/HUD/awards/api.lua index 4fdab6fb..325c3516 100644 --- a/mods/HUD/awards/api.lua +++ b/mods/HUD/awards/api.lua @@ -29,10 +29,7 @@ function awards.save() end end -local S = function(s) return s end -function awards.set_intllib(locale) - S = locale -end +local S = minetest.get_translator("awards") function awards.init() awards.players = awards.load() @@ -181,6 +178,11 @@ function awards.clear_player(name) awards.players[name] = {} end +-- Returns true if award exists, false otherwise +function awards.exists(award) + return awards.def[award] ~= nil +end + -- This function is called whenever a target condition is met. -- It checks if a player already has that achievement, and if they do not, -- it gives it to them @@ -262,7 +264,7 @@ function awards.unlock(name, award) -- Enforce sound delay to prevent sound spamming local lastsound = awards.players[name].lastsound if lastsound == nil or os.difftime(os.time(), lastsound) >= 1 then - minetest.sound_play(sound, {to_player=name}) + minetest.sound_play(sound, {to_player=name}, true) awards.players[name].lastsound = os.time() end end @@ -277,9 +279,9 @@ function awards.unlock(name, award) elseif awards.show_mode == "chat" then local chat_announce if awdef.secret == true then - chat_announce = S("Secret achievement gotten: %s") + chat_announce = S("Secret achievement gotten: @1") else - chat_announce = S("Achievement gotten: %s") + chat_announce = S("Achievement gotten: @1") end -- use the chat console to send it minetest.chat_send_player(name, string.format(chat_announce, title)) @@ -295,7 +297,8 @@ function awards.unlock(name, award) text = background, position = {x = 0.5, y = 0}, offset = {x = 0, y = 138}, - alignment = {x = 0, y = -1} + alignment = {x = 0, y = -1}, + z_index = 101, }) local hud_announce if awdef.secret == true then @@ -311,7 +314,8 @@ function awards.unlock(name, award) text = hud_announce, position = {x = 0.5, y = 0}, offset = {x = 0, y = 40}, - alignment = {x = 0, y = -1} + alignment = {x = 0, y = -1}, + z_index = 102, }) local three = player:hud_add({ hud_elem_type = "text", @@ -321,7 +325,8 @@ function awards.unlock(name, award) text = title, position = {x = 0.5, y = 0}, offset = {x = 30, y = 100}, - alignment = {x = 0, y = -1} + alignment = {x = 0, y = -1}, + z_index = 102, }) --[[ We use a statbar instead of image here because statbar allows us to scale the image properly. Note that number is 2, thus leading to a single full image. @@ -337,13 +342,18 @@ function awards.unlock(name, award) offset = {x = -110, y = 62}, alignment = {x = 0, y = 0}, direction = 0, + z_index = 102, }) - minetest.after(3, function() + minetest.after(3, function(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end player:hud_remove(one) player:hud_remove(two) player:hud_remove(three) player:hud_remove(four) - end) + end, player:get_player_name()) end end @@ -385,12 +395,14 @@ function awards.getFormspec(name, to, sid) if def and def.title then title = def.title end - local status = "%s" + local status if item.got then - status = S("%s (got)") + status = S("@1 (got)", title) + else + status = title end formspec = formspec .. "label[1,2.75;" .. - string.format(status, minetest.formspec_escape(title)) .. + minetest.formspec_escape(status) .. "]" if def and def.icon then formspec = formspec .. "image[1,0;3,3;" .. def.icon .. "]" @@ -407,8 +419,10 @@ function awards.getFormspec(name, to, sid) if perc > 1 then perc = 1 end - formspec = formspec .. "background[0,4.80;" .. barwidth ..",0.25;awards_progress_gray.png;false]" - formspec = formspec .. "background[0,4.80;" .. (barwidth * perc) ..",0.25;awards_progress_green.png;false]" + formspec = formspec .. "background[0,4.80;" .. barwidth ..",0.3;awards_progress_gray.png;false]" + if perc > 0 then + formspec = formspec .. "background[0,4.80;" .. (barwidth * perc) ..",0.3;awards_progress_green.png;false]" + end if label then formspec = formspec .. "label[1.75,4.63;" .. minetest.formspec_escape(label) .. "]" end @@ -420,7 +434,8 @@ function awards.getFormspec(name, to, sid) end -- Create list box - formspec = formspec .. "textlist[4.75,0;6,5;awards;" + formspec = formspec .. + "textlist[4.75,0;6,5;awards;" local first = true for _,award in pairs(listofawards) do local def = awards.def[award.name] @@ -465,14 +480,14 @@ function awards.show_to(name, to, sid, text) minetest.chat_send_player(to, S("You have not gotten any awards.")) return end - minetest.chat_send_player(to, string.format(S("%s’s awards:"), name)) + minetest.chat_send_player(to, S("@1’s awards:", name)) for _, str in pairs(awards.players[name].unlocked) do local def = awards.def[str] if def then if def.title then if def.description then - minetest.chat_send_player(to, string.format(S("%s: %s"), def.title, def.description)) + minetest.chat_send_player(to, S("@1: @2", def.title, def.description)) else minetest.chat_send_player(to, def.title) end diff --git a/mods/HUD/awards/chat_commands.lua b/mods/HUD/awards/chat_commands.lua index c386c19c..88e799df 100644 --- a/mods/HUD/awards/chat_commands.lua +++ b/mods/HUD/awards/chat_commands.lua @@ -14,12 +14,7 @@ -- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function ( s ) return s end -end +local S = minetest.get_translator("awards") minetest.register_chatcommand("awards", { params = S("[c|clear|disable|enable]"), @@ -43,31 +38,50 @@ minetest.register_chatcommand("awards", { end }) -minetest.register_chatcommand("awd", { - params = S(""), - description = S("Show details of an achievement"), +minetest.register_privilege("achievements", { + description = S("Can give achievements to any player"), + give_to_singleplayer = false, + give_to_admin = false, +}) + +minetest.register_chatcommand("achievement", { + params = S("(grant ( | all)) | list"), + privs = { achievements = true }, + description = S("Give achievement to player or list all achievements"), func = function(name, param) - local def = awards.def[param] - if def then - minetest.chat_send_player(name, string.format(S("%s: %s"), def.title, def.description)) + if param == "list" then + local list = {} + for k,_ in pairs(awards.def) do + table.insert(list, k) + end + table.sort(list) + for a=1, #list do + minetest.chat_send_player(name, S("@1 (@2)", awards.def[list[a]].title, list[a])) + end + return true + end + local keyword, playername, achievement = string.match(param, "([^ ]+) (.+) (.+)") + if not keyword or not playername or not achievement then + return false, S("Invalid syntax.") + end + if keyword ~= "grant" then + return false, S("Invalid action.") + end + local player = minetest.get_player_by_name(playername) + if not player then + return false, S("Player is not online.") + end + if achievement == "all" then + for k,_ in pairs(awards.def) do + awards.unlock(playername, k) + end + return true, S("Done.") + elseif awards.exists(achievement) then + awards.unlock(playername, achievement) + return true, S("Done.") else - minetest.chat_send_player(name, S("Achievement not found.")) + return false, S("Achievement “@1” does not exist.", achievement) end end }) -minetest.register_chatcommand("awpl", { - privs = { - server = true - }, - params = S(""), - description = S("Get the achievements 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/HUD/awards/depends.txt b/mods/HUD/awards/depends.txt index cffd9473..80a448a4 100644 --- a/mods/HUD/awards/depends.txt +++ b/mods/HUD/awards/depends.txt @@ -1,3 +1,2 @@ -intllib? sfinv? unified_inventory? diff --git a/mods/HUD/awards/init.lua b/mods/HUD/awards/init.lua index acf8bfdc..63c9303c 100644 --- a/mods/HUD/awards/init.lua +++ b/mods/HUD/awards/init.lua @@ -14,18 +14,9 @@ -- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- - -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function ( s ) return s end -end - dofile(minetest.get_modpath("awards").."/api.lua") dofile(minetest.get_modpath("awards").."/chat_commands.lua") dofile(minetest.get_modpath("awards").."/sfinv.lua") dofile(minetest.get_modpath("awards").."/unified_inventory.lua") dofile(minetest.get_modpath("awards").."/triggers.lua") -awards.set_intllib(S) diff --git a/mods/HUD/awards/locale/awards.de.tr b/mods/HUD/awards/locale/awards.de.tr new file mode 100644 index 00000000..2fb04c4c --- /dev/null +++ b/mods/HUD/awards/locale/awards.de.tr @@ -0,0 +1,60 @@ +# textdomain:awards +@1: @2=@1: @2 +@1 (got)=@1 (erhalten) +@1’s awards:=Auszeichnungen von @1: +(Secret Award)=(Geheime Auszeichnung) +Achievement gotten!=Auszeichnung erhalten! +Achievement gotten:=Auszeichnung erhalten: +Achievement gotten: @1=Auszeichnung erhalten: @1 +Secret achievement gotten!=Geheime Auszeichnung erhalten! +Secret achievement gotten:=Geheime Auszeichnung erhalten: +Secret achievement gotten: @1=Geheime Auszeichnung erhalten: @1 +Get this achievement to find out what it is.=Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist. +You have not gotten 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. += += +Achievement not found.=Auszeichnung nicht gefunden. +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. +Get the achievements statistics for the given player or yourself=Die Statistik der Auszeichnungen eines Spielers zeigen +List awards in chat (deprecated)=Auszeichnungen im Chat anzeigen (veraltet) +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. +[c|clear|disable|enable]=[c|clear|disable|enable] +Awards=Auszeichnungen +@1/@2 crafted=@1/@2 gefertigt +@1/@2 deaths=@1/@2 Tode +@1/@2 dug=@1/@2 abgebaut +@1/@2 game joins=@1/@2 Spielen beigetreten +@1/@2 lines of chat=@1/@2 Chatzeilen +@1/@2 placed=@1/@2 platziert +Die @1 times.=Sterben Sie @1 mal. +Die.=Sterben Sie. +Craft: @1×@2=Fertigen Sie an: @1×@2 +Craft: @1=Fertigen Sie an: @1 +Mine a block: @1=Bauen Sie einen Block ab: @1 +Mine blocks: @1×@2=Bauen Sie Blöcke ab: @1×@2 +Place a block: @1=Platzieren Sie einen Block: @1 +Place blocks: @1×@2=Platzieren Sie Blöcke: @1×@2 +Join the game.=Treten Sie dem Spiel bei. +Join the game @1 times.=Treten Sie dem Spiel @1 mal bei. +Show details of an achievement=Details einer Auszeichnung anzeigen +OK=OK +Error: No awards available.=Fehler: Keine Auszeichnungen vorhanden. +Eat: @1×@2=Essen Sie: @1×@2 +Eat: @1=Essen Sie: @1 +@1/@2 eaten=@1/@2 gegessen +Place @1 block(s).=Platzieren Sie @1 Blöcke. +Dig @1 block(s).=Bauen Sie @1 Blöcke ab. +Eat @1 item(s).=Essen Sie @1 Dinge. +Craft @1 item(s).=Fertigen Sie @1 Gegenstände. +Can give achievements to any player=Kann Spielern Auszeichnungen vergeben +(grant ( | all)) | list=(grant ( | all)) | list +Give achievement to player or list all achievements=Auszeichnung an Spieler vergeben oder alle Auszeichnungen auflisten +@1 (@2)=@1 (@2) +Invalid syntax.=Ungültige Syntax. +Invalid action.=Ungültige Aktion. +Player is not online.=Spieler ist nicht online. +Done.=Fertig. +Achievement “@1” does not exist.=Auszeichnung »@1« existiert nicht. diff --git a/mods/HUD/awards/locale/awards.es.tr b/mods/HUD/awards/locale/awards.es.tr new file mode 100644 index 00000000..15e8c467 --- /dev/null +++ b/mods/HUD/awards/locale/awards.es.tr @@ -0,0 +1,51 @@ +# textdomain:awards +@1: @2=@1: @2 +@1 (got)=@1 (Completado) +@1’s awards:=Premios de @1: +(Secret Award)=(Premio secreto) +Achievement gotten!=¡Logro conseguido! +Achievement gotten:=Logro conseguido: +Achievement gotten: @1=Logro conseguido: @1 +Secret achievement gotten!=¡Logro secreto conseguido! +Secret achievement gotten:=Logro secreto conseguido: +Secret achievement gotten: @1=Logro secreto conseguido: @1 +Get this achievement to find out what it is.=Obtén este logro para descubrir de qué se trata. +You have not gotten any awards.=No has recibido ningún premio. +You've disabled awards. Type /awards enable to reenable.=Has desactivado los premios. Introduce /awards enable para habilitarlos. += += +Achievement not found.=Logro no encontrado. +All your awards and statistics have been cleared. You can now start again.=Todos sus premios y estadísticas han sido borrados. Ahora puede comenzar de nuevo. +Get the achievements statistics for the given player or yourself=Obtén las estadísticas de logros para el jugador dado o para ti mismo +List awards in chat (deprecated)=Lista de premios en el chat (en desuso) +Show, clear, disable or enable your achievements=Muestra, borra, deshabilita o habilita tus logros +You have disabled your achievements.=Has deshabilitado tus logros. +You have enabled your achievements.=Has habilitado tus logros. +[c|clear|disable|enable]=[c|clear|disable|enable] +Awards=Premios +@1/@2 crafted=@1/@2 fabricado(s) +@1/@2 deaths=@1/@2 muertes +@1/@2 dug=@1/@2 excavado +@1/@2 game joins=@1/@2 inicios de sesión +@1/@2 lines of chat=@1/@2 líneas de chat +@1/@2 placed=@1/@2 metido +Die @1 times.=Muere @1 veces. +Die.=Muere. +Craft: @1×@2=Artista: @1×@2 +Craft: @1=Artista: @1 +Mine a block: @1=Mina un bloque: @1 +Mine blocks: @1×@2=Bloques de minas: @1×@2 +Place a block: @1=Coloca un bloque: @1 +Place blocks: @1×@2=Colocar bloques: @1×@2 +Join the game.=Unirse al juego. +Join the game @1 times.=Unirse al juego @1 veces. +Show details of an achievement=Mostrar detalles de un logro +OK=Aceptar +Error: No awards available.=Error: No hay premios disponibles. +Eat: @1×@2=Comer: @1×@2 +Eat: @1=Comer: @1 +@1/@2 eaten=@1/@2 comido +Place @1 block(s).=Posiciona @1 bloque(s). +Dig @1 block(s).=Cava @1 bloque(s). +Eat @1 item(s).=Come @1 alimento(s). +Craft @1 item(s).=Crea @1 artículo(s). diff --git a/mods/HUD/awards/locale/awards.fr.tr b/mods/HUD/awards/locale/awards.fr.tr new file mode 100644 index 00000000..0c2925db --- /dev/null +++ b/mods/HUD/awards/locale/awards.fr.tr @@ -0,0 +1,61 @@ +# textdomain:awards +@1/@2 chat messages=@1/@2 chat messages +@1/@2 crafted=@1/@2 fabrication +@1/@2 deaths=@1/@2 Mort +@1/@2 dug=@1/@2 creusé +@1/@2 game joins=@1/@2 sessions +@1/@2 placed=@1/@2 mis +@1 (got)=@1 (obtenu) +@1: @1=@1: @1 +@1’s awards:=Récompenses de @1: +(Secret Award)=(Récompense Secrètte) += += +A Cat in a Pop-Tart?!=A Cat in a Pop-Tart?! +Achievement gotten!=Succès obtenue! +Achievement gotten:=Succès obtenue: +Achievement gotten: @1=Succès obtenue: @1 +Achievement not found.=Succès inconnu +All your awards and statistics have been cleared. You can now start again.=Toutes vos récompenses et statistiques ont été effacées. Vous pouvez maintenant recommencer. +Awards=Récompenses +Craft: @1×@2=Frabrication: @1×@2 +Craft: @1=Frabrication: @1 +Die @1 times.=Mort @1 fois. +Die.=Mort. +Get the achievements statistics for the given player or yourself=Obtenez les statistiques de succès pour le joueur donné ou vous-même +Join the game @1 times.=Rejoignez le jeu @1 fois. +Join the game.=Rejoignez le jeu. +List awards in chat (deprecated)=Liste des récompenses dans le chat (obsolète) +Place a block: @1=Placer un bloc: @1 +Place blocks: @1×@2=Placer des blocs: @1×@2 +Secret Achievement gotten!=Succès secret obtenu! +Secret Achievement gotten:=Succès secret obtenu: +Secret Achievement gotten: @1=Succès secret obtenu: @1 +Show details of an achievement=Afficher les détails d'un succès +Show, clear, disable or enable your achievements=Affichez, effacez, désactivez ou activez vos succès +Get this achievement to find out what it is.=Obtenez ce succès pour découvrir de quoi il s'agit. +Write @1 chat messages.=Écrivez @1 messages de chat. +Write something in chat.=Écrivez quelque chose dans le chat. +You have disabled your achievements.=Vous avez désactivé vos succès. +You have enabled your achievements.=Vous avez activé vos succès. +You have not gotten any awards.=Vous n'avez reçu aucun prix. +You've disabled awards. Type /awards enable to reenable.=Vous avez désactivé les récompenses. Type /awards enable pour les activer. +[c|clear|disable|enable]=[c|clear|disable|enable] +OK=OK +Error: No awards available.=Erreur: aucune récompense disponible. +Eat: @1×@2=Manger: @1×@2 +Eat: @1=Manger: @1 +@1/@2 eaten=@1/@2 mangé +Place @1 block(s).=Placer @1 bloc(s). +Dig @1 block(s).=Creuser @1 bloc(s). +Eat @1 item(s).=Manger @1 aliment(s). +Craft @1 item(s).=Fabriquer @1 objet(s). +Can give achievements to any player=Peut donner des succès à n'importe quel joueur +(grant ( | all)) | list=(grant ( | all)) | list +Give achievement to player or list all achievements=Donner un succès a un joueur ou répertorier toutes les succès +@1 (@2)=@1 (@2) +Invalid syntax.=Syntaxe invalide. +Invalid action.=Action invalide. +Player is not online.=Le joueur n'est pas en ligne. +Done.=Terminé. +Achievement “@1” does not exist.=La réalisation «@1» n'existe pas. diff --git a/mods/HUD/awards/locale/de.txt b/mods/HUD/awards/locale/de.txt deleted file mode 100644 index 3396a34f..00000000 --- a/mods/HUD/awards/locale/de.txt +++ /dev/null @@ -1,198 +0,0 @@ -A Cat in a Pop-Tart?! = Eine Katze im Pop-Tart?! -Aspiring Farmer = Aufstrebender Bauer -Backpacker = Rucksacktourist -Bankier = Bankier -Bricker = Ziegler -Build a Cave = Höhlenbauer -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 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 -Desert Discoverer = Wüstenerkunder -Desert Dweller = Wüstenbewohner -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. -Far Lands = Ferne Lande -Farming Skills Aquired = 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 -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 the Dungeon = Im Verlies -Industrial Age = Industriezeitalter -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 = -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 -Obsessed with Obsidian = Von Obsidian besessen -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 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 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 -Treasurer = Schatzmeister -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’re a copper = Du Kupfer! -%s: %s = %s: %s -%s (got) = %s (erhalten) -%s’s awards: = %ss Auszeichnungen: -(Secret Award) = (Geheime Auszeichnung) -Achievement gotten! = Auszeichnung erhalten! -Achievement gotten: = Auszeichnung erhalten: -Achievement gotten: %s = Auszeichnung erhalten: %s -Secret achievement gotten! = Geheime Auszeichnung erhalten! -Secret achievement gotten: = Geheime Auszeichnung erhalten: -Secret achievement gotten: %s = Geheime Auszeichnung erhalten: %s -Get this achievement to find out what it is. = Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist. -You have not gotten 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. - = - = -Achievement not found. = Auszeichnung nicht gefunden. -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. -Get the achievements statistics for the given player or yourself = Die Statistik der Auszeichnungen eines Spielers zeigen -List awards in chat (deprecated) = Auszeichnungen im Chat anzeigen (veraltet) -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. -[c|clear|disable|enable] = [c|clear|disable|enable] -Awards = Auszeichnungen -%d/%d crafted = %d/%d gefertigt -%d/%d deaths = %d/%d Tode -%d/%d dug = %d/%d abgebaut -%d/%d game joins = %d/%d Spielen beigetreten -%d/%d lines of chat = %d/%d Chatzeilen -%d/%d placed = %d/%d platziert -Die %d times. = Sterben Sie %d mal. -Die. = Sterben Sie. -Craft: %d×%s = Fertigen Sie an: %d×%s -Craft: %s = Fertigen Sie an: %s -Mine a block: %s = Bauen Sie einen Block ab: %s -Mine blocks: %d×%s = Bauen Sie Blöcke ab: %d×%s -Place a block: %s = Platzieren Sie einen Block: %s -Place blocks: %d×%s = Platzieren Sie Blöcke: %d×%s -Join the game. = Treten Sie dem Spiel bei. -Join the game %d times. = Treten Sie dem Spiel %d mal bei. -Show details of an achievement = Details einer Auszeichnung anzeigen -OK = OK -Error: No awards available. = Fehler: Keine Auszeichnungen vorhanden. -Eat: %d×%s = Essen Sie: %d×%s -Eat: %s = Essen Sie: %s -%d/%d eaten = %d/%d gegessen -Yummy! = Lecker! -Baker = Bäcker -Eat 10 loaves of bread. = Essen Sie 10 Brote. -Eat 80 apples. = Essen Sie 80 Äpfel. -Tasty Mushrooms = Leckere Pilze -Mushroom Lover = Pilzfreund -Underground Mushroom Farmer = Unterirdischer Pilzbauer -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. -Builder = Bauarbeiter -Constructor = Konstrukteur -Architect = Architekt -Master Architect = Meisterarchitekt -Place %d block(s). = Platzieren Sie %d Blöcke. -Dig %d block(s). = Bauen Sie %d Blöcke ab. -Eat %d item(s). = Essen Sie %d Dinge. -Craft %d item(s). = Fertigen Sie %d Gegenstände. diff --git a/mods/HUD/awards/locale/template.txt b/mods/HUD/awards/locale/template.txt index eecb0c5f..529d524c 100644 --- a/mods/HUD/awards/locale/template.txt +++ b/mods/HUD/awards/locale/template.txt @@ -1,196 +1,61 @@ -%d/%d chat messages = -%d/%d crafted = -%d/%d deaths = -%d/%d dug = -%d/%d game joins = -%d/%d placed = -%s (got) = -%s: %s = -%s’s awards: = -(Secret Award) = - = - = -A Cat in a Pop-Tart?! = -Achievement gotten! = -Achievement gotten: = -Achievement gotten: %s = -Achievement not found. = -All your awards and statistics have been cleared. You can now start again. = -Aspiring Farmer = -Awards = -Backpacker = -Bankier = -Bricker = -Build a Cave = -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 7 bookshelves. = -Craft 8 times flint and steel. = -Craft 800 stone bricks. = -Craft a diamond block. = -Craft: %d×%s = -Craft: %s = -Crafter of Sticks = -Dandelions are Yellow = -Desert Discoverer = -Desert Dweller = -Die %d times. = -Die. = -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. = -Far Lands = -Farming Skills Aquired = -Field Worker = -Filthy Rich = -Firefighter = -First Day in the Woods = -First Gold Find = -First Mese Find = -Fortress = -Geraniums are Blue = -Get the achievements statistics for the given player or yourself = -Girl's Best Friend = -Glacier Discoverer = -Glasser = -Gold Rush = -Grasslands Discoverer = -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 the Dungeon = -Industrial Age = -Join the game %d times. = -Join the game. = -Jungle Discoverer = -Junglebaby = -Jungleman = -Lava Miner = -Lava and Water = -Light It Up = -List awards in chat (deprecated) = -Little Library = -Long Ladder = -Lumberjack = -Marchand De Sable = -Master Miner = -Mese Mastery = -Mine 18 diamond ores. = -Mine 45 gold ores. = -Mine 50 obsidian. = -Mine a block: %s = -Mine a mese block. = -Mine a mossy cobblestone. = -Mine a nyan cat. = -Mine any block while being very close to lava. = -Mine blocks: %d×%s = -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 = -Obsessed with Obsidian = -On The Way = -Outpost = -Pharaoh = -Place 1,000 torches. = -Place 100 rails. = -Place 100 stone. = -Place 100 torches. = -Place 2 trap stones. = -Place 20 coal checkers. = -Place 20 iron checkers. = -Place 40 steel ladders. = -Place 400 wooden ladders. = -Place a block: %s = -Place blocks: %d×%s = -Place two snow blocks. = -Professional Lumberjack = -Put out 1000 fires. = -Pyromaniac = -Really Well Lit = -Roses Are Red = -Saint-Maclou = -Sam the Trapper = -Savannah Discoverer = -Secret Achievement gotten! = -Secret Achievement gotten: = -Secret Achievement gotten: %s = -Semi-pro Lumberjack = -Show details of an achievement = -Show, clear, disable or enable your achievements = -Smelter = -Treasurer = -Get this achievement to find out what it is. = -Very Simple Snow Man = -Watchtower = -Well Lit = -Wheat Magnate = -White Color Stock = -Wool Over Your Eyes = -Wow, I am Diamonds! = -Write %d chat messages. = -Write something in chat. = -You have disabled your achievements. = -You have enabled your achievements. = -You have not gotten any awards. = -You've disabled awards. Type /awards enable to reenable. = -You’re a copper = -[c|clear|disable|enable] = -OK = -Error: No awards available. = -Eat: %d×%s = -Eat: %s = -%d/%d eaten = -Place %d block(s). = -Dig %d block(s). = -Eat %d item(s). = -Craft %d item(s). = -Yummy! = -Baker = -Eat 10 loaves of bread. = -Eat 80 apples. = -Tasty Mushrooms = -Mushroom Lover = -Underground Mushroom Farmer = -Eat 3 brown mushrooms. = -Eat 33 brown mushrooms. = -Eat 333 brown mushrooms. = +# textdomain:awards +@1/@2 chat messages= +@1/@2 crafted= +@1/@2 deaths= +@1/@2 dug= +@1/@2 game joins= +@1/@2 placed= +@1 (got)= +@1: @1= +@1’s awards:= +(Secret Award)= += += +A Cat in a Pop-Tart?!= +Achievement gotten!= +Achievement gotten:= +Achievement gotten: @1= +Achievement not found.= +All your awards and statistics have been cleared. You can now start again.= +Awards= +Craft: @1×@2= +Craft: @1= +Die @1 times.= +Die.= +Get the achievements statistics for the given player or yourself= +Join the game @1 times.= +Join the game.= +List awards in chat (deprecated)= +Place a block: @1= +Place blocks: @1×@2= +Secret Achievement gotten!= +Secret Achievement gotten:= +Secret Achievement gotten: @1= +Show details of an achievement= +Show, clear, disable or enable your achievements= +Get this achievement to find out what it is.= +Write @1 chat messages.= +Write something in chat.= +You have disabled your achievements.= +You have enabled your achievements.= +You have not gotten any awards.= +You've disabled awards. Type /awards enable to reenable.= +[c|clear|disable|enable]= +OK= +Error: No awards available.= +Eat: @1×@2= +Eat: @1= +@1/@2 eaten= +Place @1 block(s).= +Dig @1 block(s).= +Eat @1 item(s).= +Craft @1 item(s).= +Can give achievements to any player= +(grant ( | all)) | list= +Give achievement to player or list all achievements= +@1 (@2)= +Invalid syntax.= +Invalid action.= +Player is not online.= +Done.= +Achievement “@1” does not exist.= diff --git a/mods/HUD/awards/readme.md b/mods/HUD/awards/readme.md index 83235130..70c650c8 100644 --- a/mods/HUD/awards/readme.md +++ b/mods/HUD/awards/readme.md @@ -11,7 +11,7 @@ old fork in Carbone, under same license. # Basic API * awards.register_achievement(name, def) - * name + * name: Unique identifier for achievement. You can use anything except "all" * desciption * sound [optional] - set a custom sound (SimpleSoundSpec) or `false` to play no sound. If not specified, a default sound is played @@ -59,6 +59,8 @@ old fork in Carbone, under same license. * awards.unlock(name, award) * gives an award to a player * name is the player name +* awards.exists(award) + * returns true if award exists, false otherwise # Included in the Mod diff --git a/mods/HUD/awards/sfinv.lua b/mods/HUD/awards/sfinv.lua index de85998c..5d02cbb5 100644 --- a/mods/HUD/awards/sfinv.lua +++ b/mods/HUD/awards/sfinv.lua @@ -1,10 +1,5 @@ if minetest.get_modpath("sfinv") then - local S - if minetest.get_modpath("intllib") then - S = intllib.Getter() - else - S = function ( s ) return s end - end + local S = minetest.get_translator("awards") sfinv.register_page("awards:awards", { title = S("Awards"), diff --git a/mods/HUD/awards/sounds/awards_got_generic.ogg b/mods/HUD/awards/sounds/awards_got_generic.ogg index 3ae982b3..87666c8f 100644 Binary files a/mods/HUD/awards/sounds/awards_got_generic.ogg and b/mods/HUD/awards/sounds/awards_got_generic.ogg differ diff --git a/mods/HUD/awards/textures/awards_bg_default.png b/mods/HUD/awards/textures/awards_bg_default.png index 86130d01..b7ba7f42 100644 Binary files a/mods/HUD/awards/textures/awards_bg_default.png and b/mods/HUD/awards/textures/awards_bg_default.png differ diff --git a/mods/HUD/awards/textures/awards_bg_mining.png b/mods/HUD/awards/textures/awards_bg_mining.png index a6987794..022e64f2 100644 Binary files a/mods/HUD/awards/textures/awards_bg_mining.png and b/mods/HUD/awards/textures/awards_bg_mining.png differ diff --git a/mods/HUD/awards/textures/awards_firefighter.png b/mods/HUD/awards/textures/awards_firefighter.png deleted file mode 100644 index 7c2236bb..00000000 Binary files a/mods/HUD/awards/textures/awards_firefighter.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_house.png b/mods/HUD/awards/textures/awards_house.png deleted file mode 100644 index e23e30d4..00000000 Binary files a/mods/HUD/awards/textures/awards_house.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_level1.png b/mods/HUD/awards/textures/awards_level1.png deleted file mode 100644 index 8f628f33..00000000 Binary files a/mods/HUD/awards/textures/awards_level1.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_level2.png b/mods/HUD/awards/textures/awards_level2.png deleted file mode 100644 index 9f9564fa..00000000 Binary files a/mods/HUD/awards/textures/awards_level2.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_level3.png b/mods/HUD/awards/textures/awards_level3.png deleted file mode 100644 index 8931454a..00000000 Binary files a/mods/HUD/awards/textures/awards_level3.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_level4.png b/mods/HUD/awards/textures/awards_level4.png deleted file mode 100644 index 68e393f0..00000000 Binary files a/mods/HUD/awards/textures/awards_level4.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_level5.png b/mods/HUD/awards/textures/awards_level5.png deleted file mode 100644 index d0a05bcc..00000000 Binary files a/mods/HUD/awards/textures/awards_level5.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_level6.png b/mods/HUD/awards/textures/awards_level6.png deleted file mode 100644 index 5c6482fd..00000000 Binary files a/mods/HUD/awards/textures/awards_level6.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_level7.png b/mods/HUD/awards/textures/awards_level7.png deleted file mode 100644 index 5e318d81..00000000 Binary files a/mods/HUD/awards/textures/awards_level7.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_mese.png b/mods/HUD/awards/textures/awards_mese.png deleted file mode 100644 index 3fc800ec..00000000 Binary files a/mods/HUD/awards/textures/awards_mese.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_miniminer.png b/mods/HUD/awards/textures/awards_miniminer.png deleted file mode 100644 index 45c72384..00000000 Binary files a/mods/HUD/awards/textures/awards_miniminer.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_novicebuilder.png b/mods/HUD/awards/textures/awards_novicebuilder.png deleted file mode 100644 index f24d843c..00000000 Binary files a/mods/HUD/awards/textures/awards_novicebuilder.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_progress_gray.png b/mods/HUD/awards/textures/awards_progress_gray.png index a5fc6cb3..ea60ae17 100644 Binary files a/mods/HUD/awards/textures/awards_progress_gray.png and b/mods/HUD/awards/textures/awards_progress_gray.png differ diff --git a/mods/HUD/awards/textures/awards_progress_green.png b/mods/HUD/awards/textures/awards_progress_green.png index 54b4e5d5..5f2bb3d2 100644 Binary files a/mods/HUD/awards/textures/awards_progress_green.png and b/mods/HUD/awards/textures/awards_progress_green.png differ diff --git a/mods/HUD/awards/textures/awards_template.png b/mods/HUD/awards/textures/awards_template.png index b2904548..e918be62 100644 Binary files a/mods/HUD/awards/textures/awards_template.png and b/mods/HUD/awards/textures/awards_template.png differ diff --git a/mods/HUD/awards/textures/awards_ui_bags.png b/mods/HUD/awards/textures/awards_ui_bags.png deleted file mode 100644 index 4d6eb571..00000000 Binary files a/mods/HUD/awards/textures/awards_ui_bags.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_ui_icon.png b/mods/HUD/awards/textures/awards_ui_icon.png index 239ad71e..34bb7c44 100644 Binary files a/mods/HUD/awards/textures/awards_ui_icon.png and b/mods/HUD/awards/textures/awards_ui_icon.png differ diff --git a/mods/HUD/awards/textures/awards_unknown.png b/mods/HUD/awards/textures/awards_unknown.png index b2904548..e918be62 100644 Binary files a/mods/HUD/awards/textures/awards_unknown.png and b/mods/HUD/awards/textures/awards_unknown.png differ diff --git a/mods/HUD/awards/triggers.lua b/mods/HUD/awards/triggers.lua index 88a952fd..318a4b28 100644 --- a/mods/HUD/awards/triggers.lua +++ b/mods/HUD/awards/triggers.lua @@ -14,12 +14,7 @@ -- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function ( s ) return s end -end +local S = minetest.get_translator("awards") awards.register_trigger("dig", function(def) local tmp = { @@ -37,7 +32,7 @@ awards.register_trigger("dig", function(def) end return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d dug"), itemcount, tmp.target) + label = S("@1/@2 dug", itemcount, tmp.target) } end def.getDefaultDescription = function(self) @@ -47,12 +42,12 @@ awards.register_trigger("dig", function(def) nname = self.trigger.node end if self.trigger.target ~= 1 then - return string.format(S("Mine blocks: %d×%s"), self.trigger.target, nname) + return S("Mine blocks: @1×@2", self.trigger.target, nname) else - return string.format(S("Mine a block: %s"), nname) + return S("Mine a block: @1", nname) end else - return string.format(S("Mine %d block(s)."), self.trigger.target) + return S("Mine @1 block(s).", self.trigger.target) end end end) @@ -73,7 +68,7 @@ awards.register_trigger("place", function(def) end return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d placed"), itemcount, tmp.target) + label = S("@1/@2 placed"), itemcount, tmp.target } end def.getDefaultDescription = function(self) @@ -83,12 +78,12 @@ awards.register_trigger("place", function(def) nname = self.trigger.node end if self.trigger.target ~= 1 then - return string.format(S("Place blocks: %d×%s"), self.trigger.target, nname) + return S("Place blocks: @1×@2", self.trigger.target, nname) else - return string.format(S("Place a block: %s"), nname) + return S("Place a block: @1", nname) end else - return string.format(S("Place %d block(s)."), self.trigger.target) + return S("Place @1 block(s).", self.trigger.target) end end end) @@ -109,7 +104,7 @@ awards.register_trigger("eat", function(def) end return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d eaten"), itemcount, tmp.target) + label = S("@1/@2 eaten", itemcount, tmp.target) } end def.getDefaultDescription = function(self) @@ -119,12 +114,12 @@ awards.register_trigger("eat", function(def) iname = self.trigger.iode end if self.trigger.target ~= 1 then - return string.format(S("Eat: %d×%s"), self.trigger.target, iname) + return S("Eat: @1×@2", self.trigger.target, iname) else - return string.format(S("Eat: %s"), iname) + return S("Eat: @1", iname) end else - return string.format(S("Eat %d item(s)."), self.trigger.target) + return S("Eat @1 item(s).", self.trigger.target) end end end) @@ -139,12 +134,12 @@ awards.register_trigger("death", function(def) local itemcount = data.deaths or 0 return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d deaths"), itemcount, tmp.target) + label = S("@1/@2 deaths", itemcount, tmp.target) } end def.getDefaultDescription = function(self) if self.trigger.target ~= 1 then - return string.format(S("Die %d times."), self.trigger.target) + return S("Die @1 times.", self.trigger.target) else return S("Die.") end @@ -161,12 +156,12 @@ awards.register_trigger("chat", function(def) local itemcount = data.chats or 0 return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d chat messages"), itemcount, tmp.target) + label = S("@1/@2 chat messages", itemcount, tmp.target) } end def.getDefaultDescription = function(self) if self.trigger.target ~= 1 then - return string.format(S("Write %d chat messages."), self.trigger.target) + return S("Write @1 chat messages.", self.trigger.target) else return S("Write something in chat.") end @@ -183,12 +178,12 @@ awards.register_trigger("join", function(def) local itemcount = data.joins or 0 return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d game joins"), itemcount, tmp.target) + label = S("@1/@2 game joins", itemcount, tmp.target) } end def.getDefaultDescription = function(self) if self.trigger.target ~= 1 then - return string.format(S("Join the game %d times."), self.trigger.target) + return S("Join the game @1 times.", self.trigger.target) else return S("Join the game.") end @@ -211,7 +206,7 @@ awards.register_trigger("craft", function(def) end return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d crafted"), itemcount, tmp.target) + label = S("@1/@2 crafted", itemcount, tmp.target) } end def.getDefaultDescription = function(self) @@ -221,12 +216,12 @@ awards.register_trigger("craft", function(def) iname = self.trigger.item end if self.trigger.target ~= 1 then - return string.format(S("Craft: %d×%s"), self.trigger.target, iname) + return S("Craft: @1×@2", self.trigger.target, iname) else - return string.format(S("Craft: %s"), iname) + return S("Craft: @1", iname) end else - return string.format(S("Craft %d item(s)."), self.trigger.target) + return S("Craft @1 item(s).", self.trigger.target) end end end) diff --git a/mods/HUD/awards/unified_inventory.lua b/mods/HUD/awards/unified_inventory.lua index a4bb02dc..be5ca5f9 100644 --- a/mods/HUD/awards/unified_inventory.lua +++ b/mods/HUD/awards/unified_inventory.lua @@ -1,10 +1,5 @@ if minetest.get_modpath("unified_inventory") ~= nil then - local S - if minetest.get_modpath("intllib") then - S = intllib.Getter() - else - S = function ( s ) return s end - end + local S = minetest.get_translator("awards") unified_inventory.register_button("awards", { type = "image", diff --git a/mods/HUD/hbarmor/README.md b/mods/HUD/hbarmor/README.md deleted file mode 100644 index 2b87b975..00000000 --- a/mods/HUD/hbarmor/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# HUD bar for `3d_armor` [`hbarmor`] - -* Version: 0.3.0 - -## Description -This mod adds a simple HUD bar which displays the current damage -of the player's armor (from the 3D Armor [`3d_armor`] mod) as a percentage (rounded). - -100% armor means the armor is in perfect shape. 0% means the armor is almost destroyed -or non-existant. Note that to reach 100%, the player must wear at least 4 different -pieces of armor in perfect shape. - -The armor bar also does not tell anything about the armor's strength, -only how worn out it already is. - -By default, the armor bar is hidden if the player wears no armor. - -## Dependencies -* HUD bars [`hudbars`], major version 1 -* 3D Armor [`3d_armor`] (tested with Minetest 0.4.14) - -## Licensing -This mod is entirly free softare. - -### Source code - -* License: WTFPL (see below) -* Authors: Wuzzy, forked from the mod “Better HUD (and hunger)” [`hud`] by BlockMen (2013-2014) - -### Textures - -* `hbarmor_icon.png`—Stu ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)), modified by BlockMen -* `hbarmor_bgicon.png`—Stu (CC BY-SA 3.0), modified by BlockMen -* `hbarmor_bar.png`—Wuzzy (WTFPL) - -Everything else is WTFPL: -© Copyright BlockMen (2013-2014) - -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License, Version 2, as published by Sam Hocevar. See -http://sam.zoy.org/wtfpl/COPYING for more details. diff --git a/mods/HUD/hbarmor/depends.txt b/mods/HUD/hbarmor/depends.txt deleted file mode 100644 index 32c22245..00000000 --- a/mods/HUD/hbarmor/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -hudbars -3d_armor -intllib? diff --git a/mods/HUD/hbarmor/locale/de.txt b/mods/HUD/hbarmor/locale/de.txt deleted file mode 100644 index 5a6bacdc..00000000 --- a/mods/HUD/hbarmor/locale/de.txt +++ /dev/null @@ -1,2 +0,0 @@ -Armor = Panzerung -%s: %d%% = %s: %d%% diff --git a/mods/HUD/hbarmor/locale/template.txt b/mods/HUD/hbarmor/locale/template.txt deleted file mode 100644 index d898abe4..00000000 --- a/mods/HUD/hbarmor/locale/template.txt +++ /dev/null @@ -1,4 +0,0 @@ -Armor = - -# Format string for displaying the armor. E.g. "Armor: 100%" -%s: %d%% = diff --git a/mods/HUD/hbarmor/mod.conf b/mods/HUD/hbarmor/mod.conf deleted file mode 100644 index 47352c19..00000000 --- a/mods/HUD/hbarmor/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = hbarmor diff --git a/mods/HUD/hbarmor/screenshot.png b/mods/HUD/hbarmor/screenshot.png deleted file mode 100644 index 907cf900..00000000 Binary files a/mods/HUD/hbarmor/screenshot.png and /dev/null differ diff --git a/mods/HUD/hbarmor/settingtypes.txt b/mods/HUD/hbarmor/settingtypes.txt deleted file mode 100644 index 067d5045..00000000 --- a/mods/HUD/hbarmor/settingtypes.txt +++ /dev/null @@ -1,7 +0,0 @@ -#If true, automatically hides the armor HUD bar when the player wears no -#armor. Otherwise, the armor bar shows “0%”. -hbarmor_autohide (Automatically hide armor HUD bar) bool true - -#Time difference in seconds between updates to the armor HUD bar. -#Increase this number for slow servers. -hbarmor_tick (Armor HUD bar update frequency) float 0.1 0.0 4.0 diff --git a/mods/HUD/hbarmor/textures/hbarmor_bgicon.png b/mods/HUD/hbarmor/textures/hbarmor_bgicon.png deleted file mode 100644 index 86e68e40..00000000 Binary files a/mods/HUD/hbarmor/textures/hbarmor_bgicon.png and /dev/null differ diff --git a/mods/HUD/hbarmor/textures/hbarmor_icon.png b/mods/HUD/hbarmor/textures/hbarmor_icon.png deleted file mode 100644 index e0066a38..00000000 Binary files a/mods/HUD/hbarmor/textures/hbarmor_icon.png and /dev/null differ diff --git a/mods/HUD/hudbars/API.md b/mods/HUD/hudbars/API.md index a53344cc..ca6144ad 100644 --- a/mods/HUD/hudbars/API.md +++ b/mods/HUD/hudbars/API.md @@ -45,7 +45,7 @@ a vertical gradient. ### Icon A 16×16 image shown left of the HUD bar. This is optional. -### `hb.register_hudbar(identifier, text_color, label, textures, default_start_value, default_start_max, default_start_hidden, format_string)` +### `hb.register_hudbar(identifier, text_color, label, textures, default_start_value, default_start_max, default_start_hidden, format_string, format_string_config)` This function registers a new custom HUD bar definition to the HUD bars mod, so it can be later used to be displayed, changed, hidden and unhidden on a per-player basis. Note this does not yet display the HUD bar. @@ -66,7 +66,21 @@ for more information. * `default_start_value`: If this HUD bar is added to a player, and no initial value is specified, this value will be used as initial current value * `default_max_value`: If this HUD bar is added to a player, and no initial maximum value is specified, this value will be used as initial maximum value * `default_start_hidden`: The HUD bar will be initially start hidden by default when added to a player. Use `hb.unhide_hudbar` to unhide it. -* `format_string`: This is optional; You can specify an alternative format string display the final text on the HUD bar. The default format string is “`%s: %d/%d`” (in this order: Label, current value, maximum value). See also the Lua documentation of `string.format`. +* `format_string`: Optional; You can specify an alternative format string to use for the final text on the HUD bar. The default format string is “`@1: @2/@3`” (The “@” numbers are placeholders that have a meaning in this order: @1 = Label, @2 = current value, @3 = maximum value). Do *not* use minetest.translator on this string, the string will be translated by `hudbars`, but you still must put this string into the translation catalogue file. +* `format_string_config`: Required if `format_string` is set. This allows to change which parameters to use in the format string. It's a table with these fields: + * `textdomain`: Text domain of the format string, used by `minetest.translate` + * `order`: Table that contains the order of the placeholders. It's also possible to remove placeholders. Default order: `{ "label", "value", "max_value" }` + * `format_value`: Format string to apply when displaying `value`. Syntax is same as in `string.format`. Default: `"%d"` + * `format_max_value`: Same as `format_value` but is applied to `max_value` + +#### Example +Example (mostly) from `hbarmor` mod: + +``` +hb.register_hudbar("armor", 0xFFFFFF, minetest.translator("hbarmor", "Armor"), { icon = "hbarmor_icon.png", bgicon = "hbarmor_bgicon.png", bar = "hbarmor_bar.png" }, 0, 100, hbarmor.autohide, N("@1: @2%"), { order = { "label", "value" }, textdomain = "hbarmor" } ) +``` + +Displays an armor HUD bar with a label of the form „Armor: 53%“. (`N` is a dummy function that returns its argument, used to make the string visible for translator scripts.) #### Return value Always `nil`. diff --git a/mods/HUD/hudbars/README.md b/mods/HUD/hudbars/README.md index 4f723400..afe7f448 100644 --- a/mods/HUD/hudbars/README.md +++ b/mods/HUD/hudbars/README.md @@ -11,7 +11,7 @@ this mod will place them accordingly. position should be displayed correctly on every screen size. ## Current version -The current version is 1.9.0. +The current version is 2.1.0. This software uses [semantic versioning](http://semver.org), as defined by version 2.0.0 of the SemVer standard. @@ -35,23 +35,26 @@ Translations: * German: Wuzzy * Portuguese: BrunoMine * Turkish: admicos +* Dutch: kingoscargames +* Italian: Hamlet +* Malay: muhdnurhidayat +* Russian: Imk This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License (WTFPL), version 2, as published by Sam Hocevar. +and/or modify it under the terms of the MIT License. ### Licenses of textures * `hudbars_icon_health.png`—celeron55 (CC BY-SA 3.0), modified by BlockMen * `hudbars_bgicon_health.png`—celeron55 (CC BY-SA 3.0), modified by BlockMen -* `hudbars_icon_breath.png`—kaeza (WTFPL), modified by BlockMen, modified again by Wuzzy -* `hudbars_bgicon_breath.png`—based on previous image, edited by Wuzzy (WTFPL) -* `hudbars_bar_health.png`—Wuzzy (WTFPL) -* `hudbars_bar_breath.png`—Wuzzy (WTFPL) -* `hudbars_bar_background.png`—Wuzzy (WTFPL) +* `hudbars_icon_breath.png`—kaeza (MIT License), modified by BlockMen, modified again by Wuzzy +* `hudbars_bgicon_breath.png`—based on previous image, edited by Wuzzy (MIT License) +* `hudbars_bar_health.png`—Wuzzy (MIT License) +* `hudbars_bar_breath.png`—Wuzzy (MIT License) +* `hudbars_bar_background.png`—Wuzzy (MIT License) ### License references * [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) -* [WTFPL](http://sam.zoy.org/wtfpl/COPYING) +* [MIT License](https://opensource.org/licenses/MIT) diff --git a/mods/HUD/hudbars/changelog.txt b/mods/HUD/hudbars/changelog.txt deleted file mode 100644 index e2e6b560..00000000 --- a/mods/HUD/hudbars/changelog.txt +++ /dev/null @@ -1,92 +0,0 @@ -Note: This software uses semantic versioning, -as of version 2.0.0 of the standard . - -0.1.0 ------ -- Initial release, forked from mod “Better HUD” [hud]. - -0.2.0 ------ -- Add API documentation - -0.3.0 ------ -- Rename main table from “hud” to “hb” (affects function names!) -- Arguments 3-4 of hb.change_hudbar can be nil for values which should not change -- Add proper function hb.init_hudbar, replaces odd call to hud.hudtables[identifier].add_all -- Update API documentation and fix mistakes -- Use “hudbars.conf” instead of “hud.conf” - -0.4.0 ------ -- New function: hb.get_hudbar_state to get information about the state of an active HUD bar, such as values, whether it is hidden, etc. -- hb.change_hudbar has been optimized to call hud_change fewer times, which is hopefully good for networking -- Rename hb.register_hudbar parameter “start_hide” to “start_hidden” -- start_hidden parameter now finally works -- Do not affect other HUD flags (crosshair, wielditem, etc.) when starting mod -- Show error message when trying to call hb.init_hudbar or hb.change_hudbar with bad values -- Update documentation -- Lots of refactoring -- Health and breath bar now use API - -1.0.0 ------ -- Add new parameter start_hidden to hb.init_hudbar, specified whether HUD bar is hidden on start -- Copy-editing of API.md and README.txt -- Internal: Fix add_all weirdness - -1.0.1 ------ -- Fix race condition causing crash at start of server - -1.0.2 ------ -- Fix other HUD elements disappearing for rejoining players -- Remove pointless delays for initializing the HUD for new or rejoining players - -1.0.3 ------ -- Adjust default HUD bars position for Minetest 0.4.12 - -1.1.0 ------ -- Add boolean minetest.conf setting support (hudbars_autohide_breathbar) to control whether the breath bar is automatically hidden when full (default: yes) - -1.2.0 ------ -- New setting: hudbars_sorting. You can now manually sort all the HUD bars. Useful if you don't like automatic order -- New setting: hudbars_bar_type. You now can change the appearance of the HUD bars. -- New HUD bar types, slightly experimental: Classic statbars and modern [hud]-style statbars -- New experimental/unfinished setting: hudbars_alignment_pattern: You can now make the HUD bars stack vertically instead of the current zig-zag pattern. Note you probably need to change source code to productively use this feature -- Various position-related HUD bar settings (see README.txt) -- Remove hudbars.conf support and hudbars.conf.example (was never officially supported anyways) - -1.2.1 ------ -- Fix crash when enable_damage is changed in mid-game - -1.3.0 ------ -- Make all settings avaialbe in Minetest's advanced settings menu -- Fix HUD bars overlap when both hudbars_tick and hudbars_vmargin were set -- Use Markdown syntax in readme file -- Fix some factual mistakes in readme file -- Add metadata: mod.conf, description.txt, screenshot.png - -1.4.0 ------ -- Allow to change HUD bar images and label after it has been registered -- Minor API.md correction - -1.4.1 ------ -- Fix bug in hb.change_hudbar being a no-op if new_value and new_max value are nil - -1.5.0 ------ -- Portuguese translation by BrunoMine - -1.5.1 ------ -- Fix critical bug: Mod does not work with both intllib and mod security enabled -- Update screenshot to use new 3:2 aspect ratio diff --git a/mods/HUD/hudbars/default_settings.lua b/mods/HUD/hudbars/default_settings.lua index 91d3c67e..0bd267d0 100644 --- a/mods/HUD/hudbars/default_settings.lua +++ b/mods/HUD/hudbars/default_settings.lua @@ -1,5 +1,4 @@ -- (Hardcoded) default settings --- Some of these settings have been modified for MCL2. hb.settings.max_bar_length = 160 hb.settings.statbar_length = 20 @@ -53,4 +52,3 @@ else hb.settings.sorting_reverse[tonumber(v)] = k end end - diff --git a/mods/HUD/hudbars/depends.txt b/mods/HUD/hudbars/depends.txt deleted file mode 100644 index 77e8d97c..00000000 --- a/mods/HUD/hudbars/depends.txt +++ /dev/null @@ -1 +0,0 @@ -intllib? diff --git a/mods/HUD/hudbars/description.txt b/mods/HUD/hudbars/description.txt deleted file mode 100644 index 9e10e894..00000000 --- a/mods/HUD/hudbars/description.txt +++ /dev/null @@ -1 +0,0 @@ -Replaces the health and breath symbols in the HUD by “progress bars” and shows exact values. Other mods can add more progress bars for custom player stats. diff --git a/mods/HUD/hudbars/init.lua b/mods/HUD/hudbars/init.lua index 4e9294b0..9c7708bd 100644 --- a/mods/HUD/hudbars/init.lua +++ b/mods/HUD/hudbars/init.lua @@ -1,9 +1,5 @@ -local S -if (minetest.get_modpath("intllib")) then - S = intllib.Getter() -else - S = function ( s ) return s end -end +local S = minetest.get_translator("hudbars") +local N = function(s) return s end hb = {} @@ -55,6 +51,35 @@ local function player_exists(player) return player ~= nil and player:is_player() end +local function make_label(format_string, format_string_config, label, start_value, max_value) + local params = {} + local order = format_string_config.order + for o=1, #order do + if order[o] == "label" then + table.insert(params, label) + elseif order[o] == "value" then + if format_string_config.format_value then + table.insert(params, string.format(format_string_config.format_value, start_value)) + else + table.insert(params, start_value) + end + elseif order[o] == "max_value" then + if format_string_config.format_max_value then + table.insert(params, string.format(format_string_config.format_max_value, max_value)) + else + table.insert(params, max_value) + end + end + end + local ret + if format_string_config.textdomain then + ret = minetest.translate(format_string_config.textdomain, format_string, unpack(params)) + else + ret = S(format_string, unpack(params)) + end + return ret +end + -- Table which contains all players with active default HUD bars (only for internal use) hb.players = {} @@ -94,7 +119,7 @@ function hb.get_hudbar_position_index(identifier) end end -function hb.register_hudbar(identifier, text_color, label, textures, default_start_value, default_start_max, default_start_hidden, format_string) +function hb.register_hudbar(identifier, text_color, label, textures, default_start_value, default_start_max, default_start_hidden, format_string, format_string_config) minetest.log("action", "hb.register_hudbar: "..tostring(identifier)) local hudtable = {} local pos, offset @@ -128,7 +153,19 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta end end if format_string == nil then - format_string = S("%s: %d/%d") + format_string = N("@1: @2/@3") + end + if format_string_config == nil then + format_string_config = {} + end + if format_string_config.order == nil then + format_string_config.order = { "label", "value", "max_value" } + end + if format_string_config.format_value == nil then + format_string_config.format_value = "%d" + end + if format_string_config.format_max_value == nil then + format_string_config.format_max_value = "%d" end hudtable.add_all = function(player, hudtable, start_value, start_max, start_hidden) @@ -153,7 +190,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta iconscale = { x=1, y=1 } barnumber = hb.value_to_barlength(start_value, start_max) bgiconnumber = hb.settings.statbar_length - text = string.format(format_string, label, start_value, start_max) + text = make_label(format_string, format_string_config, label, start_value, start_max) end if hb.settings.bar_type == "progress_bar" then ids.bg = player:hud_add({ @@ -163,6 +200,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta text = "hudbars_bar_background.png", alignment = {x=1,y=1}, offset = { x = offset.x - 1, y = offset.y - 1 }, + z_index = 0, }) if textures.icon ~= nil then ids.icon = player:hud_add({ @@ -172,6 +210,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta text = textures.icon, alignment = {x=-1,y=1}, offset = { x = offset.x - 3, y = offset.y }, + z_index = 1, }) end elseif hb.settings.bar_type == "statbar_modern" then @@ -185,13 +224,20 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta offset = { x = offset.x, y = offset.y }, direction = 0, size = {x=24, y=24}, + z_index = 0, }) end end local bar_image, bar_size if hb.settings.bar_type == "progress_bar" then bar_image = textures.bar - bar_size = {x=2, y=16} + -- NOTE: Intentionally set to nil. For some reason, on some systems, + -- the progress bar is displaced when the bar_size is set explicitly here. + -- On the other hand, setting this to nil is deprecated in MT 5.0.0 due to + -- a debug log warning, but nothing is explained in lua_api.txt. + -- This section is a potential bug magnet, please watch with care! + -- The size of the bar image is expected to be exactly 2×16 pixels. + bar_size = nil elseif hb.settings.bar_type == "statbar_classic" or hb.settings.bar_type == "statbar_modern" then bar_image = textures.icon bar_size = {x=24, y=24} @@ -205,6 +251,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta offset = offset, direction = 0, size = bar_size, + z_index = 1, }) if hb.settings.bar_type == "progress_bar" then ids.text = player:hud_add({ @@ -215,6 +262,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta number = text_color, direction = 0, offset = { x = offset.x + 2, y = offset.y - 1}, + z_index = 2, }) end -- Do not forget to update hb.get_hudbar_state if you add new fields to the state table @@ -243,6 +291,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta hudtable.identifier = identifier hudtable.format_string = format_string + hudtable.format_string_config = format_string_config hudtable.label = label hudtable.hudids = {} hudtable.hudstate = {} @@ -303,7 +352,7 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon end if new_label ~= nil then hudtable.label = new_label - local new_text = string.format(hudtable.format_string, new_label, hudtable.hudstate[name].value, hudtable.hudstate[name].max) + local new_text = make_label(hudtable.format_string, hudtable.format_string_config, new_label, hudtable.hudstate[name].value, hudtable.hudstate[name].max) player:hud_change(hudtable.hudids[name].text, "text", new_text) end if new_text_color ~= nil then @@ -347,7 +396,7 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon end if hb.settings.bar_type == "progress_bar" then - local new_text = string.format(hudtable.format_string, hudtable.label, new_value, new_max_value) + local new_text = make_label(hudtable.format_string, hudtable.format_string_config, hudtable.label, new_value, new_max_value) if new_text ~= hudtable.hudstate[name].text then player:hud_change(hudtable.hudids[name].text, "text", new_text) hudtable.hudstate[name].text = new_text @@ -363,19 +412,17 @@ function hb.hide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end - if(hudtable.hudstate[name].hidden == false) then - if hb.settings.bar_type == "progress_bar" then - if hudtable.hudids[name].icon ~= nil then - player:hud_change(hudtable.hudids[name].icon, "scale", {x=0,y=0}) - end - player:hud_change(hudtable.hudids[name].bg, "scale", {x=0,y=0}) - player:hud_change(hudtable.hudids[name].text, "text", "") - elseif hb.settings.bar_type == "statbar_modern" then - player:hud_change(hudtable.hudids[name].bg, "number", 0) + if hb.settings.bar_type == "progress_bar" then + if hudtable.hudids[name].icon ~= nil then + player:hud_change(hudtable.hudids[name].icon, "scale", {x=0,y=0}) end - player:hud_change(hudtable.hudids[name].bar, "number", 0) - hudtable.hudstate[name].hidden = true + player:hud_change(hudtable.hudids[name].bg, "scale", {x=0,y=0}) + player:hud_change(hudtable.hudids[name].text, "text", "") + elseif hb.settings.bar_type == "statbar_modern" then + player:hud_change(hudtable.hudids[name].bg, "number", 0) end + player:hud_change(hudtable.hudids[name].bar, "number", 0) + hudtable.hudstate[name].hidden = true return true end @@ -384,23 +431,21 @@ function hb.unhide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end - if(hudtable.hudstate[name].hidden) then - local value = hudtable.hudstate[name].value - local max = hudtable.hudstate[name].max - if hb.settings.bar_type == "progress_bar" then - if hudtable.hudids[name].icon ~= nil then - player:hud_change(hudtable.hudids[name].icon, "scale", {x=1,y=1}) - end - if hudtable.hudstate[name].max ~= 0 then - player:hud_change(hudtable.hudids[name].bg, "scale", {x=1,y=1}) - end - player:hud_change(hudtable.hudids[name].text, "text", tostring(string.format(hudtable.format_string, hudtable.label, value, max))) - elseif hb.settings.bar_type == "statbar_modern" then - player:hud_change(hudtable.hudids[name].bg, "number", hb.settings.statbar_length) + local value = hudtable.hudstate[name].value + local max = hudtable.hudstate[name].max + if hb.settings.bar_type == "progress_bar" then + if hudtable.hudids[name].icon ~= nil then + player:hud_change(hudtable.hudids[name].icon, "scale", {x=1,y=1}) end - player:hud_change(hudtable.hudids[name].bar, "number", hb.value_to_barlength(value, max)) - hudtable.hudstate[name].hidden = false + if hudtable.hudstate[name].max ~= 0 then + player:hud_change(hudtable.hudids[name].bg, "scale", {x=1,y=1}) + end + player:hud_change(hudtable.hudids[name].text, "text", make_label(hudtable.format_string, hudtable.format_string_config, hudtable.label, value, max)) + elseif hb.settings.bar_type == "statbar_modern" then + player:hud_change(hudtable.hudids[name].bg, "number", hb.settings.statbar_length) end + player:hud_change(hudtable.hudids[name].bar, "number", hb.value_to_barlength(value, max)) + hudtable.hudstate[name].hidden = false return true end @@ -448,16 +493,20 @@ local function custom_hud(player) else hide = true end - hb.init_hudbar(player, "health", player:get_hp(), nil, hide) + local hp = player:get_hp() + local hp_max = player:get_properties().hp_max + hb.init_hudbar(player, "health", math.min(hp, hp_max), hp_max, hide) local breath = player:get_breath() + local breath_max = player:get_properties().breath_max local hide_breath - if breath == 11 and hb.settings.autohide_breath == true then hide_breath = true else hide_breath = false end - hb.init_hudbar(player, "breath", math.min(breath, 10), nil, hide_breath or hide) + if breath >= breath_max and hb.settings.autohide_breath == true then hide_breath = true else hide_breath = false end + hb.init_hudbar(player, "breath", math.min(breath, breath_max-1), breath_max-1, hide_breath or hide) end end local function update_health(player) - hb.change_hudbar(player, "health", player:get_hp()) + local hp_max = player:get_properties().hp_max + hb.change_hudbar(player, "health", player:get_hp(), hp_max) end -- update built-in HUD bars @@ -468,13 +517,14 @@ local function update_hud(player) hb.unhide_hudbar(player, "health") end --air + local breath_max = player:get_properties().breath_max local breath = player:get_breath() - if breath == 11 and hb.settings.autohide_breath == true then + if breath >= breath_max and hb.settings.autohide_breath == true then hb.hide_hudbar(player, "breath") else hb.unhide_hudbar(player, "breath") - hb.change_hudbar(player, "breath", math.min(breath, 10)) + hb.change_hudbar(player, "breath", math.min(breath, breath_max-1), breath_max-1) end --health update_health(player) diff --git a/mods/HUD/hudbars/locale/de.txt b/mods/HUD/hudbars/locale/de.txt deleted file mode 100644 index 578764ea..00000000 --- a/mods/HUD/hudbars/locale/de.txt +++ /dev/null @@ -1,3 +0,0 @@ -Health = Leben -Breath = Atem -%s: %d/%d = %s: %d/%d diff --git a/mods/HUD/hudbars/locale/hudbars.de.tr b/mods/HUD/hudbars/locale/hudbars.de.tr new file mode 100644 index 00000000..3d1e697c --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.de.tr @@ -0,0 +1,4 @@ +# textdomain: hudbars +Health=Leben +Breath=Atem +@1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/hudbars.es.tr b/mods/HUD/hudbars/locale/hudbars.es.tr new file mode 100644 index 00000000..bbf02795 --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.es.tr @@ -0,0 +1,4 @@ +# textdomain: hudbars +Health=Salud +Breath=Aliento +@1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/hudbars.fr.tr b/mods/HUD/hudbars/locale/hudbars.fr.tr new file mode 100644 index 00000000..b31b7b0c --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.fr.tr @@ -0,0 +1,6 @@ +# textdomain: hudbars +Health=Santé +Breath=Breath + +# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” +@1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/hudbars.it.tr b/mods/HUD/hudbars/locale/hudbars.it.tr new file mode 100644 index 00000000..3ada5b66 --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.it.tr @@ -0,0 +1,6 @@ +# textdomain: hudbars +Health=Salute +Breath=Ossigeno + +# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” +@1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/hudbars.ms.tr b/mods/HUD/hudbars/locale/hudbars.ms.tr new file mode 100644 index 00000000..eb811ab6 --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.ms.tr @@ -0,0 +1,4 @@ +# textdomain: hudbars +Health=Kesihatan +Breath=Nafas +@1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/hudbars.nl.tr b/mods/HUD/hudbars/locale/hudbars.nl.tr new file mode 100644 index 00000000..b9c4a417 --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.nl.tr @@ -0,0 +1,6 @@ +# textdomain: hudbars +Health=Gezondheid +Breath=Adem + +# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” +@1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/pt.txt b/mods/HUD/hudbars/locale/hudbars.pt.tr similarity index 59% rename from mods/HUD/hudbars/locale/pt.txt rename to mods/HUD/hudbars/locale/hudbars.pt.tr index 2de62650..a818f092 100644 --- a/mods/HUD/hudbars/locale/pt.txt +++ b/mods/HUD/hudbars/locale/hudbars.pt.tr @@ -1,5 +1,6 @@ -Health = Saude -Breath = Folego +# textdomain: hudbars +Health=Saude +Breath=Folego # Formato de string padrão para progresso bar-style de barras do HUD, por exemplo “Saude 5/20” -%s: %d/%d +@1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/hudbars.ru.tr b/mods/HUD/hudbars/locale/hudbars.ru.tr new file mode 100644 index 00000000..2d278e33 --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.ru.tr @@ -0,0 +1,4 @@ +# textdomain: hudbars +Health=HP +Breath=дыхание +@1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/hudbars.tr.tr b/mods/HUD/hudbars/locale/hudbars.tr.tr new file mode 100644 index 00000000..6a2ce0b5 --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.tr.tr @@ -0,0 +1,4 @@ +# textdomain: hudbars +Health=Can +Breath=Nefes +@1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/template.txt b/mods/HUD/hudbars/locale/template.txt index 0a26b8fe..37b05591 100644 --- a/mods/HUD/hudbars/locale/template.txt +++ b/mods/HUD/hudbars/locale/template.txt @@ -1,5 +1,6 @@ -Health -Breath +# textdomain: hudbars +Health= +Breath= # Default format string for progress bar-style HUD bars, e.g. “Health 5/20” -%s: %d/%d +@1: @2/@3= diff --git a/mods/HUD/hudbars/locale/tr.txt b/mods/HUD/hudbars/locale/tr.txt deleted file mode 100644 index b49c7a06..00000000 --- a/mods/HUD/hudbars/locale/tr.txt +++ /dev/null @@ -1,3 +0,0 @@ -Health = Can -Breath = Nefes -%s: %d/%d = %s: %d/%d diff --git a/mods/HUD/hudbars/mod.conf b/mods/HUD/hudbars/mod.conf index add28e65..5fa238a8 100644 --- a/mods/HUD/hudbars/mod.conf +++ b/mods/HUD/hudbars/mod.conf @@ -1 +1,2 @@ name = hudbars +description = Replaces the health and breath symbols in the HUD by “progress bars” and shows exact values. Other mods can add more progress bars for custom player stats. diff --git a/mods/HUD/hudbars/settingtypes.txt b/mods/HUD/hudbars/settingtypes.txt index 77c1dd09..3e4390e2 100644 --- a/mods/HUD/hudbars/settingtypes.txt +++ b/mods/HUD/hudbars/settingtypes.txt @@ -110,7 +110,7 @@ hudbars_start_statbar_offset_right_x (Right HUD statbar x offset) int 25 hudbars_start_statbar_offset_right_y (Right HUD statbar y offset) int -90 # The vertical distance between two HUD bars, in pixels. -hudbars_vmargin (Vertical distance between HUD bars) int 28 0 +hudbars_vmargin (Vertical distance between HUD bars) int 24 0 [Performance] # The of seconds which need to pass before the server updates the default HUD bars diff --git a/mods/HUD/hudbars/textures/hudbars_bar_background.png b/mods/HUD/hudbars/textures/hudbars_bar_background.png index cbc6c3f5..9a9513b0 100644 Binary files a/mods/HUD/hudbars/textures/hudbars_bar_background.png and b/mods/HUD/hudbars/textures/hudbars_bar_background.png differ diff --git a/mods/HUD/hudbars/textures/hudbars_bgicon_health.png b/mods/HUD/hudbars/textures/hudbars_bgicon_health.png index aa4a6123..ebda3703 100644 Binary files a/mods/HUD/hudbars/textures/hudbars_bgicon_health.png and b/mods/HUD/hudbars/textures/hudbars_bgicon_health.png differ diff --git a/mods/HUD/hudbars/textures/hudbars_icon_breath.png b/mods/HUD/hudbars/textures/hudbars_icon_breath.png index f1d714fe..cbbb6705 100644 Binary files a/mods/HUD/hudbars/textures/hudbars_icon_breath.png and b/mods/HUD/hudbars/textures/hudbars_icon_breath.png differ diff --git a/mods/HUD/hudbars/textures/hudbars_icon_health.png b/mods/HUD/hudbars/textures/hudbars_icon_health.png index d0e30410..7f1b66df 100644 Binary files a/mods/HUD/hudbars/textures/hudbars_icon_health.png and b/mods/HUD/hudbars/textures/hudbars_icon_health.png differ diff --git a/mods/HUD/mcl_achievements/depends.txt b/mods/HUD/mcl_achievements/depends.txt index 1679faeb..203a4c0a 100644 --- a/mods/HUD/mcl_achievements/depends.txt +++ b/mods/HUD/mcl_achievements/depends.txt @@ -1,2 +1 @@ awards -intllib? diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua index 003de726..7473568d 100644 --- a/mods/HUD/mcl_achievements/init.lua +++ b/mods/HUD/mcl_achievements/init.lua @@ -3,12 +3,7 @@ -- If true, activates achievements from other Minecraft editions (XBox, PS, etc.) local non_pc_achievements = false -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function ( s ) return s end -end +local S = minetest.get_translator("mcl_achievements") -- Achievements from PC Edition @@ -152,13 +147,20 @@ awards.register_achievement("mcl:onARail", { icon = "default_rail.png", }) --- Triggered in mcl_throwing +-- Triggered in mcl_bows awards.register_achievement("mcl:snipeSkeleton", { title = S("Sniper Duel"), -- TODO: This achievement should be for killing, not hitting -- TODO: The range should be 50, not 20. Nerfed because of reduced bow range description = S("Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters."), - icon = "mcl_throwing_bow.png", + icon = "mcl_bows_bow.png", +}) + +-- Triggered in mcl_portals +awards.register_achievement("mcl:buildNetherPortal", { + title = S("Into the Nether"), + description = S("Use obsidian and a fire starter to construct a Nether portal."), + icon = "default_obsidian.png", }) -- NON-PC ACHIEVEMENTS (XBox, Pocket Edition, etc.) diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr new file mode 100644 index 00000000..49c486e4 --- /dev/null +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr @@ -0,0 +1,49 @@ +# textdomain:mcl_achievements +Aquire Hardware=Schmied +Bake Bread=Brot backen +Benchmarking=Tischler +Cow Tipper=Kuhschubser +Craft a bookshelf.=Fertigen Sie ein Bücherregal. +Craft a cake using wheat, sugar, milk and an egg.=Fertigen Sie einen Kuchen aus Weizen, Zucker, Milch und einem Ei. +Craft a crafting table from 4 wooden planks.=Fertigen Sie eine Werkbank aus 4 Holzplanken. +Craft a stone pickaxe using sticks and cobblestone.=Fertigen Sie eine Steinspitzhacke aus Stöcken und Kopfsteinpflaster. +Craft a wooden sword using wooden planks and sticks on a crafting table.=Fertigen Sie ein Holzschwert aus Holzplanken und Stöcken an einer Werkbank. +DIAMONDS!=DIAMANTEN! +Delicious Fish=Leckerer Fisch +Dispense With This=Ein Auge darauf werfen +Eat a cooked porkchop.=Essen Sie ein gekochtes Schweinekotelett +Eat a cooked rabbit.=Essen Sie ein gekochtes Kaninchen +Get really desperate and eat rotten flesh.=Verzweifeln Sie und essen Sie Gammelfleisch. +Getting Wood=Holzhacker +Getting an Upgrade=Aufwertung +Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Treffen Sie ein Skelett, Witherskelett oder einen Eiswanderer mit Bogen und Pfeil aus einer Entfernung von mindestens 20 Metern. +Hot Topic=Heißes Eisen +Into Fire=In das Feuer +Into the Nether=In den Nether +Iron Belly=Eiserner Magen +Librarian=Bibliothekar +Mine emerald ore.=Bauen Sie Smaragderz ab. +On A Rail=Auf der Schiene +Pick up a blaze rod from the floor.=Sammeln Sie eine Lohenrute vom Boden auf. +Pick up a diamond from the floor.=Sammeln Sie einen Diamanten vom Boden auf. +Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Sammeln Sie ein Stück Holz vom Boden auf.@nTipp: Hauen Sie einen Baumstamm, bis er als Gegenstand herausploppt. +Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Sammeln Sie Leder vom Boden auf.@nTipp: Kühe und einige andere Tiere werfen vielleicht Leder ab, wenn sie sterben. +Place a dispenser.=Platzieren Sie einen Werfer +Place a flower pot.=Platzieren Sie einen Blumentopf +Pork Chop=Kassler +Pot Planter=Topfpflanzer +Rabbit Season=Kaninchensaison +Sniper Duel=Scharfschützenduell +Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Nehmen Sie einen gekochten Fisch aus einem Ofen.@nTipp: Benutzen Sie eine Angel, um einen Fisch zu fangen und kochen Sie ihn in einem Ofen. +Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Nehmen Sie einen Eisenbarren aus dem Ausgabeschlitz eines Ofens.@nTipp: Um einen Eisenbarren zu erhalten, platzieren Sie einen Brennstoff (wie Kohle) und Eisenerz in einen Ofen. +The Haggler=Der Sammler +The Lie=Die Lüge +Time to Farm!=Bauernzeit +Time to Mine!=Zeit zum Graben! +Time to Strike!=Zuschlagen! +Travel by minecart for at least 1000 meters from your starting point in a single ride.=Reisen Sie mit einer Lore für mindestens 1000 Meter vom Startpunkt aus in einer einzigen Fahrt. +Use 8 cobblestones to craft a furnace.=Benutzen Sie 8 Kopfsteinpflaster, um einen Ofen zu fertigen. +Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Benutzen Sie eine Werkbank, um eine Holzhacke aus Holzplanken und Stöcken zu fertigen. +Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Benutzen Sie eine Werkbank, um eine Holzspitzhacke aus Holzplanken und Stöcken zu fertigen. +Use obsidian and a fire starter to construct a Nether portal.=Benutzen Sie Obsidian und ein Feuerzeug, um ein Netherportal zu errichten. +Use wheat to craft a bread.=Benutzen Sie Weizen, um ein Brot zu machen. diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr new file mode 100644 index 00000000..2044e826 --- /dev/null +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr @@ -0,0 +1,49 @@ +# textdomain:mcl_achievements +Aquire Hardware=Obteniendo un lingote +Bake Bread=Horneando pan +Benchmarking=Crea tu mesa de trabajo +Cow Tipper=Consiguiendo cuero +Craft a bookshelf.=Crea una estantería. +Craft a cake using wheat, sugar, milk and an egg.=Crea una tarta con trigo, azúcar, leche y un huevo. +Craft a crafting table from 4 wooden planks.=Crea una mesa de trabajo con 4 tablas de madera procesada. +Craft a stone pickaxe using sticks and cobblestone.=Crea un pico de piedra con palos y rocas. +Craft a wooden sword using wooden planks and sticks on a crafting table.=Haz una espada de madera con tablas de madera y palos en una mesa de trabajo. +DIAMONDS!=¡Diamantes! +Delicious Fish=Delicioso pescado +Dispense With This=Prescinda de esto +Eat a cooked porkchop.=Come una chuleta de cerdo cocinado. +Eat a cooked rabbit.=Come un conejo cocinado. +Get really desperate and eat rotten flesh.=Desesperate y come carne podrida. +Getting Wood=Obtén madera +Getting an Upgrade=Obteniendo una mejora +Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Golpear un esqueleto, Wither o desviarle con arco y flecha desde una distancia de al menos 20 metros. +Hot Topic=Tema candente +Into Fire=En el fuego +Into the Nether=En el abismo +Iron Belly=Vientre de hierro +Librarian=Bibliotecario +Mine emerald ore.=Mina de esmeralda. +On A Rail=Viajando en un carril +Pick up a blaze rod from the floor.=Recoge una barra de fuego del suelo. +Pick up a diamond from the floor.=Recoge un diamante del suelo. +Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Recoge un elemento de madera del suelo. @nSugerencia: Golpee el tronco de un árbol hasta que salga como un elemento. +Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Recoja el cuero del suelo. @nSugerencia: Las vacas y algunos otros animales tienen la oportunidad de soltar el cuero cuando mueren. +Place a dispenser.=Coloca un dispensador. +Place a flower pot.=Coloca una maceta. +Pork Chop=Chuleta de cerdo +Pot Planter=Jardinero +Rabbit Season=Temporada del conejo +Sniper Duel=Duelo de arqueros +Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Tome un pescado cocido de un horno. @nSugerencia: Use una caña de pescar para atrapar un pez y cocínelo en un horno. +Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Obtén un lingote de hierro de un horno. @nSugerencia: Para fundir un lingote de hierro, coloque un combustible (como carbón) y mineral de hierro en un horno. +The Haggler=El regateador +The Lie=El cocinero +Time to Farm!=¡Hora de cultivar! +Time to Mine!=¡Hora de minar! +Time to Strike!=¡Hora de atacar! +Travel by minecart for at least 1000 meters from your starting point in a single ride.=Viaje en un carro minero durante al menos 1000 metros desde su punto de partida en un solo viaje. +Use 8 cobblestones to craft a furnace.=Usa 8 rocas para crear un horno. +Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Usa una mesa de trabajo para hacer una azada de madera con tablas de madera procesada y palos de madera. +Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Usa una mesa de trabajo para hacer un pico de madera con tablas de madera procesada y palos de madera. +Use obsidian and a fire starter to construct a Nether portal.=Usa obsidiana y un iniciador de fuego para construir un portal abisal. +Use wheat to craft a bread.=Usa trigo para elaborar pan. diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr new file mode 100644 index 00000000..ae4941d2 --- /dev/null +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr @@ -0,0 +1,49 @@ +# textdomain:mcl_achievements +Aquire Hardware=Acquérir du matériel +Bake Bread=Faire du pain +Benchmarking=Fabriquer +Cow Tipper=Chevaucher une vache +Craft a bookshelf.=Fabriquez une Bibliothèque. +Craft a cake using wheat, sugar, milk and an egg.=Fabriquez un gâteau avec du blé, du sucre, du lait et un œuf. +Craft a crafting table from 4 wooden planks.=Fabriquez un établi à partir de 4 planches de bois. +Craft a stone pickaxe using sticks and cobblestone.=Fabriquez une pioche en pierre à l'aide de bâtons et de pierre. +Craft a wooden sword using wooden planks and sticks on a crafting table.=Fabriquez une épée en bois à l'aide de planches et de bâtons en bois sur un établi. +DIAMONDS!=DIAMANTS! +Delicious Fish=Délicieux Poisson +Dispense With This=Dispenser de ça +Eat a cooked porkchop.=Mangez du porc cuit. +Eat a cooked rabbit.=Mangez du lapin cuit. +Get really desperate and eat rotten flesh.=Soyez vraiment désespéré et mangez de la chair pourrie. +Getting Wood=Obtenir du bois +Getting an Upgrade=Obtenir une augmentaton de niveau +Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Frappez un squelette, wither squelette ou stray à l'arc et à la flèche à une distance d'au moins 20 mètres. +Hot Topic=Sujet brûlant +Into Fire=Dans le feu +Into the Nether=Dans le Nether +Iron Belly=Ventre de fer +Librarian=Bibliothécaire +Mine emerald ore.=Mine de minerai d'émeraude. +On A Rail=Sur un rail +Pick up a blaze rod from the floor.=Ramassez une tige de feu sur le sol. +Pick up a diamond from the floor.=Ramassez un diamant sur le sol. +Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Ramassez un objet en bois du sol.@nConseil: Frappez un tronc d'arbre jusqu'à ce qu'il ressorte comme un objet. +Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Ramassez le cuir du sol.@nConseil: Les vaches et certains autres animaux ont une chance de laisser tomber le cuir lorsqu'ils sont tués. +Place a dispenser.=Placez un distributeur. +Place a flower pot.=Placez un pot de fleurs. +Pork Chop=Côtelette de porc +Pot Planter=Jardinière en pot +Rabbit Season=Saison du lapin +Sniper Duel=Duel de sniper +Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Prenez un poisson cuit d'un four.@nConseil: Utilisez une canne à pêche pour attraper un poisson et faites-le cuire dans un four. +Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Prenez un lingot de fer dans la fente de sortie d'un four.@nConseil: Pour faire fondre un lingot de fer, mettez du combustible (comme du charbon) et du minerai de fer dans un four. +The Haggler=Le marchand +The Lie=Le mensonge +Time to Farm!=C'est l'heure du fermier! +Time to Mine!=C'est l'heure de miner! +Time to Strike!=C'est l'heure de combattre! +Travel by minecart for at least 1000 meters from your starting point in a single ride.=Voyagez en wagonnet sur au moins 1000 mètres de votre point de départ en une seule fois. +Use 8 cobblestones to craft a furnace.=Utilise 8 pierres pour fabriquer un four. +Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Utilisez un établi pour fabriquer une houe en bois à partir de planches et de bâtons en bois. +Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Utilisez un établi pour fabriquer une pioche en bois à partir de planches et de bâtons en bois. +Use obsidian and a fire starter to construct a Nether portal.=Utilisez de l'obsidienne et un briquet pour construire un portail du Nether. +Use wheat to craft a bread.=Utilisez du blé pour fabriquer un pain. diff --git a/mods/HUD/mcl_achievements/locale/template.txt b/mods/HUD/mcl_achievements/locale/template.txt new file mode 100644 index 00000000..ecdba267 --- /dev/null +++ b/mods/HUD/mcl_achievements/locale/template.txt @@ -0,0 +1,49 @@ +# textdomain:mcl_achievements +Aquire Hardware= +Bake Bread= +Benchmarking= +Cow Tipper= +Craft a bookshelf.= +Craft a cake using wheat, sugar, milk and an egg.= +Craft a crafting table from 4 wooden planks.= +Craft a stone pickaxe using sticks and cobblestone.= +Craft a wooden sword using wooden planks and sticks on a crafting table.= +DIAMONDS!= +Delicious Fish= +Dispense With This= +Eat a cooked porkchop.= +Eat a cooked rabbit.= +Get really desperate and eat rotten flesh.= +Getting Wood= +Getting an Upgrade= +Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.= +Hot Topic= +Into Fire= +Into the Nether= +Iron Belly= +Librarian= +Mine emerald ore.= +On A Rail= +Pick up a blaze rod from the floor.= +Pick up a diamond from the floor.= +Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.= +Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.= +Place a dispenser.= +Place a flower pot.= +Pork Chop= +Pot Planter= +Rabbit Season= +Sniper Duel= +Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.= +Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.= +The Haggler= +The Lie= +Time to Farm!= +Time to Mine!= +Time to Strike!= +Travel by minecart for at least 1000 meters from your starting point in a single ride.= +Use 8 cobblestones to craft a furnace.= +Use a crafting table to craft a wooden hoe from wooden planks and sticks.= +Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.= +Use obsidian and a fire starter to construct a Nether portal.= +Use wheat to craft a bread.= diff --git a/mods/HUD/mcl_achievements/textures/mcl_achievements_button.png b/mods/HUD/mcl_achievements/textures/mcl_achievements_button.png index cef7e59c..fd9d0bd1 100644 Binary files a/mods/HUD/mcl_achievements/textures/mcl_achievements_button.png and b/mods/HUD/mcl_achievements/textures/mcl_achievements_button.png differ diff --git a/mods/HUD/mcl_base_textures/textures/bubble.png b/mods/HUD/mcl_base_textures/textures/bubble.png index f1d714fe..cbbb6705 100644 Binary files a/mods/HUD/mcl_base_textures/textures/bubble.png and b/mods/HUD/mcl_base_textures/textures/bubble.png differ diff --git a/mods/HUD/mcl_base_textures/textures/crack_anylength.png b/mods/HUD/mcl_base_textures/textures/crack_anylength.png index 7fe8721d..5f79448b 100644 Binary files a/mods/HUD/mcl_base_textures/textures/crack_anylength.png and b/mods/HUD/mcl_base_textures/textures/crack_anylength.png differ diff --git a/mods/HUD/mcl_base_textures/textures/crosshair.png b/mods/HUD/mcl_base_textures/textures/crosshair.png index 8e94dcc6..a3d7579b 100644 Binary files a/mods/HUD/mcl_base_textures/textures/crosshair.png and b/mods/HUD/mcl_base_textures/textures/crosshair.png differ diff --git a/mods/HUD/mcl_base_textures/textures/heart.png b/mods/HUD/mcl_base_textures/textures/heart.png index d0e30410..7f1b66df 100644 Binary files a/mods/HUD/mcl_base_textures/textures/heart.png and b/mods/HUD/mcl_base_textures/textures/heart.png differ diff --git a/mods/HUD/mcl_base_textures/textures/mcl_base_textures_background.png b/mods/HUD/mcl_base_textures/textures/mcl_base_textures_background.png new file mode 100644 index 00000000..e5d693e7 Binary files /dev/null and b/mods/HUD/mcl_base_textures/textures/mcl_base_textures_background.png differ diff --git a/mods/HUD/mcl_base_textures/textures/mcl_base_textures_background9.png b/mods/HUD/mcl_base_textures/textures/mcl_base_textures_background9.png new file mode 100644 index 00000000..e5d693e7 Binary files /dev/null and b/mods/HUD/mcl_base_textures/textures/mcl_base_textures_background9.png differ diff --git a/mods/HUD/mcl_base_textures/textures/mcl_base_textures_button9.png b/mods/HUD/mcl_base_textures/textures/mcl_base_textures_button9.png new file mode 100644 index 00000000..aab16013 Binary files /dev/null and b/mods/HUD/mcl_base_textures/textures/mcl_base_textures_button9.png differ diff --git a/mods/HUD/mcl_base_textures/textures/mcl_base_textures_button9_pressed.png b/mods/HUD/mcl_base_textures/textures/mcl_base_textures_button9_pressed.png new file mode 100644 index 00000000..aeaea13a Binary files /dev/null and b/mods/HUD/mcl_base_textures/textures/mcl_base_textures_button9_pressed.png differ diff --git a/mods/HUD/mcl_base_textures/textures/smoke_puff.png b/mods/HUD/mcl_base_textures/textures/smoke_puff.png new file mode 100644 index 00000000..b1be8d4e Binary files /dev/null and b/mods/HUD/mcl_base_textures/textures/smoke_puff.png differ diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index f351983c..dfc5191a 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -1,110 +1,116 @@ +local S = minetest.get_translator("mcl_death_messages") +local N = function(s) return s end + mcl_death_messages = {} -- Death messages local msgs = { ["arrow"] = { - "%s was fatally hit by an arrow.", - "%s has been killed with an arrow.", + N("@1 was fatally hit by an arrow."), + N("@1 has been killed by an arrow."), }, ["arrow_name"] = { - "%s was shot by an arrow from %s.", + N("@1 was shot by an arrow from @2."), }, - ["fire"] = { - "%s has been cooked crisp.", - "%s felt the burn.", - "%s died in the flames.", - "%s died in a fire.", + ["arrow_skeleton"] = { + N("@1 was shot by an arrow from a skeleton."), }, - ["lava"] = { - "%s melted in lava.", - "%s took a bath in a hot lava tub.", - "%s died in lava.", - "%s could not survive in lava.", + ["arrow_stray"] = { + N("@1 was shot by an arrow from a stray."), + }, + ["arrow_illusioner"] = { + N("@1 was shot by an arrow from an illusioner."), + }, + ["arrow_mob"] = { + N("@1 was shot by an arrow."), }, ["drown"] = { - "%s forgot to breathe.", - "%s drowned.", - "%s ran out of oxygen.", - }, - ["starve"] = { - "%s starved.", + N("@1 forgot to breathe."), + N("@1 drowned."), + N("@1 ran out of oxygen."), }, ["murder"] = { - "%s was killed by %s.", + N("@1 was killed by @2."), + }, + ["murder_any"] = { + N("@1 was killed."), }, ["mob_kill"] = { - "%s was killed by a mob.", + N("@1 was killed by a mob."), }, ["blaze_fireball"] = { - "%s was burned to death by a blaze's fireball.", - "%s was killed by a fireball from a blaze.", + N("@1 was burned to death by a blaze's fireball."), + N("@1 was killed by a fireball from a blaze."), }, ["fire_charge"] = { - "%s was hit by a fire charge.", + N("@1 was burned by a fire charge."), }, ["ghast_fireball"] = { - "A ghast scared %s to death.", - "%s has been fireballed by a ghast.", + N("A ghast scared @1 to death."), + N("@1 has been fireballed by a ghast."), }, - ["fall_damage"] = { - "%s fell from a high cliff.", - "%s took fatal fall damage.", - "%s fell victim to gravity.", + ["fall"] = { + N("@1 fell from a high cliff."), + N("@1 took fatal fall damage."), + N("@1 fell victim to gravity."), }, ["other"] = { - "%s died.", + N("@1 died."), } } local mobkills = { - ["mobs_mc:zombie"] = "%s was killed by a zombie.", - ["mobs_mc:blaze"] = "%s was killed by a blaze.", - ["mobs_mc:slime"] = "%s was killed by a slime.", - ["mobs_mc:witch"] = "%s was killed by a witch.", - ["mobs_mc:magma_cube_tiny"] = "%s was killed by a magma cube.", - ["mobs_mc:magma_cube_small"] = "%s was killed by a magma cube.", - ["mobs_mc:magma_cube_big"] = "%s was killed by a magma cube.", - ["mobs_mc:wolf"] = "%s was killed by a wolf.", - ["mobs_mc:cat"] = "%s was killed by a cat.", - ["mobs_mc:ocelot"] = "%s was killed by an ocelot.", - ["mobs_mc:ender_dragon"] = "%s was killed by an ender dragon.", - ["mobs_mc:wither"] = "%s was killed by a wither.", - ["mobs_mc:enderman"] = "%s was killed by an enderman.", - ["mobs_mc:endermite"] = "%s was killed by an endermite.", - ["mobs_mc:ghast"] = "%s was killed by a ghast.", - ["mobs_mc:guardian_elder"] = "%s was killed by an elder guardian.", - ["mobs_mc:guardian"] = "%s was killed by a guardian.", - ["mobs_mc:iron_golem"] = "%s was killed by an iron golem.", - ["mobs_mc:polar_bear"] = "%s was killed by a polar_bear.", - ["mobs_mc:killer_bunny"] = "%s was killed by a killer bunny.", - ["mobs_mc:shulker"] = "%s was killed by a shulker.", - ["mobs_mc:silverfish"] = "%s was killed by a silverfish.", - ["mobs_mc:skeleton"] = "%s was killed by a skeleton.", - ["mobs_mc:stray"] = "%s was killed by a stray.", - ["mobs_mc:slime_tiny"] = "%s was killed by a slime.", - ["mobs_mc:slime_small"] = "%s was killed by a slime.", - ["mobs_mc:slime_big"] = "%s was killed by a slime.", - ["mobs_mc:spider"] = "%s was killed by a spider.", - ["mobs_mc:cave_spider"] = "%s was killed by a cave spider.", - ["mobs_mc:vex"] = "%s was killed by a vex.", - ["mobs_mc:evoker"] = "%s was killed by an evoker.", - ["mobs_mc:illusioner"] = "%s was killed by an illusioner.", - ["mobs_mc:vindicator"] = "%s was killed by a vindicator.", - ["mobs_mc:villager_zombie"] = "%s was killed by a zombie villager.", - ["mobs_mc:husk"] = "%s was killed by a husk.", - ["mobs_mc:zombiepig"] = "%s was killed by a zombie pigman.", + ["mobs_mc:zombie"] = N("@1 was killed by a zombie."), + ["mobs_mc:baby_zombie"] = N("@1 was killed by a baby zombie."), + ["mobs_mc:blaze"] = N("@1 was killed by a blaze."), + ["mobs_mc:slime"] = N("@1 was killed by a slime."), + ["mobs_mc:witch"] = N("@1 was killed by a witch."), + ["mobs_mc:magma_cube_tiny"] = N("@1 was killed by a magma cube."), + ["mobs_mc:magma_cube_small"] = N("@1 was killed by a magma cube."), + ["mobs_mc:magma_cube_big"] = N("@1 was killed by a magma cube."), + ["mobs_mc:wolf"] = N("@1 was killed by a wolf."), + ["mobs_mc:cat"] = N("@1 was killed by a cat."), + ["mobs_mc:ocelot"] = N("@1 was killed by an ocelot."), + ["mobs_mc:enderdragon"] = N("@1 was killed by an ender dragon."), + ["mobs_mc:wither"] = N("@1 was killed by a wither."), + ["mobs_mc:enderman"] = N("@1 was killed by an enderman."), + ["mobs_mc:endermite"] = N("@1 was killed by an endermite."), + ["mobs_mc:ghast"] = N("@1 was killed by a ghast."), + ["mobs_mc:guardian_elder"] = N("@1 was killed by an elder guardian."), + ["mobs_mc:guardian"] = N("@1 was killed by a guardian."), + ["mobs_mc:iron_golem"] = N("@1 was killed by an iron golem."), + ["mobs_mc:polar_bear"] = N("@1 was killed by a polar_bear."), + ["mobs_mc:killer_bunny"] = N("@1 was killed by a killer bunny."), + ["mobs_mc:shulker"] = N("@1 was killed by a shulker."), + ["mobs_mc:silverfish"] = N("@1 was killed by a silverfish."), + ["mobs_mc:skeleton"] = N("@1 was killed by a skeleton."), + ["mobs_mc:stray"] = N("@1 was killed by a stray."), + ["mobs_mc:slime_tiny"] = N("@1 was killed by a slime."), + ["mobs_mc:slime_small"] = N("@1 was killed by a slime."), + ["mobs_mc:slime_big"] = N("@1 was killed by a slime."), + ["mobs_mc:spider"] = N("@1 was killed by a spider."), + ["mobs_mc:cave_spider"] = N("@1 was killed by a cave spider."), + ["mobs_mc:vex"] = N("@1 was killed by a vex."), + ["mobs_mc:evoker"] = N("@1 was killed by an evoker."), + ["mobs_mc:illusioner"] = N("@1 was killed by an illusioner."), + ["mobs_mc:vindicator"] = N("@1 was killed by a vindicator."), + ["mobs_mc:villager_zombie"] = N("@1 was killed by a zombie villager."), + ["mobs_mc:husk"] = N("@1 was killed by a husk."), + ["mobs_mc:baby_husk"] = N("@1 was killed by a baby husk."), + ["mobs_mc:pigman"] = N("@1 was killed by a zombie pigman."), + ["mobs_mc:baby_pigman"] = N("@1 was killed by a baby zombie pigman."), } -- Select death message local dmsg = function(mtype, ...) local r = math.random(1, #msgs[mtype]) - return string.format(msgs[mtype][r], ...) + return S(msgs[mtype][r], ...) end -- Select death message for death by mob local mmsg = function(mtype, ...) if mobkills[mtype] then - return string.format(mobkills[mtype], ...) + return S(mobkills[mtype], ...) else return dmsg("mob_kill", ...) end @@ -112,133 +118,164 @@ end local last_damages = { } -minetest.register_on_dieplayer(function(player) +minetest.register_on_dieplayer(function(player, reason) -- Death message local message = minetest.settings:get_bool("mcl_showDeathMessages") - if message == nil then message = true end + if message == nil then + message = true + end if message then local name = player:get_player_name() if not name then return end - - local node = minetest.registered_nodes[minetest.get_node(player:getpos()).name] local msg - -- Lava - if minetest.get_item_group(node.name, "lava") ~= 0 then - msg = dmsg("lava", name) - -- Drowning - elseif player:get_breath() == 0 then - msg = dmsg("drown", name) - -- Fire - elseif minetest.get_item_group(node.name, "fire") ~= 0 then - msg = dmsg("fire", name) - -- Other - else - -- Killed by entity - if last_damages[name] then - -- Mob - if last_damages[name].hittertype == "mob" then - if last_damages[name].hittername then - msg = dmsg("murder", name, last_damages[name].hittername) - else - msg = mmsg(last_damages[name].hittersubtype, name) - end - -- Player - elseif last_damages[name].hittertype == "player" then - if last_damages[name].hittername == name then - -- Workaround when player somehow punches self. Caused by creeper explosions in mobs mod. - -- FIXME: Remove when self-punching is no longer buggy. - msg = dmsg("other", name) - else - msg = dmsg("murder", name, last_damages[name].hittername) - end - -- Arrow - elseif last_damages[name].hittertype == "arrow" then - if last_damages[name].shooter == nil then - msg = dmsg("arrow", name) - elseif last_damages[name].shooter:is_player() then - msg = dmsg("arrow_name", name, last_damages[name].shooter:get_player_name()) - elseif last_damages[name].shooter:get_luaentity()._cmi_is_mob then - if last_damages[name].shooter:get_luaentity().nametag ~= "" then - msg = dmsg("arrow_name", name, last_damages[name].shooter:get_player_name()) - else - msg = dmsg("arrow", name) - end - else - msg = dmsg("arrow", name) - end - -- Fireball - elseif last_damages[name].hittertype == "blaze_fireball" then - msg = dmsg("blaze_fireball", name) - elseif last_damages[name].hittertype == "ghast_fireball" then - msg = dmsg("ghast_fireball", name) - elseif last_damages[name].hittertype == "fire_charge" then - msg = dmsg("fire_charge", name) - -- Custom death message - elseif last_damages[name].custom then - msg = last_damages[name].message + if last_damages[name] then + -- custom message + msg = last_damages[name].message + elseif reason.type == "node_damage" then + local pos = player:get_pos() + -- Check multiple nodes because players occupy multiple nodes + -- (we add one additional node because the check may fail if the player was + -- just barely touching the node with the head) + local posses = { pos, {x=pos.x,y=pos.y+1,z=pos.z}, {x=pos.x,y=pos.y+2,z=pos.z}} + local highest_damage = 0 + local highest_damage_def = nil + -- Show message for node that dealt the most damage + for p=1, #posses do + local def = minetest.registered_nodes[minetest.get_node(posses[p]).name] + local dmg = def.damage_per_second + if dmg and dmg > highest_damage then + highest_damage = dmg + highest_damage_def = def end - -- Other reason - else - msg = dmsg("other", name) + end + if highest_damage_def and highest_damage_def._mcl_node_death_message then + local field = highest_damage_def._mcl_node_death_message + local field_msg + if type(field) == "table" then + field_msg = field[math.random(1, #field)] + else + field_msg = field + end + local textdomain + if highest_damage_def.mod_origin then + textdomain = highest_damage_def.mod_origin + else + textdomain = "mcl_death_messages" + end + -- We assume the textdomain of the death message in the node definition + -- equals the modname. + msg = minetest.translate(textdomain, field_msg, name) + end + elseif reason.type == "drown" then + msg = dmsg("drown", name) + elseif reason.type == "punch" then + -- Punches + local hitter = reason.object + local hittername, hittertype, hittersubtype, shooter + -- Custom message + if last_damages[name] then + msg = last_damages[name].message + -- Unknown hitter + elseif hitter == nil then + msg = dmsg("murder_any", name) + -- Player + elseif hitter:is_player() then + hittername = hitter:get_player_name() + if hittername ~= nil then + msg = dmsg("murder", name, hittername) + else + msg = dmsg("murder_any", name) + end + -- Mob (according to Common Mob Interface) + elseif hitter:get_luaentity()._cmi_is_mob then + if hitter:get_luaentity().nametag and hitter:get_luaentity().nametag ~= "" then + hittername = hitter:get_luaentity().nametag + end + hittersubtype = hitter:get_luaentity().name + if hittername then + msg = dmsg("murder", name, hittername) + elseif hittersubtype ~= nil and hittersubtype ~= "" then + msg = mmsg(hittersubtype, name) + else + msg = dmsg("murder_any", name) + end + -- Arrow + elseif hitter:get_luaentity().name == "mcl_bows:arrow_entity" or hitter:get_luaentity().name == "mobs_mc:arrow_entity" then + local shooter + if hitter:get_luaentity()._shooter then + shooter = hitter:get_luaentity()._shooter + end + local is_mob = false + local s_ent = shooter and shooter:get_luaentity() + if shooter == nil then + msg = dmsg("arrow", name) + elseif shooter:is_player() then + msg = dmsg("arrow_name", name, shooter:get_player_name()) + elseif s_ent and s_ent._cmi_is_mob then + if s_ent.nametag ~= "" then + msg = dmsg("arrow_name", name, shooter:get_player_name()) + elseif s_ent.name == "mobs_mc:skeleton" then + msg = dmsg("arrow_skeleton", name) + elseif s_ent.name == "mobs_mc:stray" then + msg = dmsg("arrow_stray", name) + elseif s_ent.name == "mobs_mc:illusioner" then + msg = dmsg("arrow_illusioner", name) + else + msg = dmsg("arrow_mob", name) + end + else + msg = dmsg("arrow", name) + end + -- Blaze fireball + elseif hitter:get_luaentity().name == "mobs_mc:blaze_fireball" then + if hitter:get_luaentity()._shot_from_dispenser then + msg = dmsg("fire_charge", name) + else + msg = dmsg("blaze_fireball", name) + end + -- Ghast fireball + elseif hitter:get_luaentity().name == "mobs_monster:fireball" then + msg = dmsg("ghast_fireball", name) + end + -- Falling + elseif reason.type == "fall" then + msg = dmsg("fall", name) + -- Other + elseif reason.type == "set_hp" then + if last_damages[name] then + msg = last_damages[name].message end end - if msg then - minetest.chat_send_all(msg) + if not msg then + msg = dmsg("other", name) end + minetest.chat_send_all(msg) + last_damages[name] = nil end end) -local start_damage_reset_countdown = function (player) - minetest.after(1, function(playername) - last_damages[playername] = nil - end, player:get_player_name()) +-- dmg_sequence_number is used to discard old damage events +local dmg_sequence_number = 0 +local start_damage_reset_countdown = function (player, sequence_number) + minetest.after(1, function(playername, sequence_number) + if last_damages[playername] and last_damages[playername].sequence_number == sequence_number then + last_damages[playername] = nil + end + end, player:get_player_name(), sequence_number) end -minetest.register_on_punchplayer(function(player, hitter) - if not player or not player:is_player() or not hitter then - return - end - local msg - local hittername, hittertype, hittersubtype, shooter - -- Player - if hitter:is_player() then - hittername = hitter:get_player_name() - hittertype = "player" - -- Mob (according to Common Mob Interface) - elseif hitter:get_luaentity()._cmi_is_mob then - if hitter:get_luaentity().nametag and hitter:get_luaentity().nametag ~= "" then - hittername = hitter:get_luaentity().nametag - end - hittertype = "mob" - hittersubtype = hitter:get_luaentity().name - -- Arrow - elseif hitter:get_luaentity().name == "mcl_throwing:arrow_entity" or hitter:get_luaentity().name == "mobs_mc:arrow_entity" then - hittertype = "arrow" - if hitter:get_luaentity()._shooter then - shooter = hitter:get_luaentity()._shooter - end - -- Blaze fireball - elseif hitter:get_luaentity().name == "mobs_mc:blaze_fireball" then - if hitter:get_luaentity()._shot_from_dispenser then - hittertype = "fire_charge" - else - hittertype = "blaze_fireball" - end - -- Ghast fireball - elseif hitter:get_luaentity().name == "mobs_monster:fireball" then - hittertype = "ghast_fireball" - else - return - end - - last_damages[player:get_player_name()] = { shooter = shooter, hittername = hittername, hittertype = hittertype, hittersubtype = hittersubtype } - start_damage_reset_countdown(player) -end) - --- To be called BEFORE damaging a player. If the player died, then message will be used as the death message. +-- Send a custom death mesage when damaging a player via set_hp or punch. +-- To be called directly BEFORE damaging a player via set_hp or punch. +-- The next time the player dies due to a set_hp, the message will be shown. +-- The player must die via set_hp within 0.1 seconds, otherwise the message will be discarded. function mcl_death_messages.player_damage(player, message) - last_damages[player:get_player_name()] = { custom = true, message = message } - start_damage_reset_countdown(player) + last_damages[player:get_player_name()] = { message = message, sequence_number = dmg_sequence_number } + start_damage_reset_countdown(player, dmg_sequence_number) + dmg_sequence_number = dmg_sequence_number + 1 + if dmg_sequence_number >= 65535 then + dmg_sequence_number = 0 + end end + diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr new file mode 100644 index 00000000..b9ef6680 --- /dev/null +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr @@ -0,0 +1,58 @@ +# textdomain: mcl_death_messages +@1 was fatally hit by an arrow.=@1 wurde tödlich von einem Pfeil getroffen. +@1 has been killed by an arrow.=@1 wurde von einem Pfeil getötet. +@1 was shot by an arrow from @2.=@1 wurde mit einem Pfeil von @2 abgeschossen. +@1 was shot by an arrow from a skeleton.=@1 wurde von einem Skelett mit Pfeil und Bogen abgeschossen. +@1 was shot by an arrow from a stray.=@1 wurde von einem Eiswanderer mit Pfeil und Bogen abgeschossen. +@1 was shot by an arrow from an illusioner.=@1 wurde von einem Illusionisten mit Pfeil und Bogen abgeschossen. +@1 was shot by an arrow.=@1 wurde mit einem Pfeil abgeschossen. +@1 forgot to breathe.=@1 vergaß, zu atmen. +@1 drowned.=@1 ertrank. +@1 ran out of oxygen.=@1 ging die Luft aus. +@1 was killed by @2.=@1 wurde von @2 getötet. +@1 was killed.=@1 wurde getötet. +@1 was killed by a mob.=@1 wurde von einem Mob getötet. +@1 was burned to death by a blaze's fireball.=@1 wurde von einem Feuerball einer Lohe zu Tode verbrannt. +@1 was killed by a fireball from a blaze.=@1 wurde von einem Feuerball einer Lohe getötet. +@1 was burned by a fire charge.=@1 wurde von einer Feuerkugel verbrannt. +A ghast scared @1 to death.=Ein Ghast hat @1 zu Tode erschrocken. +@1 has been fireballed by a ghast.=@1 wurde von einem Ghast mit einer Feuerkugel abgeschossen. +@1 fell from a high cliff.=@1 stürzte von einer hohen Klippe. +@1 took fatal fall damage.=@1 nahm tödlichen Fallschaden. +@1 fell victim to gravity.=@1 fiel der Schwerkraft zum Opfer. +@1 died.=@1 starb. +@1 was killed by a zombie.=@1 wurde von einem Zombie getötet. +@1 was killed by a baby zombie.=@1 wurde von einem Zombiebaby getötet. +@1 was killed by a blaze.=@1 wurde von einer Lohe getötet. +@1 was killed by a slime.=@1 wurde von einem Schleim getötet. +@1 was killed by a witch.=@1 wurde von einer Hexe getötet. +@1 was killed by a magma cube.=@1 wurde von einem Magmakubus getötet. +@1 was killed by a wolf.=@1 wurde von einem Wolf getötet. +@1 was killed by a cat.=@1 wurde von einer Katze getötet. +@1 was killed by an ocelot.=@1 wurde von einem Ozelot getötet. +@1 was killed by an ender dragon.=@1 wurde von einem Enderdrachen getötet. +@1 was killed by a wither.=@1 wurde von einem Wither getötet. +@1 was killed by an enderman.=@1 wurde von einem Enderman getötet. +@1 was killed by an endermite.=@1 wurde von einer Endermilbe getötet. +@1 was killed by a ghast.=@1 wurde von einem Ghast getötet. +@1 was killed by an elder guardian.=@1 wurde von einem Großen Wächter getötet. +@1 was killed by a guardian.=@1 wurde von einem Wächter getötet. +@1 was killed by an iron golem.=@1 wurde von einem Eisengolem getötet. +@1 was killed by a polar_bear.=@1 wurde von einem Eisbären getötet. +@1 was killed by a killer bunny.=@1 wurde von einem Killerkaninchen getötet. +@1 was killed by a shulker.=@1 wurde von einem Schulker getötet. +@1 was killed by a silverfish.=@1 wurde von einem Silberfischchen getötet. +@1 was killed by a skeleton.=@1 wurde von einem Skelett getötet. +@1 was killed by a stray.=@1 wurde von einem Eiswanderer getötet. +@1 was killed by a slime.=@1 wurde von einem Schleim getötet. +@1 was killed by a spider.=@1 wurde von einer Spinne getötet. +@1 was killed by a cave spider.=@1 wurde von einer Höhlenspinne getötet. +@1 was killed by a vex.=@1 wurde von einem Plagegeist getötet. +@1 was killed by an evoker.=@1 wurde von einem Magier getötet. +@1 was killed by an illusioner.=@1 wurde von einem Illusionisten getötet. +@1 was killed by a vindicator.=@1 wurde von einem Diener getötet. +@1 was killed by a zombie villager.=@1 wurde von einem Dorfbewohnerzombie getötet. +@1 was killed by a husk.=@1 wurde von einem Wüstenzombie getötet. +@1 was killed by a baby husk.=@1 wurde von einem Wüstenzombiebaby getötet. +@1 was killed by a zombie pigman.=@1 wurde von einem Schweinezombie getötet. +@1 was killed by a baby zombie pigman.=@1 wurde von einem Schweinezombiebaby getötet. diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.es.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.es.tr new file mode 100644 index 00000000..6ed106db --- /dev/null +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.es.tr @@ -0,0 +1,57 @@ +# textdomain: mcl_death_messages +@1 was fatally hit by an arrow.=@1 fue golpeado muy duro por una flecha. +@1 has been killed by an arrow.=@1 ha sido asesinado por una flecha. +@1 was shot by an arrow from @2.=@1 fue disparado por una flecha de @2. +@1 was shot by an arrow from a skeleton.=@1 fue disparado por una flecha de un esqueleto. +@1 was shot by an arrow from a stray.=@1 fue disparado por una flecha de un extraviado. +@1 was shot by an arrow from an illusioner.=@1 fue disparado por una flecha de un ilusionista. +@1 was shot by an arrow.=@1 fue disparado por una flecha. +@1 forgot to breathe.=@1 olvidó respirar. +@1 drowned.=@1 ahogado. +@1 ran out of oxygen.=@1 se quedó sin oxígeno. +@1 was killed by @2.=@1 fue matado por @2. +@1 was killed by a mob.=@1 fue asesinado por un animal. +@1 was burned to death by a blaze's fireball.=@1 fue quemado hasta la muerte por la bola de fuego de un incendio. +@1 was killed by a fireball from a blaze.=@1 fue asesinado por una bola de fuego de un incendio. +@1 was burned by a fire charge.=@1 fue quemado por una carga de fuego. +A ghast scared @1 to death.=Se ha asustado @1 hasta morir. +@1 has been fireballed by a ghast.=@1 ha sido disparado por un fantasma. +@1 fell from a high cliff.=@1 cayó de un acantilado. +@1 took fatal fall damage.=@1 se hizo daño crítico por una caída. +@1 fell victim to gravity.=@1 cayó víctima de la gravedad. +@1 died.=@1 murió. +@1 was killed by a zombie.=@1 fue asesinado por un zombie. +@1 was killed by a baby zombie.=@1 fue asesinado por un bebé zombie. +@1 was killed by a blaze.=@1 fue asesinado por una llamarada. +@1 was killed by a slime.=@1 fue asesinado por un Slime. +@1 was killed by a witch.=@1 fue asesinado por una bruja. +@1 was killed by a magma cube.=@1 fue asesinado por un cubo de lava. +@1 was killed by a wolf.=@1 fue asesinado por un lobo. +@1 was killed by a cat.=@1 fue asesinado por un gato. +@1 was killed by an ocelot.=@1 fue asesinado por un ocelote. +@1 was killed by an ender dragon.=@1 fue asesinado por un dragón ender. +@1 was killed by a wither.=@1 fue asesinado por un Wither. +@1 was killed by an enderman.=@1 fue asesinado por un Enderman. +@1 was killed by an endermite.=@1 fue asesinado por un Endermite. +@1 was killed by a ghast.=@1 fue asesinado por un Ghast. +@1 was killed by an elder guardian.=@1 fue asesinado por un gran guardián. +@1 was killed by a guardian.=@1 fue asesinado por un guardián. +@1 was killed by an iron golem.=@1 fue asesinado por un golem de hierro. +@1 was killed by a polar_bear.=@1 fue asesinado por un oso polar. +@1 was killed by a killer bunny.=@1 fue asesinado por un conejo asesino. +@1 was killed by a shulker.=@1 fue asesinado por un shulker. +@1 was killed by a silverfish.=@1 fue asesinado por un pez plateado. +@1 was killed by a skeleton.=@1 fue asesinado por un esqueleto. +@1 was killed by a stray.=@1 fue asesinado por un extraviado. +@1 was killed by a slime.=@1 fue asesinado por un limo. +@1 was killed by a spider.=@1 fue asesinado por una araña. +@1 was killed by a cave spider.=@1 fue asesinado por una araña de cueva. +@1 was killed by a vex.=@1 fue asesinado por un vex. +@1 was killed by an evoker.=@1 fue asesinado por un mago. +@1 was killed by an illusioner.=@1 fue asesinado por un ilusionista. +@1 was killed by a vindicator.=@1 fue asesinado por un vindicador. +@1 was killed by a zombie villager.=@1 fue asesinado por un aldeano zombie. +@1 was killed by a husk.=@1 fue asesinado por un husk. +@1 was killed by a baby husk.=@1 fue asesinado por un bebé husk. +@1 was killed by a zombie pigman.=@1 fue asesinado por un cerdo zombie. +@1 was killed by a baby zombie pigman.=@1 fue asesinado por un bebé cerdo zombie. diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.fr.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.fr.tr new file mode 100644 index 00000000..6d0a5115 --- /dev/null +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.fr.tr @@ -0,0 +1,58 @@ +# textdomain: mcl_death_messages +@1 was fatally hit by an arrow.=@1 a été mortellement touché par une flèche. +@1 has been killed with an arrow.=@1 a été tué avec une flèche. +@1 was shot by an arrow from @2.=@1 a été abattu par une flèche de @2. +@1 was shot by an arrow from a skeleton.=@1 a été abattu par une flèche d'un squelette. +@1 was shot by an arrow from a stray.=@1 a été abattu par une flèche d'un vagabond. +@1 was shot by an arrow from an illusioner.=@1 a été abattu par une flèche d'un illusionniste. +@1 was shot by an arrow.=@1 a été abattu par une flèche. +@1 forgot to breathe.=@1 a oublié de respirer. +@1 drowned.=@1 s'est noyé. +@1 ran out of oxygen.=@1 a manqué d'oxygène. +@1 was killed by @2.=@1 a été tué par @2. +@1 was killed.=@1 a été tué. +@1 was killed by a mob.=@1 a été tué par un mob. +@1 was burned to death by a blaze's fireball.=@1 a été brûlé vif par la boule de feu d'un blaze. +@1 was killed by a fireball from a blaze.=@1 a été tué par une boule de feu lors d'un blaze. +@1 was burned by a fire charge.=@1 a été brûlé par un incendie. +A ghast scared @1 to death.=Un ghast a éffrayé @1 à mort. +@1 has been fireballed by a ghast.=@1 a été pétrifié par un ghast. +@1 fell from a high cliff.=@1 est tombé d'une haute falaise. +@1 took fatal fall damage.=@1 a succombé à un chute mortelle. +@1 fell victim to gravity.=@1 a été victime de la gravité. +@1 died.=@1 est mort. +@1 was killed by a zombie.=@1 a été tué par un zombie. +@1 was killed by a baby zombie.=@1 a été tué par un bébé zombie. +@1 was killed by a blaze.=@1 a été tué par un blaze. +@1 was killed by a slime.=@1 a été tué par un slime. +@1 was killed by a witch.=@1 a été tué par un sorcier. +@1 was killed by a magma cube.=@1 a été tué par un cube de magma. +@1 was killed by a wolf.=@1 a été tué par un loup. +@1 was killed by a cat.=@1 a été tué par un chat. +@1 was killed by an ocelot.=@1 a été tué par un ocelot. +@1 was killed by an ender dragon.=@1 a été tué par un ender dragon. +@1 was killed by a wither.=@1 a été tué par un wither. +@1 was killed by an enderman.=@1 a été tué par un enderman. +@1 was killed by an endermite.=@1 a été tué par un endermite. +@1 was killed by a ghast.=@1 a été tué par un ghast. +@1 was killed by an elder guardian.=@1 a été tué par un grand gardien. +@1 was killed by a guardian.=@1 a été tué par un gardien. +@1 was killed by an iron golem.=@1 a été tué par un golem de fer. +@1 was killed by a polar_bear.=@1 a été tué par un ours blanc. +@1 was killed by a killer bunny.=@1 a été tué par un lapin tueur. +@1 was killed by a shulker.=@1 a été tué par un shulker. +@1 was killed by a silverfish.=@1 a été tué par un poisson d'argent. +@1 was killed by a skeleton.=@1 a été tué par un squelette. +@1 was killed by a stray.=@1 a été tué par un vagabond. +@1 was killed by a slime.=@1 a été tué par un slime. +@1 was killed by a spider.=@1 a été tué par une araignée. +@1 was killed by a cave spider.=@1 a été tué par une araignée venimeuse. +@1 was killed by a vex.=@1 a été tué par un vex. +@1 was killed by an evoker.=@1 a été tué par un invocateur. +@1 was killed by an illusioner.=@1 a été tué par un illusionniste. +@1 was killed by a vindicator.=@1 a été tué par un vindicateur. +@1 was killed by a zombie villager.=@1 a été tué par un villageois zombie. +@1 was killed by a husk.=@1 a été tué par un zombie momie. +@1 was killed by a baby husk.=@1 a été tué par un bébé zombie momie. +@1 was killed by a zombie pigman.=@1 a été tué par un zombie-couchon. +@1 was killed by a baby zombie pigman.=@1 a été tué par un bébé zombie-couchon diff --git a/mods/HUD/mcl_death_messages/locale/template.txt b/mods/HUD/mcl_death_messages/locale/template.txt new file mode 100644 index 00000000..db074f75 --- /dev/null +++ b/mods/HUD/mcl_death_messages/locale/template.txt @@ -0,0 +1,58 @@ +# textdomain: mcl_death_messages +@1 was fatally hit by an arrow.= +@1 has been killed with an arrow.= +@1 was shot by an arrow from @2.= +@1 was shot by an arrow from a skeleton.= +@1 was shot by an arrow from a stray.= +@1 was shot by an arrow from an illusioner.= +@1 was shot by an arrow.= +@1 forgot to breathe.= +@1 drowned.= +@1 ran out of oxygen.= +@1 was killed by @2.= +@1 was killed.= +@1 was killed by a mob.= +@1 was burned to death by a blaze's fireball.= +@1 was killed by a fireball from a blaze.= +@1 was burned by a fire charge.= +A ghast scared @1 to death.= +@1 has been fireballed by a ghast.= +@1 fell from a high cliff.= +@1 took fatal fall damage.= +@1 fell victim to gravity.= +@1 died.= +@1 was killed by a zombie.= +@1 was killed by a baby zombie.= +@1 was killed by a blaze.= +@1 was killed by a slime.= +@1 was killed by a witch.= +@1 was killed by a magma cube.= +@1 was killed by a wolf.= +@1 was killed by a cat.= +@1 was killed by an ocelot.= +@1 was killed by an ender dragon.= +@1 was killed by a wither.= +@1 was killed by an enderman.= +@1 was killed by an endermite.= +@1 was killed by a ghast.= +@1 was killed by an elder guardian.= +@1 was killed by a guardian.= +@1 was killed by an iron golem.= +@1 was killed by a polar_bear.= +@1 was killed by a killer bunny.= +@1 was killed by a shulker.= +@1 was killed by a silverfish.= +@1 was killed by a skeleton.= +@1 was killed by a stray.= +@1 was killed by a slime.= +@1 was killed by a spider.= +@1 was killed by a cave spider.= +@1 was killed by a vex.= +@1 was killed by an evoker.= +@1 was killed by an illusioner.= +@1 was killed by a vindicator.= +@1 was killed by a zombie villager.= +@1 was killed by a husk.= +@1 was killed by a baby husk.= +@1 was killed by a zombie pigman.= +@1 was killed by a baby zombie pigman.= diff --git a/mods/HUD/mcl_formspec/init.lua b/mods/HUD/mcl_formspec/init.lua new file mode 100644 index 00000000..7013fc0e --- /dev/null +++ b/mods/HUD/mcl_formspec/init.lua @@ -0,0 +1,11 @@ +mcl_formspec = {} + +function mcl_formspec.get_itemslot_bg(x, y, w, h) + local out = "" + for i = 0, w - 1, 1 do + for j = 0, h - 1, 1 do + out = out .."image["..x+i..","..y+j..";1,1;mcl_formspec_itemslot.png]" + end + end + return out +end diff --git a/mods/HUD/mcl_formspec/mod.conf b/mods/HUD/mcl_formspec/mod.conf new file mode 100644 index 00000000..9d614403 --- /dev/null +++ b/mods/HUD/mcl_formspec/mod.conf @@ -0,0 +1 @@ +description = Helper mod to simplify creation of formspecs a little bit diff --git a/mods/HUD/mcl_formspec/textures/mcl_formspec_itemslot.png b/mods/HUD/mcl_formspec/textures/mcl_formspec_itemslot.png new file mode 100644 index 00000000..42f265e7 Binary files /dev/null and b/mods/HUD/mcl_formspec/textures/mcl_formspec_itemslot.png differ diff --git a/mods/HUD/mcl_formspec_prepend/depends.txt b/mods/HUD/mcl_formspec_prepend/depends.txt new file mode 100644 index 00000000..3b355984 --- /dev/null +++ b/mods/HUD/mcl_formspec_prepend/depends.txt @@ -0,0 +1 @@ +mcl_init diff --git a/mods/HUD/mcl_formspec_prepend/init.lua b/mods/HUD/mcl_formspec_prepend/init.lua new file mode 100644 index 00000000..2230a983 --- /dev/null +++ b/mods/HUD/mcl_formspec_prepend/init.lua @@ -0,0 +1,3 @@ +minetest.register_on_joinplayer(function(player) + player:set_formspec_prepend(mcl_vars.gui_nonbg .. mcl_vars.gui_bg_color .. mcl_vars.gui_bg_img) +end) diff --git a/mods/HUD/mcl_formspec_prepend/mod.conf b/mods/HUD/mcl_formspec_prepend/mod.conf new file mode 100644 index 00000000..c576d449 --- /dev/null +++ b/mods/HUD/mcl_formspec_prepend/mod.conf @@ -0,0 +1 @@ +name = mcl_formspec_prepend diff --git a/mods/HUD/mcl_hbarmor/README.md b/mods/HUD/mcl_hbarmor/README.md new file mode 100644 index 00000000..0eccd691 --- /dev/null +++ b/mods/HUD/mcl_hbarmor/README.md @@ -0,0 +1,26 @@ +# MineClone 2 HUD bar for `mcl_armor` [`mcl_hbarmor`] + +## Description +This mod adds a simple HUD bar which displays the player's armor points. +The players has 0-20 armor points. + +The armor bar is hidden if the player wears no armor. + +## Licensing +This mod is entirly free softare. + +### Source code +License: MIT License (see below) + +### Textures + +See MineClone 2 license. + +### MIT License +Everything else is under the MIT License: +© Copyright BlockMen (2013-2014) + +This program is free software. It comes without any warranty, to +the extent permitted by applicable law. You can redistribute it +and/or modify it under the terms of the MIT License. +See for more details. diff --git a/mods/HUD/hbarmor/description.txt b/mods/HUD/mcl_hbarmor/description.txt similarity index 100% rename from mods/HUD/hbarmor/description.txt rename to mods/HUD/mcl_hbarmor/description.txt diff --git a/mods/HUD/hbarmor/init.lua b/mods/HUD/mcl_hbarmor/init.lua similarity index 51% rename from mods/HUD/hbarmor/init.lua rename to mods/HUD/mcl_hbarmor/init.lua index 1e444e41..57978359 100644 --- a/mods/HUD/hbarmor/init.lua +++ b/mods/HUD/mcl_hbarmor/init.lua @@ -1,43 +1,32 @@ -local S -if (minetest.get_modpath("intllib")) then - S = intllib.Getter() -else - S = function ( s ) return s end -end +local S = minetest.get_translator("mcl_hbarmor") if (not armor) or (not armor.def) then - minetest.log("error", "[hbarmor] Outdated 3d_armor version. Please update your version of 3d_armor!") + minetest.log("error", "[mcl_hbarmor] Outdated mcl_armor version. Please update your version of mcl_armor!") end -local hbarmor = {} +local mcl_hbarmor = {} -- HUD statbar values -hbarmor.armor = {} +mcl_hbarmor.armor = {} -- Stores if player's HUD bar has been initialized so far. -hbarmor.player_active = {} +mcl_hbarmor.player_active = {} -- Time difference in seconds between updates to the HUD armor bar. -- Increase this number for slow servers. -hbarmor.tick = 0.1 +mcl_hbarmor.tick = 0.1 -- If true, the armor bar is hidden when the player does not wear any armor -hbarmor.autohide = true +mcl_hbarmor.autohide = true ---load custom settings -local set = minetest.setting_getbool("hbarmor_autohide") -if set ~= nil then - hbarmor.autohide = set -end - -set = minetest.setting_get("hbarmor_tick") +set = minetest.settings:get("mcl_hbarmor_tick") if tonumber(set) ~= nil then - hbarmor.tick = tonumber(set) + mcl_hbarmor.tick = tonumber(set) end local must_hide = function(playername, arm) - return ((not armor.def[playername].count or armor.def[playername].count == 0) and arm == 0) + return arm == 0 end local arm_printable = function(arm) @@ -47,15 +36,18 @@ end local function custom_hud(player) local name = player:get_player_name() - if minetest.setting_getbool("enable_damage") then - local ret = hbarmor.get_armor(player) + if minetest.settings:get_bool("enable_damage") then + local ret = mcl_hbarmor.get_armor(player) if ret == false then - minetest.log("error", "[hbarmor] Call to hbarmor.get_armor in custom_hud returned with false!") + minetest.log("error", "[mcl_hbarmor] Call to mcl_hbarmor.get_armor in custom_hud returned with false!") + return + end + local arm = tonumber(mcl_hbarmor.armor[name]) + if not arm then + arm = 0 end - local arm = tonumber(hbarmor.armor[name]) - if not arm then arm = 0 end local hide - if hbarmor.autohide then + if mcl_hbarmor.autohide then hide = must_hide(name, arm) else hide = false @@ -65,47 +57,36 @@ local function custom_hud(player) end --register and define armor HUD bar -hb.register_hudbar("armor", 0xFFFFFF, S("Armor"), { icon = "hbarmor_icon.png", bgicon = "hbarmor_bgicon.png", bar = "hbarmor_bar.png" }, 0, 100, hbarmor.autohide, S("%s: %d%%")) +hb.register_hudbar("armor", 0xFFFFFF, S("Armor"), { icon = "hbarmor_icon.png", bgicon = "hbarmor_bgicon.png", bar = "hbarmor_bar.png" }, 0, 20, mcl_hbarmor.autohide) -function hbarmor.get_armor(player) +function mcl_hbarmor.get_armor(player) if not player or not armor.def then return false end local name = player:get_player_name() - local def = armor.def[name] or nil - if def and def.state and def.count then - hbarmor.set_armor(name, def.state, def.count) - else + local pts = armor:get_armor_points(player) + if not pts then return false + else + mcl_hbarmor.set_armor(name, pts) end return true end -function hbarmor.set_armor(player_name, ges_state, items) - local max_items = 4 - if items == 5 then - max_items = items - end - local max = max_items * 65535 - local lvl = max - ges_state - lvl = lvl/max - if ges_state == 0 and items == 0 then - lvl = 0 - end - - hbarmor.armor[player_name] = math.max(0, math.min(lvl* (items * (100 / max_items)), 100)) +function mcl_hbarmor.set_armor(player_name, pts) + mcl_hbarmor.armor[player_name] = math.max(0, math.min(20, pts)) end -- update hud elemtens if value has changed local function update_hud(player) local name = player:get_player_name() --armor - local arm = tonumber(hbarmor.armor[name]) + local arm = tonumber(mcl_hbarmor.armor[name]) if not arm then arm = 0 - hbarmor.armor[name] = 0 + mcl_hbarmor.armor[name] = 0 end - if hbarmor.autohide then + if mcl_hbarmor.autohide then -- hide armor bar completely when there is none if must_hide(name, arm) then hb.hide_hudbar(player, "armor") @@ -121,12 +102,12 @@ end minetest.register_on_joinplayer(function(player) local name = player:get_player_name() custom_hud(player) - hbarmor.player_active[name] = true + mcl_hbarmor.player_active[name] = true end) minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() - hbarmor.player_active[name] = false + mcl_hbarmor.player_active[name] = false end) local main_timer = 0 @@ -134,15 +115,15 @@ local timer = 0 minetest.register_globalstep(function(dtime) main_timer = main_timer + dtime timer = timer + dtime - if main_timer > hbarmor.tick or timer > 4 then - if minetest.setting_getbool("enable_damage") then - if main_timer > hbarmor.tick then main_timer = 0 end + if main_timer > mcl_hbarmor.tick or timer > 4 then + if minetest.settings:get_bool("enable_damage") then + if main_timer > mcl_hbarmor.tick then main_timer = 0 end for _,player in ipairs(minetest.get_connected_players()) do local name = player:get_player_name() - if hbarmor.player_active[name] == true then - local ret = hbarmor.get_armor(player) + if mcl_hbarmor.player_active[name] == true then + local ret = mcl_hbarmor.get_armor(player) if ret == false then - minetest.log("error", "[hbarmor] Call to hbarmor.get_armor in globalstep returned with false!") + minetest.log("error", "[mcl_hbarmor] Call to mcl_hbarmor.get_armor in globalstep returned with false!") end -- update all hud elements update_hud(player) diff --git a/mods/HUD/mcl_hbarmor/locale/hbarmor.de.tr b/mods/HUD/mcl_hbarmor/locale/hbarmor.de.tr new file mode 100644 index 00000000..e7aa7d78 --- /dev/null +++ b/mods/HUD/mcl_hbarmor/locale/hbarmor.de.tr @@ -0,0 +1,2 @@ +# textdomain:hbarmor +Armor=Panzerung diff --git a/mods/HUD/mcl_hbarmor/locale/hbarmor.es.tr b/mods/HUD/mcl_hbarmor/locale/hbarmor.es.tr new file mode 100644 index 00000000..f9529b48 --- /dev/null +++ b/mods/HUD/mcl_hbarmor/locale/hbarmor.es.tr @@ -0,0 +1,2 @@ +# textdomain:hbarmor +Armor=Armadura diff --git a/mods/HUD/mcl_hbarmor/locale/hbarmor.fr.tr b/mods/HUD/mcl_hbarmor/locale/hbarmor.fr.tr new file mode 100644 index 00000000..c5addfa5 --- /dev/null +++ b/mods/HUD/mcl_hbarmor/locale/hbarmor.fr.tr @@ -0,0 +1,2 @@ +# textdomain:hbarmor +Armor=Armure diff --git a/mods/HUD/mcl_hbarmor/locale/hbarmor.it.tr b/mods/HUD/mcl_hbarmor/locale/hbarmor.it.tr new file mode 100644 index 00000000..f02b5c43 --- /dev/null +++ b/mods/HUD/mcl_hbarmor/locale/hbarmor.it.tr @@ -0,0 +1,2 @@ +# textdomain:hbarmor +Armor=Armatura diff --git a/mods/HUD/mcl_hbarmor/locale/template.txt b/mods/HUD/mcl_hbarmor/locale/template.txt new file mode 100644 index 00000000..80e7a09e --- /dev/null +++ b/mods/HUD/mcl_hbarmor/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain:hbarmor +Armor= diff --git a/mods/HUD/mcl_hbarmor/mod.conf b/mods/HUD/mcl_hbarmor/mod.conf new file mode 100644 index 00000000..de5a2f20 --- /dev/null +++ b/mods/HUD/mcl_hbarmor/mod.conf @@ -0,0 +1,2 @@ +name = mcl_hbarmor +depends = hudbars, mcl_armor diff --git a/mods/HUD/mcl_hbarmor/settingtypes.txt b/mods/HUD/mcl_hbarmor/settingtypes.txt new file mode 100644 index 00000000..cfd875df --- /dev/null +++ b/mods/HUD/mcl_hbarmor/settingtypes.txt @@ -0,0 +1,3 @@ +#Time difference in seconds between updates to the armor HUD bar. +#Increase this number for slow servers. +hbarmor_tick (Armor HUD bar update frequency) float 0.1 0.0 4.0 diff --git a/mods/HUD/hbarmor/textures/hbarmor_bar.png b/mods/HUD/mcl_hbarmor/textures/hbarmor_bar.png similarity index 100% rename from mods/HUD/hbarmor/textures/hbarmor_bar.png rename to mods/HUD/mcl_hbarmor/textures/hbarmor_bar.png diff --git a/mods/HUD/mcl_hbarmor/textures/hbarmor_bgicon.png b/mods/HUD/mcl_hbarmor/textures/hbarmor_bgicon.png new file mode 100644 index 00000000..54a22d07 Binary files /dev/null and b/mods/HUD/mcl_hbarmor/textures/hbarmor_bgicon.png differ diff --git a/mods/HUD/mcl_hbarmor/textures/hbarmor_icon.png b/mods/HUD/mcl_hbarmor/textures/hbarmor_icon.png new file mode 100644 index 00000000..1efe919c Binary files /dev/null and b/mods/HUD/mcl_hbarmor/textures/hbarmor_icon.png differ diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 89ae703e..0b5f52b6 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -1,17 +1,25 @@ +local S = minetest.get_translator("mcl_inventory") +local F = minetest.formspec_escape + -- Prepare player info table local players = {} -- Containing all the items for each Creative Mode tab local inventory_lists = {} +local show_armor = minetest.get_modpath("mcl_armor") ~= nil +local mod_player = minetest.get_modpath("mcl_player") ~= nil + +-- TODO: Brewing is disabled. Add brewing (uncommented code) when it is implemented properly + -- Create tables -local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","brew","matr","misc","all"} +local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs",--[["brew",]]"matr","misc","all"} for _, f in pairs(builtin_filter_ids) do inventory_lists[f] = {} end --[[ Populate all the item tables. We only do this once. Note this mod must be -loaded after mcl_autogroup for this to work, because it required certain +loaded after _mcl_autogroup for this to work, because it required certain groups to be set. ]] do for name,def in pairs(minetest.registered_items) do @@ -23,36 +31,53 @@ do return def.groups.tool or (def.tool_capabilities ~= nil and def.tool_capabilities.damage_groups == nil) end local is_weapon_or_armor = function(def) - return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or ((def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or def.groups.horse_armor) and def.groups.non_combat_armor ~= 1) + return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ((def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or def.groups.horse_armor) and def.groups.non_combat_armor ~= 1) end + -- Is set to true if it was added in any category besides misc + local nonmisc = false if def.groups.building_block then table.insert(inventory_lists["blocks"], name) + nonmisc = true end if def.groups.deco_block then table.insert(inventory_lists["deco"], name) + nonmisc = true end if is_redstone(def) then table.insert(inventory_lists["redstone"], name) + nonmisc = true end if def.groups.transport then table.insert(inventory_lists["rail"], name) + nonmisc = true end if (def.groups.food and not def.groups.brewitem) or def.groups.eatable then table.insert(inventory_lists["food"], name) + nonmisc = true end if is_tool(def) then table.insert(inventory_lists["tools"], name) + nonmisc = true end if is_weapon_or_armor(def) then table.insert(inventory_lists["combat"], name) + nonmisc = true end - if def.groups.brewitem then - table.insert(inventory_lists["brew"], name) + if def.groups.spawn_egg == 1 then + table.insert(inventory_lists["mobs"], name) + nonmisc = true end + -- TODO: add brew + --if def.groups.brewitem then + --table.insert(inventory_lists["brew"], name) + --nonmisc = true + --end if def.groups.craftitem then table.insert(inventory_lists["matr"], name) + nonmisc = true end - if not def.groups.building_block and not def.groups.deco_block and not is_redstone(def) and not def.groups.transport and not def.groups.food and not def.groups.eatable and not is_tool(def) and not is_weapon_or_armor(def) and not def.groups.craftitem and not def.groups.brewitem then + -- Misc. category is for everything which is not in any other category + if not nonmisc then table.insert(inventory_lists["misc"], name) end @@ -137,20 +162,40 @@ local noffset = {} -- numeric tab offset local offset = {} -- string offset: local boffset = {} -- local hoch = {} +local filtername = {} local bg = {} -noffset["blocks"] = {-0.29,-0.25} -noffset["deco"] = {0.98,-0.25} -noffset["redstone"] = {2.23,-0.25} -noffset["rail"] = {3.495,-0.25} -noffset["misc"] = {4.75,-0.25} -noffset["nix"] = {8.99,-0.25} -noffset["food"] = {-0.29,8.12} -noffset["tools"] = {0.98,8.12} -noffset["combat"] = {2.23,8.12} -noffset["brew"] = {3.495,8.12} -noffset["matr"] = {4.74,8.12} -noffset["inv"] = {8.99,8.12} +local noffset_x_start = -0.24 +local noffset_x = noffset_x_start +local noffset_y = -0.25 +local next_noffset = function(id, right) + if right then + noffset[id] = { 8.94, noffset_y } + else + noffset[id] = { noffset_x, noffset_y } + noffset_x = noffset_x + 1.25 + end +end + +-- Upper row +next_noffset("blocks") +next_noffset("deco") +next_noffset("redstone") +next_noffset("rail") +next_noffset("misc") +next_noffset("nix", true) + +noffset_x = noffset_x_start +noffset_y = 8.12 + +-- Lower row +next_noffset("food") +next_noffset("tools") +next_noffset("combat") +next_noffset("mobs") +--next_noffset("brew") -- TODO: add brew +next_noffset("matr") +next_noffset("inv", true) for k,v in pairs(noffset) do offset[k] = tostring(v[1]) .. "," .. tostring(v[2]) @@ -164,12 +209,28 @@ hoch["rail"] = "" hoch["misc"] = "" hoch["nix"] = "" hoch["default"] = "" -hoch["food"] = "^[transformfy" -hoch["tools"] = "^[transformfy" -hoch["combat"] = "^[transformfy" -hoch["brew"] = "^[transformfy" -hoch["matr"] = "^[transformfy" -hoch["inv"] = "^[transformfy" +hoch["food"] = "_down" +hoch["tools"] = "_down" +hoch["combat"] = "_down" +hoch["mobs"] = "_down" +--hoch["brew"] = "_down" -- TODO: add brew +hoch["matr"] = "_down" +hoch["inv"] = "_down" + +filtername = {} +filtername["blocks"] = S("Building Blocks") +filtername["deco"] = S("Decoration Blocks") +filtername["redstone"] = S("Redstone") +filtername["rail"] = S("Transportation") +filtername["misc"] = S("Miscellaneous") +filtername["nix"] = S("Search Items") +filtername["food"] = S("Foodstuffs") +filtername["tools"] = S("Tools") +filtername["combat"] = S("Combat") +filtername["mobs"] = S("Mobs") +--filtername["brew"] = S("Brewing") -- TODO: add brew +filtername["matr"] = S("Materials") +filtername["inv"] = S("Survival Inventory") local dark_bg = "crafting_creative_bg_dark.png" @@ -183,7 +244,8 @@ local function reset_menu_item_bg() bg["food"] = dark_bg bg["tools"] = dark_bg bg["combat"] = dark_bg - bg["brew"] = dark_bg + bg["mobs"] = dark_bg + --bg["brew"] = dark_bg -- TODO: add brew bg["matr"] = dark_bg bg["inv"] = dark_bg bg["default"] = dark_bg @@ -207,10 +269,6 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz end end local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1)) - local slider_height - local arrow_height = 0.85 - slider_height = (6.2-arrow_height*2) / pagemax - local slider_pos = (slider_height*(pagenum-1)*0.8713125)+2.23 local name = "nix" local formspec = "" local main_list @@ -218,22 +276,33 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz "listring[current_player;main]".. "listring[detached:trash;main]" - if page ~= nil then name = page end + if page ~= nil then + name = page + if players[playername] then + players[playername].page = page + end + end bg[name] = "crafting_creative_bg.png" + local inv_bg = "crafting_inventory_creative.png" if name == "inv" then inv_bg = "crafting_inventory_creative_survival.png" -- Show armor and player image - local show_armor = minetest.get_modpath("3d_armor") - local img = "player.png" + local img, img_player + if mod_player then + img_player = mcl_player.player_get_preview(player) + else + img_player = "player.png" + end + img = img_player local player_preview = "image[3.9,1.4;1.2333,2.4666;"..img.."]" if show_armor and armor.textures[playername] and armor.textures[playername].preview then img = armor.textures[playername].preview local s1 = img:find("character_preview") if s1 ~= nil then s1 = img:sub(s1+21) - img = "player.png"..s1 + img = img_player..s1 end player_preview = "image[3.9,1.4;1.2333,2.4666;"..img.."]" end @@ -256,95 +325,118 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz -- Survival inventory slots main_list = "list[current_player;main;0,3.75;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,3.75,9,3).. -- armor "list[detached:"..playername.."_armor;armor;2.5,1.3;1,1;1]".. "list[detached:"..playername.."_armor;armor;2.5,2.75;1,1;2]".. "list[detached:"..playername.."_armor;armor;5.5,1.3;1,1;3]".. "list[detached:"..playername.."_armor;armor;5.5,2.75;1,1;4]".. + mcl_formspec.get_itemslot_bg(2.5,1.3,1,1).. + mcl_formspec.get_itemslot_bg(2.5,2.75,1,1).. + mcl_formspec.get_itemslot_bg(5.5,1.3,1,1).. + mcl_formspec.get_itemslot_bg(5.5,2.75,1,1).. armor_slot_imgs.. -- player preview player_preview.. -- crafting guide button "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;Recipe book]".. + "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. -- help button "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;Help]".. + "tooltip[__mcl_doc;"..F(S("Help")).."]".. + -- skins button + "image_button[9,3;1,1;mcl_skins_button.png;__mcl_skins;]".. + "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. -- achievements button - "image_button[9,3;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - "tooltip[__mcl_achievements;Achievements]" + "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. + --"style_type[image_button;border=;bgimg=;bgimg_pressed=]".. + "tooltip[__mcl_achievements;"..F(S("Achievements")).."]" -- For shortcuts listrings = listrings .. "listring[detached:"..playername.."_armor;armor]".. "listring[current_player;main]" else - inv_bg = inv_bg .. "^crafting_inventory_creative_scroll.png" -- Creative inventory slots - main_list = "list[detached:creative_"..playername..";main;0,1.75;9,5;"..tostring(start_i).."]" .. - -- ... and scroll bar - "image_button[9.02,1.76;"..tostring(arrow_height)..",0.6;crafting_creative_up.png;creative_prev;]".. - "image[9.033," .. tostring(slider_pos) .. ";0.78,"..tostring(slider_height) .. ";crafting_slider.png]".. - "image_button[9.02,6.15;"..tostring(arrow_height)..",0.6;crafting_creative_down.png;creative_next;]" + main_list = "list[detached:creative_"..playername..";main;0,1.75;9,5;"..tostring(start_i).."]".. + mcl_formspec.get_itemslot_bg(0,1.75,9,5).. + -- Page buttons + "label[9.0,5.5;"..F(S("@1/@2", pagenum, pagemax)).."]".. + "image_button[9.0,6.0;0.7,0.7;crafting_creative_prev.png;creative_prev;]".. + "image_button[9.5,6.0;0.7,0.7;crafting_creative_next.png;creative_next;]" end - local function tab(current, check) - local img - if current == check then - img = "crafting_creative_active.png" + + local tab_icon = { + blocks = "mcl_core:brick_block", + deco = "mcl_flowers:peony", + redstone = "mesecons:redstone", + rail = "mcl_minecarts:golden_rail", + misc = "mcl_buckets:bucket_lava", + nix = "mcl_compass:compass", + food = "mcl_core:apple", + tools = "mcl_core:axe_iron", + combat = "mcl_core:sword_gold", + mobs = "mobs_mc:cow", + brew = "mcl_potions:potion_water", + matr = "mcl_core:stick", + inv = "mcl_chests:chest", + } + local function tab(current_tab, this_tab) + local bg_img + if current_tab == this_tab then + bg_img = "crafting_creative_active"..hoch[this_tab]..".png" else - img = "crafting_creative_inactive.png" + bg_img = "crafting_creative_inactive"..hoch[this_tab]..".png" end - return "image[" .. offset[check] .. ";1.5,1.44;" .. img .. hoch[check].. "]" .. - "image[" .. boffset[check] .. ";1,1;crafting_creative_marker.png]" + return + "style["..this_tab..";border=false;bgimg=;bgimg_pressed=]".. + "item_image_button[" .. boffset[this_tab] ..";1,1;"..tab_icon[this_tab]..";"..this_tab..";]".. + "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]" .. + "image[" .. boffset[this_tab] .. ";1,1;crafting_creative_marker.png]" end - local fnt = "" - if name ~= "inv" then - fnt = "image[0,1;5,0.75;mcl_inventory_fnt_"..name..".png]" + local caption = "" + if name ~= "inv" and filtername[name] then + caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" end + formspec = "size[10,9.3]".. - mcl_vars.inventory_header.. + "no_prepend[]".. + mcl_vars.gui_nonbg..mcl_vars.gui_bg_color.. "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. "label[-5,-5;"..name.."]".. - "item_image_button[-0.1,0;1,1;mcl_core:brick_block;blocks;]".. --build blocks tab(name, "blocks") .. - "tooltip[blocks;Building Blocks]".. - "item_image_button[1.15,0;1,1;mcl_flowers:peony;deco;]".. --decoration blocks + "tooltip[blocks;"..F(filtername["blocks"]).."]".. tab(name, "deco") .. - "tooltip[deco;Decoration Blocks]".. - "item_image_button[2.415,0;1,1;mesecons:redstone;redstone;]".. --redstone + "tooltip[deco;"..F(filtername["deco"]).."]".. tab(name, "redstone") .. - "tooltip[redstone;Redstone]".. - "item_image_button[3.693,0;1,1;mcl_minecarts:golden_rail;rail;]".. --transportation + "tooltip[redstone;"..F(filtername["redstone"]).."]".. tab(name, "rail") .. - "tooltip[rail;Transportation]".. - "item_image_button[4.93,0;1,1;mcl_buckets:bucket_lava;misc;]".. --miscellaneous + "tooltip[rail;"..F(filtername["rail"]).."]".. tab(name, "misc") .. - "tooltip[misc;Miscellaneous]".. - "item_image_button[9.19,0;1,1;mcl_compass:compass;nix;]".. --search + "tooltip[misc;"..F(filtername["misc"]).."]".. tab(name, "nix") .. - "tooltip[nix;Search Items]".. - fnt.. + "tooltip[nix;"..F(filtername["nix"]).."]".. + caption.. "list[current_player;main;0,7;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7,9,1).. main_list.. - "item_image_button[-0.1,8.37;1,1;mcl_core:apple;food;]".. --foodstuff tab(name, "food") .. - "tooltip[food;Foodstuffs]".. - "item_image_button[1.15,8.37;1,1;mcl_core:axe_iron;tools;]".. --tools + "tooltip[food;"..F(filtername["food"]).."]".. tab(name, "tools") .. - "tooltip[tools;Tools]".. - "item_image_button[2.415,8.37;1,1;mcl_core:sword_gold;combat;]".. --combat + "tooltip[tools;"..F(filtername["tools"]).."]".. tab(name, "combat") .. - "tooltip[combat;Combat]".. - "item_image_button[3.693,8.37;1,1;mcl_potions:potion_water;brew;]".. --brewing - tab(name, "brew") .. - "tooltip[brew;Brewing]".. - "item_image_button[4.938,8.37;1,1;mcl_core:stick;matr;]".. --materials + "tooltip[combat;"..F(filtername["combat"]).."]".. + tab(name, "mobs") .. + "tooltip[mobs;"..F(filtername["mobs"]).."]".. + -- TODO: Add brew + --tab(name, "brew") .. + --"tooltip[brew;"..F(filtername["brew"]).."]".. tab(name, "matr") .. - "tooltip[matr;Materials]".. - "item_image_button[9.19,8.37;1,1;mcl_chests:chest;inv;]".. --inventory + "tooltip[matr;"..F(filtername["matr"]).."]".. tab(name, "inv") .. - "tooltip[inv;Survival Inventory]".. + "tooltip[inv;"..F(filtername["inv"]).."]".. "list[detached:trash;main;9,7;1,1;]".. + mcl_formspec.get_itemslot_bg(9,7,1,1).. "image[9,7;1,1;crafting_creative_trash.png]".. listrings @@ -352,7 +444,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz if filter == nil then filter = "" end - formspec = formspec .. "field[5.3,1.3;4,0.75;suche;;"..minetest.formspec_escape(filter).."]" + formspec = formspec .. "field[5.3,1.34;4,0.75;suche;;"..minetest.formspec_escape(filter).."]" formspec = formspec .. "field_close_on_enter[suche;false]" end if pagenum ~= nil then formspec = formspec .. "p"..tostring(pagenum) end @@ -408,10 +500,16 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if players[name].page == "combat" then return end set_inv_page("combat",player) page = "combat" + elseif fields.mobs then + if players[name].page == "mobs" then return end + set_inv_page("mobs",player) + page = "mobs" + --[[ TODO: add brew elseif fields.brew then if players[name].page == "brew" then return end set_inv_page("brew",player) page = "brew" + ]] elseif fields.matr then if players[name].page == "matr" then return end set_inv_page("matr",player) @@ -493,14 +591,45 @@ if minetest.settings:get_bool("creative_mode") then local inv = digger:get_inventory() if inv then for _,item in ipairs(drops) do - item = ItemStack(item):get_name() - if not inv:contains_item("main", item) then + if not inv:contains_item("main", item, true) then inv:add_item("main", item) end end end end + mcl_inventory.update_inventory_formspec = function(player) + local page = nil + + local name = player:get_player_name() + + if players[name].page then + page = players[name].page + else + page = "nix" + end + + -- Figure out current scroll bar from formspec + local formspec = player:get_inventory_formspec() + local start_i = players[name].start_i + + local inv_size + if page == "nix" then + local inv = minetest.get_inventory({type="detached", name="creative_"..name}) + inv_size = inv:get_size("main") + elseif page ~= nil and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + + local filter = players[name].filter + if filter == nil then + filter = "" + end + + mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) + end end minetest.register_on_joinplayer(function(player) diff --git a/mods/HUD/mcl_inventory/depends.txt b/mods/HUD/mcl_inventory/depends.txt index 9b675be0..fb454b7d 100644 --- a/mods/HUD/mcl_inventory/depends.txt +++ b/mods/HUD/mcl_inventory/depends.txt @@ -1,3 +1,5 @@ mcl_init -mcl_autogroup? -3d_armor? +mcl_formspec +mcl_player? +_mcl_autogroup? +mcl_armor? diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 820536d5..e6a1f146 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -1,16 +1,11 @@ +local S = minetest.get_translator("mcl_inventory") +local F = minetest.formspec_escape + mcl_inventory = {} -local show_armor = false -if minetest.get_modpath("3d_armor") ~= nil then show_armor = true end - - --- Sadly, using worldedit_gui breaks the inventory, making it incompatible. --- Print error message if this mod was found. --- TODO: Remove this message when worldedit_gui has been fixed. -if minetest.get_modpath("worldedit_gui") then - minetest.log("error", "The mod “worldedit_gui” is enabled. This mod is known to break the inventory in MineClone 2. Please disable worldedit_gui and restart the game.") -end - +local show_armor = minetest.get_modpath("mcl_armor") ~= nil +local mod_player = minetest.get_modpath("mcl_player") ~= nil +local mod_craftguide = minetest.get_modpath("mcl_craftguide") ~= nil -- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left local function return_item(itemstack, dropper, pos, inv) @@ -29,7 +24,7 @@ local function return_item(itemstack, dropper, pos, inv) v.x = v.x*4 v.y = v.y*4 + 2 v.z = v.z*4 - obj:setvelocity(v) + obj:set_velocity(v) obj:get_luaentity()._insta_collect = false end end @@ -44,7 +39,7 @@ end local function return_fields(player, name) local inv = player:get_inventory() for i,stack in ipairs(inv:get_list(name)) do - return_item(stack, player, player:getpos(), inv) + return_item(stack, player, player:get_pos(), inv) stack:clear() inv:set_stack(name, i, stack) end @@ -67,14 +62,20 @@ local function set_inventory(player, armor_change_only) local player_name = player:get_player_name() -- Show armor and player image - local img = "player.png" + local img, img_player + if mod_player then + img_player = mcl_player.player_get_preview(player) + else + img_player = "player.png" + end + img = img_player local player_preview = "image[0.6,0.2;2,4;"..img.."]" if show_armor and armor.textures[player_name] and armor.textures[player_name].preview then img = armor.textures[player_name].preview local s1 = img:find("character_preview") if s1 ~= nil then s1 = img:sub(s1+21) - img = "player.png"..s1 + img = img_player..s1 end player_preview = "image[1.1,0.2;2,4;"..img.."]" end @@ -89,28 +90,40 @@ local function set_inventory(player, armor_change_only) local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]".. - mcl_vars.inventory_header.. player_preview.. --armor "list[detached:"..player_name.."_armor;armor;0,0;1,1;1]".. "list[detached:"..player_name.."_armor;armor;0,1;1,1;2]".. "list[detached:"..player_name.."_armor;armor;0,2;1,1;3]".. "list[detached:"..player_name.."_armor;armor;0,3;1,1;4]".. + mcl_formspec.get_itemslot_bg(0,0,1,1).. + mcl_formspec.get_itemslot_bg(0,1,1,1).. + mcl_formspec.get_itemslot_bg(0,2,1,1).. + mcl_formspec.get_itemslot_bg(0,3,1,1).. armor_slot_imgs.. -- craft and inventory + "label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. + "label[4,0.5;"..F(minetest.colorize("#313131", S("Crafting"))).."]".. "list[current_player;craft;4,1;2,2]".. "list[current_player;craftpreview;7,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + mcl_formspec.get_itemslot_bg(4,1,2,2).. + mcl_formspec.get_itemslot_bg(7,1.5,1,1).. -- crafting guide button "image_button[4.5,3;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;Recipe book]".. + "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. -- help button "image_button[8,3;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;Help]".. + "tooltip[__mcl_doc;"..F(S("Help")).."]".. + -- skins button + "image_button[3,3;1,1;mcl_skins_button.png;__mcl_skins;]".. + "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. -- achievements button "image_button[7,3;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - "tooltip[__mcl_achievements;Achievements]".. + "tooltip[__mcl_achievements;"..F(S("Achievements")).."]".. -- for shortcuts "listring[current_player;main]".. "listring[current_player;craft]".. @@ -130,6 +143,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) +if not minetest.settings:get_bool("creative_mode") then + mcl_inventory.update_inventory_formspec = function(player) + set_inventory(player) + end +end + -- Drop crafting grid items on leaving minetest.register_on_leaveplayer(function(player) return_fields(player, "craft") @@ -143,8 +162,8 @@ minetest.register_on_joinplayer(function(player) --set hotbar size player:hud_set_hotbar_itemcount(9) --add hotbar images - player:hud_set_hotbar_image("gui_hotbar.png") - player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") + player:hud_set_hotbar_image("mcl_inventory_hotbar.png") + player:hud_set_hotbar_selected_image("mcl_inventory_hotbar_selected.png") if show_armor then local set_player_armor_original = armor.set_player_armor diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr new file mode 100644 index 00000000..a2aa355d --- /dev/null +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr @@ -0,0 +1,20 @@ +# textdomain: mcl_inventory +Recipe book=Fertigungsbuch +Help=Hilfe +Select player skin=Spieleraussehen ändern +Achievements=Errungenschaften +Building Blocks=Baublöcke +Decoration Blocks=Dekoblöcke +Redstone=Redstone +Transportation=Transport +Miscellaneous=Sonstiges +Search Items=Gegenstände durchsuchen +Foodstuffs=Lebensmittel +Tools=Werkzeuge +Combat=Kampf +Mobs=Mobs +Materials=Materialien +Survival Inventory=Überlebensinventar +Crafting=Fertigen +Inventory=Inventar +@1/@2=@1/@2 diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.es.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.es.tr new file mode 100644 index 00000000..b8160256 --- /dev/null +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.es.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_inventory +Recipe book=Libro de recetas +Help=Ayuda +Select player skin=Seleccionar skin +Achievements=Logros +Building Blocks=Bloques de construcción +Decoration Blocks=Bloques de decoración +Redstone=Redstone +Transportation=Transporte +Miscellaneous=Variado +Search Items=Buscar artículos +Foodstuffs=Productos alimenticios +Tools=Herramientas +Combat=Combate +Mobs=Mobs +Materials=Materiales +Survival Inventory=Inventario de supervivencia +Crafting=Elaboración +Inventory=Inventario diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr new file mode 100644 index 00000000..e15a422a --- /dev/null +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr @@ -0,0 +1,20 @@ +# textdomain: mcl_inventory +Recipe book=Livre de recettes +Help=Aide +Select player skin=Sélectionnez l'apparence du joueur +Achievements=Accomplissements +Building Blocks=Blocs de Construction +Decoration Blocks=Blocs de Décoration +Redstone=Redstone +Transportation=Transport +Miscellaneous=Divers +Search Items=Rechercher des objets +Foodstuffs=Denrées alimentaires +Tools=Outils +Combat=Combat +Mobs=Mobs +Materials=Matériaux +Survival Inventory=Inventaire de survie +Crafting=Artisanat +Inventory=Inventaire +@1/@2=@1/@2 diff --git a/mods/HUD/mcl_inventory/locale/template.txt b/mods/HUD/mcl_inventory/locale/template.txt new file mode 100644 index 00000000..649f3958 --- /dev/null +++ b/mods/HUD/mcl_inventory/locale/template.txt @@ -0,0 +1,20 @@ +# textdomain: mcl_inventory +Recipe book= +Help= +Select player skin= +Achievements= +Building Blocks= +Decoration Blocks= +Redstone= +Transportation= +Miscellaneous= +Search Items= +Foodstuffs= +Tools= +Combat= +Mobs= +Materials= +Survival Inventory= +Crafting= +Inventory= +@1/@2= diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_active.png b/mods/HUD/mcl_inventory/textures/crafting_creative_active.png index 230bde3d..a1dcc713 100644 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_active.png and b/mods/HUD/mcl_inventory/textures/crafting_creative_active.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_active_down.png b/mods/HUD/mcl_inventory/textures/crafting_creative_active_down.png new file mode 100644 index 00000000..f24d0472 Binary files /dev/null and b/mods/HUD/mcl_inventory/textures/crafting_creative_active_down.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_down.png b/mods/HUD/mcl_inventory/textures/crafting_creative_down.png deleted file mode 100644 index 5a45c173..00000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_down.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_inactive.png b/mods/HUD/mcl_inventory/textures/crafting_creative_inactive.png index 94cb4369..cf2ebe83 100644 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_inactive.png and b/mods/HUD/mcl_inventory/textures/crafting_creative_inactive.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_inactive_down.png b/mods/HUD/mcl_inventory/textures/crafting_creative_inactive_down.png new file mode 100644 index 00000000..c117b5dc Binary files /dev/null and b/mods/HUD/mcl_inventory/textures/crafting_creative_inactive_down.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_next.png b/mods/HUD/mcl_inventory/textures/crafting_creative_next.png new file mode 100644 index 00000000..9a0a3fd6 Binary files /dev/null and b/mods/HUD/mcl_inventory/textures/crafting_creative_next.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_prev.png b/mods/HUD/mcl_inventory/textures/crafting_creative_prev.png new file mode 100644 index 00000000..5deba802 Binary files /dev/null and b/mods/HUD/mcl_inventory/textures/crafting_creative_prev.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_trash.png b/mods/HUD/mcl_inventory/textures/crafting_creative_trash.png index d2bdfb5c..ec567d74 100644 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_trash.png and b/mods/HUD/mcl_inventory/textures/crafting_creative_trash.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_up.png b/mods/HUD/mcl_inventory/textures/crafting_creative_up.png deleted file mode 100644 index d6b8eadd..00000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_up.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_formspec_bg.png b/mods/HUD/mcl_inventory/textures/crafting_formspec_bg.png index 927d0d79..a6a02de2 100644 Binary files a/mods/HUD/mcl_inventory/textures/crafting_formspec_bg.png and b/mods/HUD/mcl_inventory/textures/crafting_formspec_bg.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_formspec_bg2.png b/mods/HUD/mcl_inventory/textures/crafting_formspec_bg2.png deleted file mode 100644 index f5d2d651..00000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_formspec_bg2.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_inventory_9_slots.png b/mods/HUD/mcl_inventory/textures/crafting_inventory_9_slots.png deleted file mode 100644 index e58e0634..00000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_inventory_9_slots.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative.png b/mods/HUD/mcl_inventory/textures/crafting_inventory_creative.png index 3ef4d3a7..3e575d66 100644 Binary files a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative.png and b/mods/HUD/mcl_inventory/textures/crafting_inventory_creative.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_scroll.png b/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_scroll.png deleted file mode 100644 index fd7dcad3..00000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_scroll.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_survival.png b/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_survival.png index e95ee6c8..fe525814 100644 Binary files a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_survival.png and b/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_survival.png differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_slider.png b/mods/HUD/mcl_inventory/textures/crafting_slider.png deleted file mode 100644 index 2e41f099..00000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_slider.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/gui_hotbar.png b/mods/HUD/mcl_inventory/textures/gui_hotbar.png deleted file mode 100644 index d3dd364d..00000000 Binary files a/mods/HUD/mcl_inventory/textures/gui_hotbar.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_button9.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_button9.png new file mode 100644 index 00000000..aab16013 Binary files /dev/null and b/mods/HUD/mcl_inventory/textures/mcl_inventory_button9.png differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_button9_pressed.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_button9_pressed.png new file mode 100644 index 00000000..aeaea13a Binary files /dev/null and b/mods/HUD/mcl_inventory/textures/mcl_inventory_button9_pressed.png differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_blocks.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_blocks.png deleted file mode 100644 index 7bd45b45..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_blocks.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_brew.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_brew.png deleted file mode 100644 index 9664aebb..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_brew.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_combat.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_combat.png deleted file mode 100644 index 0d37d288..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_combat.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_deco.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_deco.png deleted file mode 100644 index b2a74cf1..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_deco.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_food.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_food.png deleted file mode 100644 index 12a353f5..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_food.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_matr.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_matr.png deleted file mode 100644 index ef426a2a..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_matr.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_misc.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_misc.png deleted file mode 100644 index fafacc55..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_misc.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_nix.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_nix.png deleted file mode 100644 index 7ecf7761..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_nix.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_rail.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_rail.png deleted file mode 100644 index f52fd1bf..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_rail.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_redstone.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_redstone.png deleted file mode 100644 index e47fc881..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_redstone.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_tools.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_tools.png deleted file mode 100644 index 97f588fb..00000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_tools.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar.png new file mode 100644 index 00000000..058f5da3 Binary files /dev/null and b/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar.png differ diff --git a/mods/HUD/mcl_inventory/textures/gui_hotbar_selected.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar_selected.png similarity index 100% rename from mods/HUD/mcl_inventory/textures/gui_hotbar_selected.png rename to mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar_selected.png diff --git a/mods/HUD/modpack.conf b/mods/HUD/modpack.conf new file mode 100644 index 00000000..97471a43 --- /dev/null +++ b/mods/HUD/modpack.conf @@ -0,0 +1,2 @@ +name = HUD +description = Meta-modpack containing HUD-related mods for MineClone 2 diff --git a/mods/HUD/modpack.txt b/mods/HUD/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/HUD/show_wielded_item/init.lua b/mods/HUD/show_wielded_item/init.lua index addd92e0..46a7e0c0 100644 --- a/mods/HUD/show_wielded_item/init.lua +++ b/mods/HUD/show_wielded_item/init.lua @@ -42,6 +42,7 @@ local function set_hud(player) alignment = {x=0, y=0}, number = 0xFFFFFF , text = "", + z_index = 100, }) end diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/depends.txt b/mods/ITEMS/REDSTONE/mcl_comparators/depends.txt new file mode 100644 index 00000000..2cc05ce7 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/depends.txt @@ -0,0 +1,4 @@ +mesecons +mcl_sounds +doc? +screwdriver? diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua new file mode 100644 index 00000000..48bd18bf --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua @@ -0,0 +1,357 @@ +local S = minetest.get_translator("mcl_comparators") + +-- Functions that get the input/output rules of the comparator + +local comparator_get_output_rules = function(node) + local rules = {{x = -1, y = 0, z = 0, spread=true}} + for i = 0, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + return rules +end + + +local comparator_get_input_rules = function(node) + local rules = { + -- we rely on this order in update_self below + {x = 1, y = 0, z = 0}, -- back + {x = 0, y = 0, z = -1}, -- side + {x = 0, y = 0, z = 1}, -- side + } + for i = 0, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + return rules +end + + +-- Functions that are called after the delay time + +local comparator_turnon = function(params) + local rules = comparator_get_output_rules(params.node) + mesecon.receptor_on(params.pos, rules) +end + + +local comparator_turnoff = function(params) + local rules = comparator_get_output_rules(params.node) + mesecon.receptor_off(params.pos, rules) +end + + +-- Functions that set the correct node type an schedule a turnon/off + +local comparator_activate = function(pos, node) + local def = minetest.registered_nodes[node.name] + minetest.swap_node(pos, { name = def.comparator_onstate, param2 = node.param2 }) + minetest.after(0.1, comparator_turnon , {pos = pos, node = node}) +end + + +local comparator_deactivate = function(pos, node) + local def = minetest.registered_nodes[node.name] + minetest.swap_node(pos, { name = def.comparator_offstate, param2 = node.param2 }) + minetest.after(0.1, comparator_turnoff, {pos = pos, node = node}) +end + + +-- weather pos has an inventory that contains at least one item +local container_inventory_nonempty = function(pos) + local invnode = minetest.get_node(pos) + local invnodedef = minetest.registered_nodes[invnode.name] + -- Ignore stale nodes + if not invnodedef then return false end + + -- Only accept containers. When a container is dug, it's inventory + -- seems to stay. and we don't want to accept the inventory of an air + -- block + if not invnodedef.groups.container then return false end + + local inv = minetest.get_inventory({type="node", pos=pos}) + if not inv then return false end + + for listname, _ in pairs(inv:get_lists()) do + if not inv:is_empty(listname) then return true end + end + + return false +end + +-- weather pos has an constant signal output for the comparator +local static_signal_output = function(pos) + local node = minetest.get_node(pos) + local g = minetest.get_item_group(node.name, "comparator_signal") + return g > 0 +end + +-- whether the comparator should be on according to its inputs +local comparator_desired_on = function(pos, node) + local my_input_rules = comparator_get_input_rules(node); + local back_rule = my_input_rules[1] + local state + if back_rule then + local back_pos = vector.add(pos, back_rule) + state = mesecon.is_power_on(back_pos) or container_inventory_nonempty(back_pos) or static_signal_output(back_pos) + end + + -- if back input if off, we don't need to check side inputs + if not state then return false end + + -- without power levels, side inputs have no influence on output in compare + -- mode + local mode = minetest.registered_nodes[node.name].comparator_mode + if mode == "comp" then return state end + + -- subtract mode, subtract max(side_inputs) from back input + local side_state = false + for ri = 2,3 do + if my_input_rules[ri] then + side_state = mesecon.is_power_on(vector.add(pos, my_input_rules[ri])) + end + if side_state then break end + end + -- state is known to be true + return not side_state +end + + +-- update comparator state, if needed +local update_self = function(pos, node) + node = node or minetest.get_node(pos) + local old_state = mesecon.is_receptor_on(node.name) + local new_state = comparator_desired_on(pos, node) + if new_state ~= old_state then + if new_state then + comparator_activate(pos, node) + else + comparator_deactivate(pos, node) + end + end +end + + +-- compute tile depending on state and mode +local get_tiles = function(state, mode) + local top = "mcl_comparators_"..state..".png^".. + "mcl_comparators_"..mode..".png" + local sides = "mcl_comparators_sides_"..state..".png^".. + "mcl_comparators_sides_"..mode..".png" + local ends = "mcl_comparators_ends_"..state..".png^".. + "mcl_comparators_ends_"..mode..".png" + return { + top, "mcl_stairs_stone_slab_top.png", + sides, sides.."^[transformFX", + ends, ends, + } +end + +-- Given one mode, get the other mode +local flipmode = function(mode) + if mode == "comp" then return "sub" + elseif mode == "sub" then return "comp" + end +end + +local make_rightclick_handler = function(state, mode) + local newnodename = + "mcl_comparators:comparator_"..state.."_"..flipmode(mode) + return function (pos, node, clicker) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end + minetest.swap_node(pos, {name = newnodename, param2 = node.param2 }) + end +end + + +-- Register the 2 (states) x 2 (modes) comparators + +local icon = "mcl_comparators_item.png" + +local node_boxes = { + comp = { + { -8/16, -8/16, -8/16, + 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, + 1/16, -4/16, 4/16 }, -- front torch + { -4/16, -6/16, -5/16, + -2/16, -1/16, -3/16 }, -- left back torch + { 2/16, -6/16, -5/16, + 4/16, -1/16, -3/16 }, -- right back torch + }, + sub = { + { -8/16, -8/16, -8/16, + 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, + 1/16, -3/16, 4/16 }, -- front torch (active) + { -4/16, -6/16, -5/16, + -2/16, -1/16, -3/16 }, -- left back torch + { 2/16, -6/16, -5/16, + 4/16, -1/16, -3/16 }, -- right back torch + }, +} + +local collision_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, +} + +local state_strs = { + [ mesecon.state.on ] = "on", + [ mesecon.state.off ] = "off", +} + +local groups = { + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1, + attached_node = 1, +} + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.disallow +end + +for _, mode in pairs{"comp", "sub"} do +for _, state in pairs{mesecon.state.on, mesecon.state.off} do + local state_str = state_strs[state] + local nodename = + "mcl_comparators:comparator_"..state_strs[state].."_"..mode + + -- Help + local longdesc, usagehelp, use_help + if state_strs[state] == "off" and mode == "comp" then + longdesc = S("Redstone comparators are multi-purpose redstone components.").."\n".. + S("They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.") + + usagehelp = S("A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.").."\n".. + S("The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.").."\n".. + S("The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.").."\n\n".. + S("Transmission mode:\nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.").."\n".. + S("Subtraction mode:\nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.") + else + use_help = false + end + + local nodedef = { + description = S("Redstone Comparator"), + inventory_image = icon, + wield_image = icon, + _doc_items_create_entry = use_help, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + drawtype = "nodebox", + tiles = get_tiles(state_strs[state], mode), + wield_image = "mcl_comparators_off.png", + walkable = true, + selection_box = collision_box, + collision_box = collision_box, + node_box = { + type = "fixed", + fixed = node_boxes[mode], + }, + groups = groups, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = false, + is_ground_content = false, + drop = 'mcl_comparators:comparator_off_comp', + on_construct = update_self, + on_rightclick = + make_rightclick_handler(state_strs[state], mode), + comparator_mode = mode, + comparator_onstate = "mcl_comparators:comparator_on_"..mode, + comparator_offstate = "mcl_comparators:comparator_off_"..mode, + sounds = mcl_sounds.node_sound_stone_defaults(), + mesecons = { + receptor = { + state = state, + rules = comparator_get_output_rules, + }, + effector = { + rules = comparator_get_input_rules, + action_change = update_self, + } + }, + on_rotate = on_rotate, + } + + if mode == "comp" and state == mesecon.state.off then + -- This is the prototype + nodedef._doc_items_create_entry = true + else + nodedef.groups = table.copy(nodedef.groups) + nodedef.groups.not_in_creative_inventory = 1 + local extra_desc = {} + if mode == "sub" or state == mesecon.state.on then + nodedef.inventory_image = nil + end + local desc = nodedef.description + if mode ~= "sub" and state == mesecon.state.on then + desc = S("Redstone Comparator (Powered)") + elseif mode == "sub" and state ~= mesecon.state.on then + desc = S("Redstone Comparator (Subtract)") + elseif mode == "sub" and state == mesecon.state.on then + desc = S("Redstone Comparator (Subtract, Powered)") + end + nodedef.description = desc + end + + minetest.register_node(nodename, nodedef) +end +end + +-- Register recipies +local rstorch = "mesecons_torch:mesecon_torch_on" +local quartz = "mcl_nether:quartz" +local stone = "mcl_core:stone" + +minetest.register_craft({ + output = "mcl_comparators:comparator_off_comp", + recipe = { + { "", rstorch, "" }, + { rstorch, quartz, rstorch }, + { stone, stone, stone }, + } +}) + +-- Register active block handlers +minetest.register_abm({ + label = "Comparator signal input check (comparator is off)", + nodenames = { + "mcl_comparators:comparator_off_comp", + "mcl_comparators:comparator_off_sub", + }, + neighbors = {"group:container", "group:comparator_signal"}, + interval = 1, + chance = 1, + action = update_self, +}) + +minetest.register_abm({ + label = "Comparator signal input check (comparator is on)", + nodenames = { + "mcl_comparators:comparator_on_comp", + "mcl_comparators:comparator_on_sub", + }, + -- needs to run regardless of neighbors to make sure we detect when a + -- container is dug + interval = 1, + chance = 1, + action = update_self, +}) + + +-- Add entry aliases for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_comparators:comparator_off_comp", + "nodes", "mcl_comparators:comparator_off_sub") + doc.add_entry_alias("nodes", "mcl_comparators:comparator_off_comp", + "nodes", "mcl_comparators:comparator_on_comp") + doc.add_entry_alias("nodes", "mcl_comparators:comparator_off_comp", + "nodes", "mcl_comparators:comparator_on_sub") +end diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr new file mode 100644 index 00000000..d9f6eb46 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_comparators +Redstone comparators are multi-purpose redstone components.=Redstonekomparatoren sind Redstonekomponenten mit vielen Verwendungszwecken. +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Sie können ein Redstonesignal übertragen, erkennen, ob ein Block Gegenstände enthält und mehrere Signale vergleichen. +A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.=Ein Redstonekomparator hat 1 Haupteingang, 2 Seiteneingänge und 1 Ausgang. Der Ausgang ist in Pfeilrichtung, der Haupteingang ist in der gegenüberliegenden Richtung. Die anderen 2 Seiten sind die Seiteneingänge. +The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.=Der Haupteingang kann auf 2 Weisen versorgt werden: Erstens, kann er direkt von Redstoneenergie wie bei jeder anderen Komponente versorgt werden. Zweitens wird er versorgt, wenn, und nur wenn ein Behälter (wie eine Truhe) vor dem Komporator platziert wurde und der Behälter mindestens einen Gegenstand enthält. +The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.=Die Seiteneingänge akzeptieren nur normale Redstoneenergie. Der Redstonekomparator kann in zwei Modi agieren: Übertragungsmodus und Subtraktionsmodus. Er fängt im Übertragungsmodus an. Der Modus wird beim Benutzen des Blocks geändert. +Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.=Übertragungsmodus:@nDie vordere Fackel ist eingefahren und leuchtet nicht auf. Die Ausgabe gibt ein Signal, wenn, nur nur wenn der Haupteingang bestromt wird. Die zwei Seiteneingänge werden ignoriert. +Subtraction mode:@nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.=Subtraktionsmodus:@nDie vordere Fackel leuchtet auf. Die Ausgabe gibt ein Signal wenn, nur nur wenn der Haupteingang versorgt wird und keiner der Seiteneingänge bestromt ist. +Redstone Comparator=Redstonekomparator +Redstone Comparator (Subtract)=Redstonekomparator (subtrahieren) +Redstone Comparator (Powered)=Redstonekomparator (bestromt) +Redstone Comparator (Subtract, Powered)=Redstonekomparator (subtrahieren, bestromt) diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.es.tr b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.es.tr new file mode 100644 index 00000000..581c0ab1 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.es.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_comparators +Redstone comparators are multi-purpose redstone components.=Los comparadores de Redstone son componentes multipropósito de redstone. +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Pueden transmitir una señal de redstone, detectar si un bloque contiene algún elemento y comparar múltiples señales. +A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.=Un comparador redstone tiene 1 entrada principal, 2 entradas laterales y 1 salida. La salida está en la dirección de la flecha, la entrada principal está en la dirección opuesta. Los otros 2 lados son las entradas laterales. +The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.=La entrada principal puede alimentarse de 2 maneras: en primer lugar, puede alimentarse directamente mediante redstone como cualquier otro componente. En segundo lugar, se alimenta si, y solo si se coloca un contenedor (como un cofre) frente a él y el contenedor contiene al menos un elemento. +The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.=Las entradas laterales solo están alimentadas por la alimentación normal de redstone. El comparador de redstone puede funcionar en dos modos: modo de transmisión y modo de resta. Comienza en modo de transmisión y el modo se puede cambiar usando el bloque. +Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.=Modo de transmisión: @nLa antorcha delantera está apagada y baja. La salida se alimenta solo si se alimenta la entrada principal. Las dos entradas laterales se ignoran. +Subtraction mode:@nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.=Modo de resta: @nLa antorcha delantera está encendida. La salida se alimenta si, y solo si la entrada principal está alimentada y ninguna de las entradas laterales está alimentada. +Redstone Comparator=Comparador de redstone +Redstone Comparator (Subtract)=Comparador de redstone (Negativo) +Redstone Comparator (Powered)=Comparador de redstone (Motorizado) +Redstone Comparator (Subtract, Powered)=Redstonekomparator (Negativo, Motorizado) diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.fr.tr b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.fr.tr new file mode 100644 index 00000000..38a03d31 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.fr.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_comparators +Redstone comparators are multi-purpose redstone components.=Les comparateurs Redstone sont des composants Redstone polyvalents. +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Ils peuvent transmettre un signal redstone, détecter si un bloc contient des éléments et comparer plusieurs signaux. +A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.=Un comparateur redstone a 1 entrée principale, 2 entrées latérales et 1 sortie. La sortie est dans le sens de la flèche, l'entrée principale est dans le sens opposé. Les 2 autres côtés sont les entrées latérales. +The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.=L'entrée principale peut être alimentée de 2 manières: Premièrement, elle peut être alimentée directement par une alimentation redstone comme n'importe quel autre composant. Deuxièmement, il est alimenté si et seulement si un conteneur (comme un coffre) est placé devant lui et que le conteneur contient au moins un article. +The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.=Les entrées latérales sont uniquement alimentées par une alimentation Redstone normale. Le comparateur redstone peut fonctionner en deux modes: le mode de transmission et le mode de soustraction. Il démarre en mode transmission et le mode peut être changé en utilisant le bloc. +Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.=Mode de transmission: @nLa torche avant est éteinte et abaissée. La sortie est alimentée si et seulement si l'entrée principale est alimentée. Les deux entrées latérales sont ignorées. +Subtraction mode:@nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.=Mode de soustraction: @nLa torche avant est allumée. La sortie est alimentée si et seulement si l'entrée principale est alimentée et qu'aucune des entrées latérales n'est alimentée. +Redstone Comparator=Comparateur Redstone +Redstone Comparator (Subtract)=Comparateur Redstone (Soustraction) +Redstone Comparator (Powered)=Comparateur Redstone (Alimenté) +Redstone Comparator (Subtract, Powered)=Comparateur Redstone (Soustraction, Alimenté) diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt new file mode 100644 index 00000000..d22d0176 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: mcl_comparators +Redstone comparators are multi-purpose redstone components.= +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.= +A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.= +The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.= +The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.= +Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.= +Subtraction mode:@nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.= +Redstone Comparator= +Redstone Comparator (Subtract)= +Redstone Comparator (Powered)= +Redstone Comparator (Subtract, Powered)= diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/mod.conf b/mods/ITEMS/REDSTONE/mcl_comparators/mod.conf new file mode 100644 index 00000000..e0a6a9bb --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/mod.conf @@ -0,0 +1 @@ +name = mcl_comparators diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_comp.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_comp.png new file mode 100644 index 00000000..9967cf5c Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_comp.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_comp.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_comp.png new file mode 100644 index 00000000..3b8e7477 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_comp.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_off.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_off.png new file mode 100644 index 00000000..02ccb50a Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_off.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_on.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_on.png new file mode 100644 index 00000000..33505b38 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_on.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_sub.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_sub.png new file mode 100644 index 00000000..f0697465 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_ends_sub.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_item.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_item.png new file mode 100644 index 00000000..7febe579 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_item.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_off.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_off.png new file mode 100644 index 00000000..b7affc2e Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_off.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_on.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_on.png new file mode 100644 index 00000000..c2e250d5 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_on.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_comp.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_comp.png new file mode 100644 index 00000000..536d61bf Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_comp.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_off.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_off.png new file mode 100644 index 00000000..ba70c3ef Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_off.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_on.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_on.png new file mode 100644 index 00000000..bb683c93 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_on.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_sub.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_sub.png new file mode 100644 index 00000000..76d9187d Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sides_sub.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sub.png b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sub.png new file mode 100644 index 00000000..a62e6c7f Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_comparators/textures/mcl_comparators_sub.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/API.md b/mods/ITEMS/REDSTONE/mcl_dispensers/API.md new file mode 100644 index 00000000..419c3ac4 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/API.md @@ -0,0 +1,27 @@ +# API documentation for dispensers + +The dispensers API allows you to add custom code which is called when a +particular item is dispensed. +Just add the `_on_dispense` function to the item definition. +By default, items are just thrown out as item entities. + +## Additional fields for item definitions + +### `_on_dispense(stack, pos, droppos, dropnode, dropdir)` + +This is a function which is called when an item is dispensed by the dispenser. +These are the parameters: + +* stack: Itemstack which is dispense. This is always exactly 1 item +* pos: Position of dispenser +* droppos: Position to which to dispense item +* dropnode: Node of droppos +* dropdir: Drop direction + +By default (return value: `nil`), the itemstack is consumed by the dispenser afterwards. +Optionally, you can explicitly set the return value to a custom leftover itemstack. + +### `_dispense_into_walkable` + +By default, items will only be dispensed into non-walkable nodes. +But if this value is set If `true`, the item can be dispensed into walkable nodes. diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt b/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt index e726d025..7b51f67c 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt @@ -1,7 +1,12 @@ mcl_init +mcl_formspec mesecons mcl_sounds mcl_tnt -3d_armor_stand -3d_armor +mcl_worlds +mcl_core +mcl_nether +mcl_armor_stand +mcl_armor doc? +screwdriver? diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 7ac45640..b6d0d2ef 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -7,17 +7,20 @@ All node definitions share a lot of code, so this is the reason why there are so many weird tables below. ]] +local S = minetest.get_translator("mcl_dispensers") -- For after_place_node local setup_dispenser = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. - mcl_vars.inventory_header.. - "image[3,-0.2;5,0.75;mcl_dispensers_fnt_dispenser.png]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dispenser"))).."]".. "list[current_name;main;3,0.5;3,3;]".. + mcl_formspec.get_itemslot_bg(3,0.5,3,3).. "listring[current_name;main]".. "listring[current_player;main]" local meta = minetest.get_meta(pos) @@ -26,10 +29,57 @@ local setup_dispenser = function(pos) inv:set_size("main", 9) end +local orientate_dispenser = function(pos, placer) + -- Not placed by player + if not placer then return end + + -- Pitch in degrees + local pitch = placer:get_look_vertical() * (180 / math.pi) + + local node = minetest.get_node(pos) + if pitch > 55 then + minetest.swap_node(pos, {name="mcl_dispensers:dispenser_up", param2 = node.param2}) + elseif pitch < -55 then + minetest.swap_node(pos, {name="mcl_dispensers:dispenser_down", param2 = node.param2}) + end +end + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple +end + -- Shared core definition table local dispenserdef = { is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) local meta2 = meta @@ -44,7 +94,7 @@ local dispenserdef = { end meta:from_table(meta2:to_table()) end, - _mcl_blast_resistance = 17.5, + _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, mesecons = {effector = { -- Dispense random item when triggered @@ -63,11 +113,7 @@ local dispenserdef = { droppos = {x=pos.x, y=pos.y-1, z=pos.z} end local dropnode = minetest.get_node(droppos) - -- Do not dispense into solid nodes local dropnodedef = minetest.registered_nodes[dropnode.name] - if dropnodedef.walkable then - return - end local stacks = {} for i=1,inv:get_size("main") do local stack = inv:get_stack("main", i) @@ -78,158 +124,19 @@ local dispenserdef = { if #stacks >= 1 then local r = math.random(1, #stacks) local stack = stacks[r].stack - local dropitem = ItemStack(stack:get_name()) + local dropitem = ItemStack(stack) + dropitem:set_count(1) local stack_id = stacks[r].stackpos + local stackdef = stack:get_definition() local iname = stack:get_name() local igroups = minetest.registered_items[iname].groups --[===[ Dispense item ]===] - if iname == "mcl_throwing:arrow" then - -- Shoot arrow - local shootpos = vector.add(pos, vector.multiply(dropdir, 0.51)) - local yaw = math.atan2(dropdir.z, dropdir.x) - math.pi/2 - mcl_throwing.shoot_arrow(iname, shootpos, dropdir, yaw, nil, 19, 3) - stack:take_item() - inv:set_stack("main", stack_id, stack) + -- Hardcoded dispensions -- - elseif iname == "mcl_throwing:egg" or iname == "mcl_throwing:snowball" then - -- Throw egg or snowball - local shootpos = vector.add(pos, vector.multiply(dropdir, 0.51)) - mcl_throwing.throw(iname, shootpos, dropdir) - - stack:take_item() - inv:set_stack("main", stack_id, stack) - - elseif iname == "mcl_fire:fire_charge" then - -- Throw fire charge - local shootpos = vector.add(pos, vector.multiply(dropdir, 0.51)) - local fireball = minetest.add_entity(shootpos, "mobs_mc:blaze_fireball") - local ent = fireball:get_luaentity() - ent._shot_from_dispenser = true - local v = ent.velocity or 1 - fireball:setvelocity(vector.multiply(dropdir, v)) - ent.switch = 1 - - stack:take_item() - inv:set_stack("main", stack_id, stack) - - elseif iname == "mcl_fire:flint_and_steel" then - -- Ignite air or fire - if dropnode.name == "air" then - minetest.add_node(droppos, {name="mcl_fire:fire"}) - if not minetest.settings:get_bool("creative_mode") then - stack:add_wear(65535/65) -- 65 uses - end - elseif dropnode.name == "mcl_tnt:tnt" then - tnt.ignite(droppos) - if not minetest.settings:get_bool("creative_mode") then - stack:add_wear(65535/65) -- 65 uses - end - end - - inv:set_stack("main", stack_id, stack) - elseif iname == "mcl_tnt:tnt" then - -- Place and ignite TNT - if dropnodedef.buildable_to then - minetest.set_node(droppos, {name = iname}) - tnt.ignite(droppos) - - stack:take_item() - inv:set_stack("main", stack_id, stack) - end - elseif iname == "mcl_buckets:bucket_empty" then - -- Fill empty bucket with liquid or drop bucket if no liquid - local collect_liquid = false - local bucket_id - if dropnode.name == "mcl_core:water_source" then - collect_liquid = true - bucket_id = "mcl_buckets:bucket_water" - elseif dropnode.name == "mcl_core:lava_source" then - collect_liquid = true - bucket_id = "mcl_buckets:bucket_lava" - end - if collect_liquid then - minetest.set_node(droppos, {name="air"}) - - -- Fill bucket with liquid and put it back into inventory - -- if there's still space. If not, drop it. - stack:take_item() - inv:set_stack("main", stack_id, stack) - - local new_bucket = ItemStack(bucket_id) - if inv:room_for_item("main", new_bucket) then - inv:add_item("main", new_bucket) - else - minetest.add_item(droppos, dropitem) - end - else - -- No liquid found: Drop empty bucket - minetest.add_item(droppos, dropitem) - - stack:take_item() - inv:set_stack("main", stack_id, stack) - end - elseif iname == "mcl_buckets:bucket_water" or iname == "mcl_buckets:bucket_lava" then - -- Place water/lava source - if dropnodedef.buildable_to then - if iname == "mcl_buckets:bucket_water" then - minetest.set_node(droppos, {name = "mcl_core:water_source"}) - elseif iname == "mcl_buckets:bucket_lava" then - minetest.set_node(droppos, {name = "mcl_core:lava_source"}) - end - - stack:take_item() - inv:set_stack("main", stack_id, stack) - - if inv:room_for_item("main", "mcl_buckets:bucket_empty") then - inv:add_item("main", "mcl_buckets:bucket_empty") - else - minetest.add_item(droppos, dropitem) - end - end - - elseif iname == "mcl_dye:white" then - -- Apply bone meal, if possible - if dropnode.name == "air" then - pointed_thing = { above = droppos, under = { x=droppos.x, y=droppos.y-1, z=droppos.z } } - else - pointed_thing = { above = pos, under = droppos } - end - local success = mcl_dye.apply_bone_meal(pointed_thing) - if success then - stack:take_item() - inv:set_stack("main", stack_id, stack) - end - - elseif iname == "mcl_minecarts:minecart" then - -- Place minecart as entity on rail - if dropnodedef.groups.rail then - minetest.add_entity(droppos, "mcl_minecarts:minecart") - - else - -- Drop item - minetest.add_item(droppos, dropitem) - - end - - stack:take_item() - inv:set_stack("main", stack_id, stack) - - elseif igroups.boat then - local below = {x=droppos.x, y=droppos.y-1, z=droppos.z} - local belownode = minetest.get_node(below) - -- Place boat as entity on or in water - if dropnodedef.groups.water or (dropnode.name == "air" and minetest.registered_nodes[belownode.name].groups.water) then - minetest.add_entity(droppos, "mcl_boats:boat") - else - minetest.add_item(droppos, dropitem) - end - - stack:take_item() - inv:set_stack("main", stack_id, stack) - - elseif igroups.armor_head or igroups.armor_torso or igroups.armor_legs or igroups.armor_feet then + -- Armor, mob heads and pumpkins + if igroups.armor_head or igroups.armor_torso or igroups.armor_legs or igroups.armor_feet then local armor_type, armor_slot local armor_dispensed = false if igroups.armor_head then @@ -250,9 +157,9 @@ local dispenserdef = { local dropnode_below = minetest.get_node(droppos_below) -- Put armor on player or armor stand local standpos - if dropnode.name == "3d_armor_stand:armor_stand" then + if dropnode.name == "mcl_armor_stand:armor_stand" then standpos = droppos - elseif dropnode_below.name == "3d_armor_stand:armor_stand" then + elseif dropnode_below.name == "mcl_armor_stand:armor_stand" then standpos = droppos_below end if standpos then @@ -260,12 +167,10 @@ local dispenserdef = { local dropinv = dropmeta:get_inventory() if dropinv:room_for_item(armor_type, dropitem) then dropinv:add_item(armor_type, dropitem) - --[[ FIXME: For some reason, this function is not called after calling add_item, - so we call it manually to update the armor stand entity. - This may need investigation and the following line may be a small hack. ]] - minetest.registered_nodes["3d_armor_stand:armor_stand"].on_metadata_inventory_put(standpos) + minetest.registered_nodes["mcl_armor_stand:armor_stand"].on_metadata_inventory_put(standpos) stack:take_item() inv:set_stack("main", stack_id, stack) + armor:play_equip_sound(dropitem, nil, standpos) armor_dispensed = true end else @@ -299,6 +204,7 @@ local dispenserdef = { pinv:set_stack("armor", armor_slot, dropitem) armor:set_player_armor(player) armor:update_inventory(player) + armor:play_equip_sound(dropitem, player) stack:take_item() inv:set_stack("main", stack_id, stack) @@ -318,77 +224,91 @@ local dispenserdef = { end end - elseif igroups.shulker_box then - -- Place shulker box as node - if dropnodedef.buildable_to then - minetest.set_node(droppos, {name = iname, param2 = node.param2}) - local imeta = stack:get_metadata() - local iinv_main = minetest.deserialize(imeta) - local ninv = minetest.get_inventory({type="node", pos=droppos}) - ninv:set_list("main", iinv_main) - stack:take_item() - end - + -- Spawn Egg elseif igroups.spawn_egg then - -- Place spawn egg + -- Spawn mob if not dropnodedef.walkable then pointed_thing = { above = droppos, under = { x=droppos.x, y=droppos.y-1, z=droppos.z } } - - minetest.registered_items[iname].on_place(ItemStack(iname), nil, pointed_thing) + minetest.add_entity(droppos, stack:get_name()) stack:take_item() inv:set_stack("main", stack_id, stack) end - -- TODO: Many other dispenser actions - else - -- Drop item - minetest.add_item(droppos, dropitem) - - stack:take_item() - inv:set_stack("main", stack_id, stack) + -- Generalized dispension + elseif (not dropnodedef.walkable or stackdef._dispense_into_walkable) then + --[[ _on_dispense(stack, pos, droppos, dropnode, dropdir) + * stack: Itemstack which is dispense + * pos: Position of dispenser + * droppos: Position to which to dispense item + * dropnode: Node of droppos + * dropdir: Drop direction + + _dispense_into_walkable: If true, can dispense into walkable nodes + ]] + if stackdef._on_dispense then + -- Item-specific dispension (if defined) + local od_ret = stackdef._on_dispense(dropitem, pos, droppos, dropnode, dropdir) + if od_ret then + local newcount = stack:get_count() - 1 + stack:set_count(newcount) + inv:set_stack("main", stack_id, stack) + if newcount == 0 then + inv:set_stack("main", stack_id, od_ret) + elseif inv:room_for_item("main", od_ret) then + inv:add_item("main", od_ret) + else + minetest.add_item(droppos, dropitem) + end + else + stack:take_item() + inv:set_stack("main", stack_id, stack) + end + else + -- Drop item otherwise + minetest.add_item(droppos, dropitem) + stack:take_item() + inv:set_stack("main", stack_id, stack) + end end + + end - end - }} + end, + rules = mesecon.rules.alldirs, + }}, + on_rotate = on_rotate, } -- Horizontal dispenser local horizontal_def = table.copy(dispenserdef) -horizontal_def.description = "Dispenser" -horizontal_def._doc_items_longdesc = "A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots." -horizontal_def._doc_items_usagehelp = [[Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Rightclick the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a single random item. +horizontal_def.description = S("Dispenser") +horizontal_def._tt_help = S("9 inventory slots").."\n"..S("Launches item when powered by redstone power") +horizontal_def._doc_items_longdesc = S("A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.") +horizontal_def._doc_items_usagehelp = S("Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.").."\n\n".. -The dispenser will do different things, depending on the dispensed item: +S("The dispenser will do different things, depending on the dispensed item:").."\n\n".. -• Arrows: Are launched -• Eggs and snowballs: Are thrown -• Fire charges: Are fired in a straight line -• Armor: Will be equipped to players and armor stands -• Boats: Are placed on water or are dropped -• Minecart: Are placed on rails or are dropped -• Bone meal: Is applied on the block it is facint -• Empty buckets: Are used to collect a liquid source -• Filled buckets: Are used to place a liquid source -• Heads, pumpkins: Equipped to players and armor stands, or placed as a block -• Shulker boxes: Are placed as a block -• TNT: Is placed and ignited -• Flint and steel: Is used to ignite a fire in air and to ignite TNT -• Spawn eggs: Will summon the mob they contain -• Other items: Are simply dropped]] +S("• Arrows: Are launched").."\n".. +S("• Eggs and snowballs: Are thrown").."\n".. +S("• Fire charges: Are fired in a straight line").."\n".. +S("• Armor: Will be equipped to players and armor stands").."\n".. +S("• Boats: Are placed on water or are dropped").."\n".. +S("• Minecart: Are placed on rails or are dropped").."\n".. +S("• Bone meal: Is applied on the block it is facing").."\n".. +S("• Empty buckets: Are used to collect a liquid source").."\n".. +S("• Filled buckets: Are used to place a liquid source").."\n".. +S("• Heads, pumpkins: Equipped to players and armor stands, or placed as a block").."\n".. +S("• Shulker boxes: Are placed as a block").."\n".. +S("• TNT: Is placed and ignited").."\n".. +S("• Flint and steel: Is used to ignite a fire in air and to ignite TNT").."\n".. +S("• Spawn eggs: Will summon the mob they contain").."\n".. +S("• Other items: Are simply dropped") horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) setup_dispenser(pos) - - -- When placed up and down, convert node to up/down dispenser - if pointed_thing.above.y < pointed_thing.under.y then - minetest.swap_node(pos, {name = "mcl_dispensers:dispenser_down"}) - elseif pointed_thing.above.y > pointed_thing.under.y then - minetest.swap_node(pos, {name = "mcl_dispensers:dispenser_up"}) - end - - -- Else, the normal facedir logic applies + orientate_dispenser(pos, placer) end horizontal_def.tiles = { "default_furnace_top.png", "default_furnace_bottom.png", @@ -402,7 +322,7 @@ minetest.register_node("mcl_dispensers:dispenser", horizontal_def) -- Down dispenser local down_def = table.copy(dispenserdef) -down_def.description = "Downwards-Facing Dispenser" +down_def.description = S("Downwards-Facing Dispenser") down_def.after_place_node = setup_dispenser down_def.tiles = { "default_furnace_top.png", "mcl_dispensers_dispenser_front_vertical.png", @@ -417,7 +337,7 @@ minetest.register_node("mcl_dispensers:dispenser_down", down_def) -- Up dispenser -- The up dispenser is almost identical to the down dispenser , it only differs in textures local up_def = table.copy(down_def) -up_def.description = "Upwards-Facing Dispenser" +up_def.description = S("Upwards-Facing Dispenser") up_def.tiles = { "mcl_dispensers_dispenser_front_vertical.png", "default_furnace_bottom.png", "default_furnace_side.png", "default_furnace_side.png", @@ -430,35 +350,24 @@ minetest.register_craft({ output = 'mcl_dispensers:dispenser', recipe = { {"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",}, - {"mcl_core:cobble", "mcl_throwing:bow", "mcl_core:cobble",}, + {"mcl_core:cobble", "mcl_bows:bow", "mcl_core:cobble",}, {"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",}, } }) --- Only allow crafting if the bow is intact -local check_craft = function(itemstack, player, old_craft_grid, craft_inv) - if itemstack:get_name() == "mcl_dispensers:dispenser" then - local bow, id - for i=1, craft_inv:get_size("craft") do - local item = craft_inv:get_stack("craft", i) - if item:get_name() == "mcl_throwing:bow" then - bow = item - id = i - break - end - end - if bow and bow:get_wear() ~= 0 then - return "" - end - end - return nil -end - -minetest.register_on_craft(check_craft) -minetest.register_craft_predict(check_craft) - -- Add entry aliases for the Help if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_dispensers:dispenser", "nodes", "mcl_dispensers:dispenser_down") doc.add_entry_alias("nodes", "mcl_dispensers:dispenser", "nodes", "mcl_dispensers:dispenser_up") end + +-- Legacy +minetest.register_lbm({ + label = "Update dispenser formspecs (0.60.0)", + name = "mcl_dispensers:update_formspecs_0_60_0", + nodenames = { "mcl_dispensers:dispenser", "mcl_dispensers:dispenser_down", "mcl_dispensers:dispenser_up" }, + action = function(pos, node) + setup_dispenser(pos) + minetest.log("action", "[mcl_dispenser] Node formspec updated at "..minetest.pos_to_string(pos)) + end, +}) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr new file mode 100644 index 00000000..129350e5 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_dispensers +Dispenser=Werfer +A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Ein Werfer ist ein Block, der als eine Redstonekomponente fungiert, die, wenn sie mit Redstoneenergie versorgt ist, einen Gegenstand auswirft. Er hat einen Behälter mit 9 Inventarplätzen. +Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Platzieren Sie den Werfer in einer von 6 möglichen Richtungen. Das „Loch“ ist die Stelle, aus der Dinge aus dem Werfer fliegen. Benutzen Sie den Werfer, um auf das Inventar zuzugreifen. +The dispenser will do different things, depending on the dispensed item:=Der Werfer wird, abhängig vom geworfenem Gegenstand, unterschiedliche Dinge tun: +• Arrows: Are launched=• Pfeile: Werden gefeuert +• Eggs and snowballs: Are thrown=• Eier und Schneebälle: Werden geworfen +• Fire charges: Are fired in a straight line=• Feuerkugeln: Werden schnurgerade abgefeuert +• Armor: Will be equipped to players and armor stands=• Rüstung: Spieler und Rüstungsständer werden ausgerüstet +• Boats: Are placed on water or are dropped=• Boote: Werden auf Wasser platziert oder abgeworfen +• Minecart: Are placed on rails or are dropped=• Loren: Werden auf Schienen platziert oder abgeworfen +• Bone meal: Is applied on the block it is facing=• Knochenmehl: Wird auf den Block, auf den er zeigt, angewandt +• Empty buckets: Are used to collect a liquid source=• Leere Eimer: Sammeln Flüssigkeitsquelle auf +• Filled buckets: Are used to place a liquid source=• Volle Eimer: Platzieren eine Flüssigkeitsquelle +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Köpfe, Kürbisse: Spieler und Rüstungsständer werden ausgerüstet, alternativ werden diese Gegenstände als Block platziert +• Shulker boxes: Are placed as a block=• Schulkerkisten: Werden als Block platziert +• TNT: Is placed and ignited=• TNT: Wird platziert und angezündet +• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Feuerzeuge: Endzündet ein Feuer in der Luft und zündet TNT an +• Spawn eggs: Will summon the mob they contain=• Spawn-Eier: Beschwören einen Mob +• Other items: Are simply dropped=• Andere Gegenstände: Werden fallen gelassen +Downwards-Facing Dispenser=Nach unten zeigender Werfer +Upwards-Facing Dispenser=Nach oben zeigender Werfer +Inventory=Inventar +9 inventory slots=9 Inventarplätze +Launches item when powered by redstone power=Wirft Gegenstand aus, wenn mit Redstoneenergie versorgt diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr new file mode 100644 index 00000000..cf695307 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr @@ -0,0 +1,22 @@ +# textdomain: mcl_dispensers +Dispenser=Dispensador +A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Un dispensador es un bloque que actúa como un componente de redstone que, cuando se alimenta con energía de redstone, dispensa un artículo. Tiene un contenedor con 9 ranuras de inventario. +Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Coloque el dispensador en una de las 6 direcciones posibles. El "agujero" es donde los artículos saldrán volando del dispensador. Use el dispensador para acceder a su inventario. Inserte los artículos que desea dispensar. Proporcione al dispensador energía de redstone una vez para dispensar un elemento aleatorio: +• Arrows: Are launched=• Flechas: Se lanzan +• Eggs and snowballs: Are thrown=• Huevos y bolas de nieve: Son lanzados +• Fire charges: Are fired in a straight line=• Cargas de fuego: Se disparan en línea recta +• Armor: Will be equipped to players and armor stands=• Armadura: Estará equipada para jugadores y armaduras +• Boats: Are placed on water or are dropped=• Barcas: Se colocan en el agua o se dejan caer +• Minecart: Are placed on rails or are dropped=• Carro de minas: Se colocan sobre rieles o se dejan caer = +• Bone meal: Is applied on the block it is facing=• Harina de hueso: Se aplica en el bloque que está enfrentando +• Empty buckets: Are used to collect a liquid source=• Cubos vacíos: Se utilizan para recolectar una fuente líquida +• Filled buckets: Are used to place a liquid source=• Cubos llenos: Se utilizan para colocar una fuente de líquido +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Cabezas, calabazas: Equipadas para jugadores y armaduras, o colocadas como un bloque +• Shulker boxes: Are placed as a block=• Cajas de Shulker: Se colocan como un bloque +• TNT: Is placed and ignited=• TNT: Se coloca y se enciende +• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Mechero: Se usa para encender un fuego en el aire y para encender TNT +• Spawn eggs: Will summon the mob they contain=• Huevos de desove: Convocarán al animal que contienen +• Other items: Are simply dropped=• Otros artículos: Simplemente se dejan caer +Downwards-Facing Dispenser=Dispensador orientado hacia abajo +Upwards-Facing Dispenser=Dispensador orientado hacia arriba +Inventory=Inventario diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.fr.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.fr.tr new file mode 100644 index 00000000..622d0a70 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.fr.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_dispensers +Dispenser=Dispenser +A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Un distributeur est un bloc qui agit comme un composant redstone qui, lorsqu'il est alimenté avec une puissance redstone, distribue un article. Il a un conteneur avec 9 emplacements d'inventaire. +Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Placez le distributeur dans l'une des 6 directions possibles. Le "trou" est l'endroit où les articles sortiront du distributeur. Utilisez le distributeur pour accéder à son inventaire. Insérez les articles que vous souhaitez distribuer. Fournissez au distributeur de l'énergie de redstone une fois pour distribuer un objet aléatoire. +The dispenser will do different things, depending on the dispensed item:=Le distributeur fera différentes choses, selon l'article distribué: +• Arrows: Are launched=• Flèches: Sont lancées +• Eggs and snowballs: Are thrown=• Oeufs et boules de neige: Sont jetés +• Fire charges: Are fired in a straight line=• Feu d'artifice: Sont tirés en ligne droite +• Armor: Will be equipped to players and armor stands=• Armure: Sera équipée pour les joueurs et les porte-armures +• Boats: Are placed on water or are dropped=• Bateaux: Sont placés sur l'eau ou sont lâchés +• Minecart: Are placed on rails or are dropped=• Minecart: Sont placés sur des rails ou sont lâchés +• Bone meal: Is applied on the block it is facing=• Farine d'os: Est appliquée sur le bloc auquel elle fait face +• Empty buckets: Are used to collect a liquid source=• Seaux vides: Sont utilisés pour collecter une source de liquide +• Filled buckets: Are used to place a liquid source=• Seaux remplis: Sont utilisés pour placer une source de liquide +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Têtes, citrouilles: Seront équipées pour les joueurs et les armures, ou placées en bloc +• Shulker boxes: Are placed as a block=• Boîtes de Shulker: Sont placées comme un bloc +• TNT: Is placed and ignited=• TNT: Est placé et allumé +• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Briquet: Sert à allumer un feu dans l'air et à allumer du TNT +• Spawn eggs: Will summon the mob they contain=• Silex et acier: Sert à allumer un feu dans l'air et à allumer du TNT +• Other items: Are simply dropped=• Autres articles: Sont simplement lâchés +Downwards-Facing Dispenser=Distributeur orienté vers le bas +Upwards-Facing Dispenser=Distributeur orienté vers le haut +Inventory=Inventaire +9 inventory slots=9 emplacements d'inventaire +Launches item when powered by redstone power=Lance un objet lorsqu'il est alimenté par la puissance Redstone diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt new file mode 100644 index 00000000..91129aac --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt @@ -0,0 +1,25 @@ +# textdomain: mcl_dispensers +Dispenser= +A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.= +Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.= +The dispenser will do different things, depending on the dispensed item:= +• Arrows: Are launched= +• Eggs and snowballs: Are thrown= +• Fire charges: Are fired in a straight line= +• Armor: Will be equipped to players and armor stands= +• Boats: Are placed on water or are dropped= +• Minecart: Are placed on rails or are dropped= +• Bone meal: Is applied on the block it is facing= +• Empty buckets: Are used to collect a liquid source= +• Filled buckets: Are used to place a liquid source= +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block= +• Shulker boxes: Are placed as a block= +• TNT: Is placed and ignited= +• Flint and steel: Is used to ignite a fire in air and to ignite TNT= +• Spawn eggs: Will summon the mob they contain= +• Other items: Are simply dropped= +Downwards-Facing Dispenser= +Upwards-Facing Dispenser= +Inventory= +9 inventory slots= +Launches item when powered by redstone power= diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_dispenser_front_horizontal.png b/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_dispenser_front_horizontal.png index bc1de75f..ca08f4f3 100644 Binary files a/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_dispenser_front_horizontal.png and b/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_dispenser_front_horizontal.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_dispenser_front_vertical.png b/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_dispenser_front_vertical.png index a366c78e..2b2328af 100644 Binary files a/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_dispenser_front_vertical.png and b/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_dispenser_front_vertical.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_fnt_dispenser.png b/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_fnt_dispenser.png deleted file mode 100644 index 9e46ca30..00000000 Binary files a/mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_fnt_dispenser.png and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt b/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt index 492dd653..cfd9772f 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt +++ b/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt @@ -1,4 +1,6 @@ mcl_init +mcl_formspec mesecons mcl_util doc? +screwdriver? diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index ec662253..715a85f3 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -8,16 +8,20 @@ All node definitions share a lot of code, so this is the reason why there are so many weird tables below. ]] +local S = minetest.get_translator("mcl_droppers") + -- For after_place_node local setup_dropper = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. - mcl_vars.inventory_header.. - "image[3,-0.2;5,0.75;mcl_droppers_fnt_dropper.png]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]".. "list[current_name;main;3,0.5;3,3;]".. + mcl_formspec.get_itemslot_bg(3,0.5,3,3).. "listring[current_name;main]".. "listring[current_player;main]" local meta = minetest.get_meta(pos) @@ -26,6 +30,25 @@ local setup_dropper = function(pos) inv:set_size("main", 9) end +local orientate_dropper = function(pos, placer) + -- Not placed by player + if not placer then return end + + -- Pitch in degrees + local pitch = placer:get_look_vertical() * (180 / math.pi) + + if pitch > 55 then + minetest.swap_node(pos, {name="mcl_droppers:dropper_up"}) + elseif pitch < -55 then + minetest.swap_node(pos, {name="mcl_droppers:dropper_down"}) + end +end + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple +end + -- Shared core definition table local dropperdef = { is_ground_content = false, @@ -44,7 +67,34 @@ local dropperdef = { end meta:from_table(meta2:to_table()) end, - _mcl_blast_resistance = 17.5, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, mesecons = {effector = { -- Drop random item when triggered @@ -89,27 +139,22 @@ local dropperdef = { inv:set_stack("main", stack_id, stack) end end - end - }} + end, + rules = mesecon.rules.alldirs, + }}, + on_rotate = on_rotate, } -- Horizontal dropper local horizontal_def = table.copy(dropperdef) -horizontal_def.description = "Dropper" -horizontal_def._doc_items_longdesc = "A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it." -horizontal_def._doc_items_usagehelp = "Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Rightclick the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item." +horizontal_def.description = S("Dropper") +horizontal_def._tt_help = S("9 inventory slots").."\n"..S("Drops item when powered by redstone power") +horizontal_def._doc_items_longdesc = S("A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.") +horizontal_def._doc_items_usagehelp = S("Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.") horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) setup_dropper(pos) - - -- When placed up and down, convert node to up/down dropper - if pointed_thing.above.y < pointed_thing.under.y then - minetest.swap_node(pos, {name = "mcl_droppers:dropper_down"}) - elseif pointed_thing.above.y > pointed_thing.under.y then - minetest.swap_node(pos, {name = "mcl_droppers:dropper_up"}) - end - - -- Else, the normal facedir logic applies + orientate_dropper(pos, placer) end horizontal_def.tiles = { "default_furnace_top.png", "default_furnace_bottom.png", @@ -123,7 +168,7 @@ minetest.register_node("mcl_droppers:dropper", horizontal_def) -- Down dropper local down_def = table.copy(dropperdef) -down_def.description = "Downwards-Facing Dropper" +down_def.description = S("Downwards-Facing Dropper") down_def.after_place_node = setup_dropper down_def.tiles = { "default_furnace_top.png", "mcl_droppers_dropper_front_vertical.png", @@ -138,7 +183,7 @@ minetest.register_node("mcl_droppers:dropper_down", down_def) -- Up dropper -- The up dropper is almost identical to the down dropper, it only differs in textures local up_def = table.copy(down_def) -up_def.description = "Upwards-Facing Dropper" +up_def.description = S("Upwards-Facing Dropper") up_def.tiles = { "mcl_droppers_dropper_front_vertical.png", "default_furnace_bottom.png", "default_furnace_side.png", "default_furnace_side.png", @@ -163,3 +208,14 @@ if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_down") doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_up") end + +-- Legacy +minetest.register_lbm({ + label = "Update dropper formspecs (0.60.0)", + name = "mcl_droppers:update_formspecs_0_60_0", + nodenames = { "mcl_droppers:dropper", "mcl_droppers:dropper_down", "mcl_droppers:dropper_up" }, + action = function(pos, node) + setup_dropper(pos) + minetest.log("action", "[mcl_droppers] Node formspec updated at "..minetest.pos_to_string(pos)) + end, +}) diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua new file mode 100644 index 00000000..1bf968a8 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua @@ -0,0 +1,218 @@ +--[[ This mod registers 3 nodes: +- One node for the horizontal-facing dropper (mcl_droppers:dropper) +- One node for the upwards-facing droppers (mcl_droppers:dropper_up) +- One node for the downwards-facing droppers (mcl_droppers:dropper_down) + +3 node definitions are needed because of the way the textures are defined. +All node definitions share a lot of code, so this is the reason why there +are so many weird tables below. +]] + +local S = minetest.get_translator("mcl_droppers") + +-- For after_place_node +local setup_dropper = function(pos) + -- Set formspec and inventory + local form = "size[9,8.75]".. + "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + "list[current_player;main;0,7.74;9,1;]".. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]".. + "list[current_name;main;3,0.5;3,3;]".. + "listring[current_name;main]".. + "listring[current_player;main]" + local meta = minetest.get_meta(pos) + meta:set_string("formspec", form) + local inv = meta:get_inventory() + inv:set_size("main", 9) +end + +local orientate_dropper = function(pos, placer) + -- Not placed by player + if not placer then return end + + -- Pitch in degrees + local pitch = placer:get_look_vertical() * (180 / math.pi) + + if pitch > 55 then + minetest.swap_node(pos, {name="mcl_droppers:dropper_up"}) + elseif pitch < -55 then + minetest.swap_node(pos, {name="mcl_droppers:dropper_down"}) + end +end + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple +end + +-- Shared core definition table +local dropperdef = { + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for i=1, inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + mesecons = {effector = { + -- Drop random item when triggered + action_on = function (pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local droppos + if node.name == "mcl_droppers:dropper" then + droppos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) + elseif node.name == "mcl_droppers:dropper_up" then + droppos = {x=pos.x, y=pos.y+1, z=pos.z} + elseif node.name == "mcl_droppers:dropper_down" then + droppos = {x=pos.x, y=pos.y-1, z=pos.z} + end + local dropnode = minetest.get_node(droppos) + -- Do not drop into solid nodes, unless they are containers + local dropnodedef = minetest.registered_nodes[dropnode.name] + if dropnodedef.walkable and not dropnodedef.groups.container then + return + end + local stacks = {} + for i=1,inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + table.insert(stacks, {stack = stack, stackpos = i}) + end + end + if #stacks >= 1 then + local r = math.random(1, #stacks) + local stack = stacks[r].stack + local dropitem = ItemStack(stack) + dropitem:set_count(1) + local stack_id = stacks[r].stackpos + + -- If it's a container, attempt to put it into the container + local dropped = mcl_util.move_item_container(pos, droppos, nil, stack_id) + -- No container? + if not dropped and not dropnodedef.groups.container then + -- Drop item normally + minetest.add_item(droppos, dropitem) + stack:take_item() + inv:set_stack("main", stack_id, stack) + end + end + end, + rules = mesecon.rules.alldirs, + }}, + on_rotate = on_rotate, +} + +-- Horizontal dropper + +local horizontal_def = table.copy(dropperdef) +horizontal_def.description = S("Dropper") +horizontal_def._doc_items_longdesc = S("A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.") +horizontal_def._doc_items_usagehelp = S("Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.") +horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) + setup_dropper(pos) + orientate_dropper(pos, placer) +end +horizontal_def.tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "mcl_droppers_dropper_front_horizontal.png" +} +horizontal_def.paramtype2 = "facedir" +horizontal_def.groups = {pickaxey=1, container=2, material_stone=1} + +minetest.register_node("mcl_droppers:dropper", horizontal_def) + +-- Down dropper +local down_def = table.copy(dropperdef) +down_def.description = S("Downwards-Facing Dropper") +down_def.after_place_node = setup_dropper +down_def.tiles = { + "default_furnace_top.png", "mcl_droppers_dropper_front_vertical.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_side.png" +} +down_def.groups = {pickaxey=1, container=2,not_in_creative_inventory=1, material_stone=1} +down_def._doc_items_create_entry = false +down_def.drop = "mcl_droppers:dropper" +minetest.register_node("mcl_droppers:dropper_down", down_def) + +-- Up dropper +-- The up dropper is almost identical to the down dropper, it only differs in textures +local up_def = table.copy(down_def) +up_def.description = S("Upwards-Facing Dropper") +up_def.tiles = { + "mcl_droppers_dropper_front_vertical.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_side.png" +} +minetest.register_node("mcl_droppers:dropper_up", up_def) + + + +-- Ladies and gentlemen, I present to you: the crafting recipe! +minetest.register_craft({ + output = 'mcl_droppers:dropper', + recipe = { + {"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",}, + {"mcl_core:cobble", "", "mcl_core:cobble",}, + {"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",}, + } +}) + +-- Add entry aliases for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_down") + doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_up") +end + +minetest.register_lbm({ + label = "Update dropper formspecs (0.51.0)", + name = "mcl_droppers:update_formspecs_0_51_0", + nodenames = { "mcl_droppers:dropper", "mcl_droppers:dropper_down", "mcl_droppers:dropper_up" }, + action = function(pos, node) + minetest.registered_nodes[node.name].on_construct(pos) + minetest.log("action", "[mcl_droppers] Node formspec updated at "..minetest.pos_to_string(pos)) + end, +}) + diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.de.tr b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.de.tr new file mode 100644 index 00000000..a4eb2eb0 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.de.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_droppers +Dropper=Spender +A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.=Ein Spender ist eine Redstonekomponente und ein Behälter mit 9 Inventarplätzen. Er wird, wenn mit Redstoneenergie versorgt, einen Gegenstand abwerfen oder in einen Behälter, auf den er zeigt, ablegen. +Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.=Spender können in 6 mögliche Richtungen platziert werden, Gegenstände fallen aus dem Loch hinaus. Benutzen Sie den Spender, um auf sein Inventar zuzugreifen. Versorgen Sie ihn mit Redstoneenergie, um den Spender einen Gegenstand abwerfen oder in einen Behälter ablegen zu lassen. +Downwards-Facing Dropper=Nach unten zeigender Spender +Upwards-Facing Dropper=Nach oben zeigender Spender +Inventory=Inventar +9 inventory slots=9 Inventarplätze +Drops item when powered by redstone power=Gibt einen Gegenstand aus, wenn mit Redstoneenergie versorgt diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.es.tr b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.es.tr new file mode 100644 index 00000000..8fd8104a --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.es.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_droppers +Dropper=Soltador +A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.=Un Soltador es un componente de redstone y un contenedor con 9 ranuras de inventario que, cuando se suministra con redstone power, deja caer un artículo o lo coloca en un contenedor frente a él. +Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.=Los soltadores se pueden colocar en 6 direcciones posibles, los artículos se sacarán del agujero. Usa el cuentagotas para acceder a su inventario. Proporcione energía de redstone una vez para hacer que el soltador caiga o transfiera un elemento aleatorio. +Downwards-Facing Dropper=Soltador orientado hacia abajo +Upwards-Facing Dropper=Soltador orientado hacia arriba +Inventory=Inventario diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.fr.tr b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.fr.tr new file mode 100644 index 00000000..137400d3 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.fr.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_droppers +Dropper=Dropper +A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.=Un dropper est un composant redstone et un conteneur avec 9 emplacements d'inventaire qui, lorsqu'ils sont alimentés en puissance redstone, déposent un objet ou le placent dans un conteneur en face de lui. +Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.=Les droppers peuvent être placés dans 6 directions possibles, les objets seront déposés hors du trou. Utilisez le dropper pour accéder à son inventaire. Fournissez-lui de l'énergie redstone pour faire tomber un élement ou transférer un élément aléatoire. +Downwards-Facing Dropper=Dropper orienté vers le bas +Upwards-Facing Dropper=Dropper orienté vers le haut +Inventory=Inventaire +9 inventory slots=9 emplacements d'inventaire +Drops item when powered by redstone power=Obtient un objet lorsqu'il est alimenté par la puissance Redstone diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt new file mode 100644 index 00000000..24b2bc10 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: mcl_droppers +Dropper= +A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.= +Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.= +Downwards-Facing Dropper= +Upwards-Facing Dropper= +Inventory= +9 inventory slots= +Drops item when powered by redstone power= diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_dropper_front_horizontal.png b/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_dropper_front_horizontal.png index 59c92346..e247e92c 100644 Binary files a/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_dropper_front_horizontal.png and b/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_dropper_front_horizontal.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_dropper_front_vertical.png b/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_dropper_front_vertical.png index f0b5db98..37bc9fa2 100644 Binary files a/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_dropper_front_vertical.png and b/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_dropper_front_vertical.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_fnt_dropper.png b/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_fnt_dropper.png deleted file mode 100644 index 1a15634f..00000000 Binary files a/mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_fnt_dropper.png and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mcl_observers/init.lua b/mods/ITEMS/REDSTONE/mcl_observers/init.lua index bd04aa3f..885e8599 100644 --- a/mods/ITEMS/REDSTONE/mcl_observers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_observers/init.lua @@ -1,38 +1,252 @@ -minetest.register_node("mcl_observers:observer", { - description = "Observer", +local S = minetest.get_translator("mcl_observers") + +local rules_flat = { + { x = 0, y = 0, z = -1, spread = true }, +} +local get_rules_flat = function(node) + local rules = rules_flat + for i=1, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + return rules +end + +local rules_down = {{ x = 0, y = 1, z = 0, spread = true }} +local rules_up = {{ x = 0, y = -1, z = 0, spread = true }} + +-- Scan the node in front of the observer +-- and update the observer state if needed. +-- TODO: Also scan metadata changes. +-- TODO: Ignore some node changes. +local observer_scan = function(pos, initialize) + local node = minetest.get_node(pos) + local front + if node.name == "mcl_observers:observer_up_off" or node.name == "mcl_observers:observer_up_on" then + front = vector.add(pos, {x=0, y=1, z=0}) + elseif node.name == "mcl_observers:observer_down_off" or node.name == "mcl_observers:observer_down_on" then + front = vector.add(pos, {x=0, y=-1, z=0}) + else + front = vector.add(pos, minetest.facedir_to_dir(node.param2)) + end + local frontnode = minetest.get_node(front) + local meta = minetest.get_meta(pos) + local oldnode = meta:get_string("node_name") + local oldparam2 = meta:get_string("node_param2") + local meta_needs_updating = false + if oldnode ~= "" and not initialize then + if not (frontnode.name == oldnode and frontnode.param2) then + -- Node state changed! Activate observer + if node.name == "mcl_observers:observer_off" then + minetest.set_node(pos, {name = "mcl_observers:observer_on", param2 = node.param2}) + mesecon.receptor_on(pos, get_rules_flat(node)) + elseif node.name == "mcl_observers:observer_down_off" then + minetest.set_node(pos, {name = "mcl_observers:observer_down_on"}) + mesecon.receptor_on(pos, rules_down) + elseif node.name == "mcl_observers:observer_up_off" then + minetest.set_node(pos, {name = "mcl_observers:observer_up_on"}) + mesecon.receptor_on(pos, rules_up) + end + meta_needs_updating = true + end + else + meta_needs_updating = true + end + if meta_needs_updating then + meta:set_string("node_name", frontnode.name) + meta:set_string("node_param2", frontnode.param2) + end + return frontnode +end + +-- Vertical orientation (CURRENTLY DISABLED) +local observer_orientate = function(pos, placer) + -- Not placed by player + if not placer then return end + + -- Placer pitch in degrees + local pitch = placer:get_look_vertical() * (180 / math.pi) + + local node = minetest.get_node(pos) + if pitch > 55 then -- player looking upwards + -- Observer looking downwards + minetest.set_node(pos, {name="mcl_observers:observer_down_off"}) + elseif pitch < -55 then -- player looking downwards + -- Observer looking upwards + minetest.set_node(pos, {name="mcl_observers:observer_up_off"}) + end +end + +mesecon.register_node("mcl_observers:observer", +{ is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), paramtype2 = "facedir", - -- TODO: Add to craft guide and creative inventory when it's useful - groups = {pickaxey=1, not_in_craft_guide=1, not_in_creative_inventory=1 }, + on_rotate = false, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, +}, +{ + description = S("Observer"), + _tt_help = S("Emits redstone pulse when block in front changes"), + _doc_items_longdesc = S("An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes."), + _doc_items_usagehelp = S("Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here."), + + groups = {pickaxey=1, material_stone=1, not_opaque=1, }, tiles = { - "mcl_observers_observer_top.png", "default_furnace_bottom.png", + "mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png", "mcl_observers_observer_side.png", "mcl_observers_observer_side.png", "mcl_observers_observer_front.png", "mcl_observers_observer_back.png", }, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for i=1, inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2:to_table()) + mesecons = { receptor = { + state = mesecon.state.off, + rules = get_rules_flat, + }}, + on_construct = function(pos) + observer_scan(pos, true) end, - _mcl_blast_resistance = 17.5, + after_place_node = observer_orientate, +}, +{ + _doc_items_create_entry = false, + groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 }, + tiles = { + "mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png", + "mcl_observers_observer_side.png", "mcl_observers_observer_side.png", + "mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png", + }, + mesecons = { receptor = { + state = mesecon.state.on, + rules = get_rules_flat, + }}, + + -- VERY quickly disable observer after construction + on_construct = function(pos) + local timer = minetest.get_node_timer(pos) + -- 1 redstone tick = 0.1 seconds + timer:start(0.1) + end, + on_timer = function(pos, elapsed) + local node = minetest.get_node(pos) + minetest.set_node(pos, {name = "mcl_observers:observer_off", param2 = node.param2}) + mesecon.receptor_off(pos, get_rules_flat(node)) + end, +} +) + +mesecon.register_node("mcl_observers:observer_down", +{ + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 }, + on_rotate = false, + _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, - -- TODO: Mesecons handling - mesecons = {effector = { - }} + drop = "mcl_observers:observer_off", +}, +{ + tiles = { + "mcl_observers_observer_back.png", "mcl_observers_observer_front.png", + "mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90", + "mcl_observers_observer_top.png", "mcl_observers_observer_top.png", + }, + mesecons = { receptor = { + state = mesecon.state.off, + rules = rules_down, + }}, + on_construct = function(pos) + observer_scan(pos, true) + end, +}, +{ + _doc_items_create_entry = false, + tiles = { + "mcl_observers_observer_back_lit.png", "mcl_observers_observer_front.png", + "mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90", + "mcl_observers_observer_top.png", "mcl_observers_observer_top.png", + }, + mesecons = { receptor = { + state = mesecon.state.on, + rules = rules_down, + }}, + + -- VERY quickly disable observer after construction + on_construct = function(pos) + local timer = minetest.get_node_timer(pos) + -- 1 redstone tick = 0.1 seconds + timer:start(0.1) + end, + on_timer = function(pos, elapsed) + local node = minetest.get_node(pos) + minetest.set_node(pos, {name = "mcl_observers:observer_down_off", param2 = node.param2}) + mesecon.receptor_off(pos, rules_down) + end, }) +mesecon.register_node("mcl_observers:observer_up", +{ + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 }, + on_rotate = false, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + drop = "mcl_observers:observer_off", +}, +{ + tiles = { + "mcl_observers_observer_front.png", "mcl_observers_observer_back.png", + "mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270", + "mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180", + }, + mesecons = { receptor = { + state = mesecon.state.off, + rules = rules_up, + }}, + on_construct = function(pos) + observer_scan(pos, true) + end, +}, +{ + _doc_items_create_entry = false, + tiles = { + "mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png", + "mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270", + "mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180", + }, + mesecons = { receptor = { + state = mesecon.state.on, + rules = rules_up, + }}, + + -- VERY quickly disable observer after construction + on_construct = function(pos) + local timer = minetest.get_node_timer(pos) + -- 1 redstone tick = 0.1 seconds + timer:start(0.1) + end, + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "mcl_observers:observer_up_off"}) + mesecon.receptor_off(pos, rules_up) + end, +}) + + + + +-- Regularily check the observer nodes. +-- TODO: This is rather slow and clunky. Find a more efficient way to do this. +minetest.register_abm({ + nodenames = {"mcl_observers:observer_off", "mcl_observers:observer_down_off", "mcl_observers:observer_up_off"}, + interval = 1, + chance = 1, + action = function(pos, node) + observer_scan(pos) + end, +}) + + minetest.register_craft({ - output = "mcl_observers:observer", + output = "mcl_observers:observer_off", recipe = { { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, { "mcl_nether:quartz", "mesecons:redstone", "mesecons:redstone" }, @@ -40,7 +254,7 @@ minetest.register_craft({ } }) minetest.register_craft({ - output = "mcl_observers:observer", + output = "mcl_observers:observer_off", recipe = { { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, { "mesecons:redstone", "mesecons:redstone", "mcl_nether:quartz" }, diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.de.tr b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.de.tr new file mode 100644 index 00000000..3ce085ad --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_observers +Observer=Wächter +An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.=Ein Wächter ist eine Redstonekomponente, die den Block vor ihm beobachtet und einen sehr kurzen Redstoneimpuls sendet, wenn sich dieser Block ändert. +Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.=Platzieren Sie den Wächter direkt vor dem Block, den Sie beobachten wollen, so dass das „Gesicht“ zum Block schaut. Der Pfeil zeigt auf die Seite des Signalausgangs, der sich gegenüber vom „Gesicht“ befindet. Hier können Sie Ihren Restonestaub oder eine beliebige andere Komponente platzieren. +Emits redstone pulse when block in front changes=Macht einen Redstonepuls, wenn der Block vor ihm sich ändert diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.es.tr b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.es.tr new file mode 100644 index 00000000..146b72b8 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.es.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_observers +Observer=Observador +An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.=Un observador es un componente de redstone que observa el bloque frente a él y envía un pulso muy corto de redstone cada vez que este bloque cambia. +Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.=Coloque el observador directamente en frente del bloque que desea observar con la "cara" mirando el bloque. La flecha apunta al lado de la salida, que está en el lado opuesto de la "cara". Puede colocar su polvo de redstone o cualquier otro componente aquí. diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.fr.tr b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.fr.tr new file mode 100644 index 00000000..3295335a --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_observers +Observer=Observateur +An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.=Un observateur est un composant de redstone qui observe le bloc en face de lui et envoie une impulsion de redstone très courte chaque fois que ce bloc change. +Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.=Placez l'observateur directement devant le bloc que vous souhaitez observer avec le "visage" regardant le bloc. La flèche pointe vers le côté de la sortie, qui est du côté opposé du "visage". Vous pouvez placer votre poussière de redstone ou tout autre composant ici. +Emits redstone pulse when block in front changes=Émet une impulsion de redstone lorsque le bloc à l'avant change diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt new file mode 100644 index 00000000..7f599150 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_observers +Observer= +An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.= +Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.= +Emits redstone pulse when block in front changes= diff --git a/mods/ITEMS/REDSTONE/mesecons/VERSION b/mods/ITEMS/REDSTONE/mesecons/VERSION deleted file mode 100644 index 75b9e034..00000000 --- a/mods/ITEMS/REDSTONE/mesecons/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.41 DEV diff --git a/mods/ITEMS/REDSTONE/mesecons/actionqueue.lua b/mods/ITEMS/REDSTONE/mesecons/actionqueue.lua new file mode 100644 index 00000000..f3479ce5 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons/actionqueue.lua @@ -0,0 +1,105 @@ +mesecon.queue.actions={} -- contains all ActionQueue actions + +function mesecon.queue:add_function(name, func) + mesecon.queue.funcs[name] = func +end + +-- If add_action with twice the same overwritecheck and same position are called, the first one is overwritten +-- use overwritecheck nil to never overwrite, but just add the event to the queue +-- priority specifies the order actions are executed within one globalstep, highest first +-- should be between 0 and 1 +function mesecon.queue:add_action(pos, func, params, time, overwritecheck, priority) + -- Create Action Table: + time = time or 0 -- time <= 0 --> execute, time > 0 --> wait time until execution + priority = priority or 1 + local action = { pos=mesecon.tablecopy(pos), + func=func, + params=mesecon.tablecopy(params or {}), + time=time, + owcheck=(overwritecheck and mesecon.tablecopy(overwritecheck)) or nil, + priority=priority} + + local toremove = nil + -- Otherwise, add the action to the queue + if overwritecheck then -- check if old action has to be overwritten / removed: + for i, ac in ipairs(mesecon.queue.actions) do + if(vector.equals(pos, ac.pos) + and mesecon.cmpAny(overwritecheck, ac.owcheck)) then + toremove = i + break + end + end + end + + if (toremove ~= nil) then + table.remove(mesecon.queue.actions, toremove) + end + + table.insert(mesecon.queue.actions, action) +end + +-- execute the stored functions on a globalstep +-- if however, the pos of a function is not loaded (get_node_or_nil == nil), do NOT execute the function +-- this makes sure that resuming mesecons circuits when restarting minetest works fine +-- However, even that does not work in some cases, that's why we delay the time the globalsteps +-- start to be execute by 5 seconds +local get_highest_priority = function (actions) + local highestp = -1 + local highesti + for i, ac in ipairs(actions) do + if ac.priority > highestp then + highestp = ac.priority + highesti = i + end + end + + return highesti +end + +local m_time = 0 +local resumetime = mesecon.setting("resumetime", 4) +minetest.register_globalstep(function (dtime) + m_time = m_time + dtime + -- don't even try if server has not been running for XY seconds; resumetime = time to wait + -- after starting the server before processing the ActionQueue, don't set this too low + if (m_time < resumetime) then return end + local actions = mesecon.tablecopy(mesecon.queue.actions) + local actions_now={} + + mesecon.queue.actions = {} + + -- sort actions into two categories: + -- those toexecute now (actions_now) and those to execute later (mesecon.queue.actions) + for i, ac in ipairs(actions) do + if ac.time > 0 then + ac.time = ac.time - dtime -- executed later + table.insert(mesecon.queue.actions, ac) + else + table.insert(actions_now, ac) + end + end + + while(#actions_now > 0) do -- execute highest priorities first, until all are executed + local hp = get_highest_priority(actions_now) + mesecon.queue:execute(actions_now[hp]) + table.remove(actions_now, hp) + end +end) + +function mesecon.queue:execute(action) + -- ignore if action queue function name doesn't exist, + -- (e.g. in case the action queue savegame was written by an old mesecons version) + if mesecon.queue.funcs[action.func] then + mesecon.queue.funcs[action.func](action.pos, unpack(action.params)) + end +end + + +-- Store and read the ActionQueue to / from a file +-- so that upcoming actions are remembered when the game +-- is restarted +mesecon.queue.actions = mesecon.file2table("mesecon_actionqueue") + +minetest.register_on_shutdown(function() + mesecon.table2file("mesecon_actionqueue", mesecon.queue.actions) +end) diff --git a/mods/ITEMS/REDSTONE/mesecons/init.lua b/mods/ITEMS/REDSTONE/mesecons/init.lua index d6677598..93d299f0 100644 --- a/mods/ITEMS/REDSTONE/mesecons/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons/init.lua @@ -3,7 +3,7 @@ -- | \/ | |___ ____ |___ | | | | \ | |____ -- | | | | | | | | | \ | | -- | | |___ ____| |___ |____ |____| | \| ____| --- by Jeija, Uberi (Temperest), sfan5, VanessaE +-- by Jeija, Uberi (Temperest), sfan5, VanessaE, Hawk777 and contributors -- -- -- @@ -11,7 +11,7 @@ -- See the documentation on the forum for additional information, especially about crafting -- -- --- For developer documentation see the Developers' section on mesecons.TK +-- For basic development resources, see http://mesecons.net/developers.html -- -- -- @@ -30,7 +30,7 @@ -- action_change = function -- rules = rules/get_rules -- }, --- conductor = +-- conductor = -- { -- state = mesecon.state.on/off -- offstate = opposite state (for state = on only) @@ -39,28 +39,26 @@ -- } --} -local init = os.clock() -- PUBLIC VARIABLES mesecon={} -- contains all functions and all global variables -mesecon.actions_on={} -- Saves registered function callbacks for mesecon on | DEPRECATED -mesecon.actions_off={} -- Saves registered function callbacks for mesecon off | DEPRECATED -mesecon.actions_change={} -- Saves registered function callbacks for mesecon change | DEPRECATED -mesecon.receptors={} -- saves all information about receptors | DEPRECATED -mesecon.effectors={} -- saves all information about effectors | DEPRECATED -mesecon.conductors={} -- saves all information about conductors | DEPRECATED +mesecon.queue={} -- contains the ActionQueue +mesecon.queue.funcs={} -- contains all ActionQueue functions -- Settings dofile(minetest.get_modpath("mesecons").."/settings.lua") --- Presets (eg default rules) -dofile(minetest.get_modpath("mesecons").."/presets.lua"); - - -- Utilities like comparing positions, -- adding positions and rules, -- mostly things that make the source look cleaner dofile(minetest.get_modpath("mesecons").."/util.lua"); +-- Presets (eg default rules) +dofile(minetest.get_modpath("mesecons").."/presets.lua"); + +-- The ActionQueue +-- Saves all the actions that have to be execute in the future +dofile(minetest.get_modpath("mesecons").."/actionqueue.lua"); + -- Internal stuff -- This is the most important file -- it handles signal transmission and basically everything else @@ -68,47 +66,56 @@ dofile(minetest.get_modpath("mesecons").."/util.lua"); -- like calling action_on/off/change dofile(minetest.get_modpath("mesecons").."/internal.lua"); --- Deprecated stuff --- To be removed in future releases --- Currently there is nothing here -dofile(minetest.get_modpath("mesecons").."/legacy.lua"); - -- API -- these are the only functions you need to remember -function mesecon:receptor_on(pos, rules) +mesecon.queue:add_function("receptor_on", function (pos, rules) + mesecon.vm_begin() + rules = rules or mesecon.rules.default - for _, rule in ipairs(rules) do - local np = mesecon:addPosRule(pos, rule) - local link, rulename = mesecon:rules_link(pos, np, rules) - if link then - mesecon:turnon(np, rulename) + -- Call turnon on all linking positions + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local np = vector.add(pos, rule) + local rulenames = mesecon.rules_link_rule_all(pos, rule) + for _, rulename in ipairs(rulenames) do + mesecon.turnon(np, rulename) end end + + mesecon.vm_commit() +end) + +function mesecon.receptor_on(pos, rules) + mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules) end -function mesecon:receptor_off(pos, rules) +mesecon.queue:add_function("receptor_off", function (pos, rules) rules = rules or mesecon.rules.default - for _, rule in ipairs(rules) do - local np = mesecon:addPosRule(pos, rule) - local link, rulename = mesecon:rules_link(pos, np, rules) - if link then - if not mesecon:connected_to_receptor(np) then - mesecon:turnoff(np, rulename) + -- Call turnoff on all linking positions + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local np = vector.add(pos, rule) + local rulenames = mesecon.rules_link_rule_all(pos, rule) + for _, rulename in ipairs(rulenames) do + mesecon.vm_begin() + mesecon.changesignal(np, minetest.get_node(np), rulename, mesecon.state.off, 2) + + -- Turnoff returns true if turnoff process was successful, no onstate receptor + -- was found along the way. Commit changes that were made in voxelmanip. If turnoff + -- returns true, an onstate receptor was found, abort voxelmanip transaction. + if (mesecon.turnoff(np, rulename)) then + mesecon.vm_commit() else - mesecon:changesignal(np, minetest.get_node(np), rulename, mesecon.state.off) + mesecon.vm_abort() end end end -end +end) ---The actual wires -dofile(minetest.get_modpath("mesecons").."/wires.lua"); +function mesecon.receptor_off(pos, rules) + mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules) +end --Services like turnoff receptor on dignode and so on dofile(minetest.get_modpath("mesecons").."/services.lua"); - -local time_to_load= os.clock() - init -print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load)) diff --git a/mods/ITEMS/REDSTONE/mesecons/internal.lua b/mods/ITEMS/REDSTONE/mesecons/internal.lua index e0c6a6b6..7986c290 100644 --- a/mods/ITEMS/REDSTONE/mesecons/internal.lua +++ b/mods/ITEMS/REDSTONE/mesecons/internal.lua @@ -1,62 +1,54 @@ -- Internal.lua - The core of mesecons -- --- For more practical developer resources see mesecons.tk +-- For more practical developer resources see http://mesecons.net/developers.php -- -- Function overview --- mesecon:get_effector(nodename) --> Returns the mesecons.effector -specifictation in the nodedef by the nodename --- mesecon:get_receptor(nodename) --> Returns the mesecons.receptor -specifictation in the nodedef by the nodename --- mesecon:get_conductor(nodename) --> Returns the mesecons.conductor-specifictation in the nodedef by the nodename --- mesecon:get_any_inputrules (node) --> Returns the rules of a node if it is a conductor or an effector --- mesecon:get_any_outputrules (node) --> Returns the rules of a node if it is a conductor or a receptor +-- mesecon.get_effector(nodename) --> Returns the mesecons.effector -specifictation in the nodedef by the nodename +-- mesecon.get_receptor(nodename) --> Returns the mesecons.receptor -specifictation in the nodedef by the nodename +-- mesecon.get_conductor(nodename) --> Returns the mesecons.conductor-specifictation in the nodedef by the nodename +-- mesecon.get_any_inputrules (node) --> Returns the rules of a node if it is a conductor or an effector +-- mesecon.get_any_outputrules (node) --> Returns the rules of a node if it is a conductor or a receptor -- RECEPTORS --- mesecon:is_receptor(nodename) --> Returns true if nodename is a receptor --- mesecon:is_receptor_on(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.on --- mesecon:is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off --- mesecon:receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified) +-- mesecon.is_receptor(nodename) --> Returns true if nodename is a receptor +-- mesecon.is_receptor_on(nodename --> Returns true if nodename is an receptor with state = mesecon.state.on +-- mesecon.is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off +-- mesecon.receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified) -- EFFECTORS --- mesecon:is_effector(nodename) --> Returns true if nodename is an effector --- mesecon:is_effector_on(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_off --- mesecon:is_effector_off(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_on --- mesecon:effector_get_rules(node) --> Returns the input rules of the effector (mesecon.rules.default if none specified) +-- mesecon.is_effector(nodename) --> Returns true if nodename is an effector +-- mesecon.is_effector_on(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_off +-- mesecon.is_effector_off(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_on +-- mesecon.effector_get_rules(node) --> Returns the input rules of the effector (mesecon.rules.default if none specified) -- SIGNALS --- mesecon:activate(pos, node) --> Activates the effector node at the specific pos (calls nodedef.mesecons.effector.action_on) --- mesecon:deactivate(pos, node) --> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off) --- mesecon:changesignal(pos, node, rulename, newstate) --> Changes the effector node at the specific pos (calls nodedef.mesecons.effector.action_change) - --- RULES --- mesecon:add_rules(name, rules) | deprecated? --> Saves rules table by name --- mesecon:get_rules(name, rules) | deprecated? --> Loads rules table with name +-- mesecon.activate(pos, node, depth) --> Activates the effector node at the specific pos (calls nodedef.mesecons.effector.action_on), higher depths are executed later +-- mesecon.deactivate(pos, node, depth) --> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off), higher depths are executed later +-- mesecon.changesignal(pos, node, rulename, newstate, depth) --> Changes the effector node at the specific pos (calls nodedef.mesecons.effector.action_change), higher depths are executed later -- CONDUCTORS --- mesecon:is_conductor(nodename) --> Returns true if nodename is a conductor --- mesecon:is_conductor_on(nodename) --> Returns true if nodename is a conductor with state = mesecon.state.on --- mesecon:is_conductor_off(nodename) --> Returns true if nodename is a conductor with state = mesecon.state.off --- mesecon:get_conductor_on(offstate) --> Returns the onstate nodename of the conductor with the name offstate --- mesecon:get_conductor_off(onstate) --> Returns the offstate nodename of the conductor with the name onstate --- mesecon:conductor_get_rules(node) --> Returns the input+output rules of a conductor (mesecon.rules.default if none specified) +-- mesecon.is_conductor(nodename) --> Returns true if nodename is a conductor +-- mesecon.is_conductor_on(node --> Returns true if node is a conductor with state = mesecon.state.on +-- mesecon.is_conductor_off(node) --> Returns true if node is a conductor with state = mesecon.state.off +-- mesecon.get_conductor_on(node_off) --> Returns the onstate nodename of the conductor +-- mesecon.get_conductor_off(node_on) --> Returns the offstate nodename of the conductor +-- mesecon.conductor_get_rules(node) --> Returns the input+output rules of a conductor (mesecon.rules.default if none specified) -- HIGH-LEVEL Internals --- mesecon:is_power_on(pos) --> Returns true if pos emits power in any way --- mesecon:is_power_off(pos) --> Returns true if pos does not emit power in any way --- mesecon:turnon(pos, rulename) --> Returns true whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnon --- mesecon:turnoff(pos, rulename) --> Turns off whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnoff --- mesecon:connected_to_receptor(pos) --> Returns true if pos is connected to a receptor directly or via conductors; calls itself if pos is a conductor --> recursive --- mesecon:rules_link(output, input, dug_outputrules) --> Returns true if outputposition + outputrules = inputposition and inputposition + inputrules = outputposition (if the two positions connect) --- mesecon:rules_link_anydir(outp., inp., d_outpr.) --> Same as rules mesecon:rules_link but also returns true if output and input are swapped --- mesecon:is_powered(pos) --> Returns true if pos is powered by a receptor or a conductor +-- mesecon.is_power_on(pos) --> Returns true if pos emits power in any way +-- mesecon.is_power_off(pos) --> Returns true if pos does not emit power in any way +-- mesecon.is_powered(pos) --> Returns bool, spread. bool is true if pos is powered by a receptor, a conductor or an opaque block. + -- spread is true if it is powered AND also transmits its power one block further. --- RULES ROTATION helpsers --- mesecon:rotate_rules_right(rules) --- mesecon:rotate_rules_left(rules) --- mesecon:rotate_rules_up(rules) --- mesecon:rotate_rules_down(rules) +-- RULES ROTATION helpers +-- mesecon.rotate_rules_right(rules) +-- mesecon.rotate_rules_left(rules) +-- mesecon.rotate_rules_up(rules) +-- mesecon.rotate_rules_down(rules) -- These functions return rules that have been rotated in the specific direction -- General -function mesecon:get_effector(nodename) +function mesecon.get_effector(nodename) if minetest.registered_nodes[nodename] and minetest.registered_nodes[nodename].mesecons and minetest.registered_nodes[nodename].mesecons.effector then @@ -64,7 +56,7 @@ function mesecon:get_effector(nodename) end end -function mesecon:get_receptor(nodename) +function mesecon.get_receptor(nodename) if minetest.registered_nodes[nodename] and minetest.registered_nodes[nodename].mesecons and minetest.registered_nodes[nodename].mesecons.receptor then @@ -72,7 +64,7 @@ function mesecon:get_receptor(nodename) end end -function mesecon:get_conductor(nodename) +function mesecon.get_conductor(nodename) if minetest.registered_nodes[nodename] and minetest.registered_nodes[nodename].mesecons and minetest.registered_nodes[nodename].mesecons.conductor then @@ -80,52 +72,63 @@ function mesecon:get_conductor(nodename) end end -function mesecon:get_any_outputrules (node) - if mesecon:is_conductor(node.name) then - return mesecon:conductor_get_rules(node) - elseif mesecon:is_receptor(node.name) then - return mesecon:receptor_get_rules(node) +function mesecon.get_any_outputrules(node) + if not node then return nil end + + if mesecon.is_conductor(node.name) then + return mesecon.conductor_get_rules(node) + elseif mesecon.is_receptor(node.name) then + return mesecon.receptor_get_rules(node) + elseif minetest.get_item_group(node.name, "opaque") == 1 then + return mesecon.rules.alldirs end - return false end -function mesecon:get_any_inputrules (node) - if mesecon:is_conductor(node.name) then - return mesecon:conductor_get_rules(node) - elseif mesecon:is_effector(node.name) then - return mesecon:effector_get_rules(node) +function mesecon.get_any_inputrules(node) + if not node then return nil end + + if mesecon.is_conductor(node.name) then + return mesecon.conductor_get_rules(node) + elseif mesecon.is_effector(node.name) then + return mesecon.effector_get_rules(node) + elseif minetest.get_item_group(node.name, "opaque") == 1 then + return mesecon.rules.alldirs end - return false +end + +function mesecon.get_any_rules(node) + return mesecon.mergetable(mesecon.get_any_inputrules(node) or {}, + mesecon.get_any_outputrules(node) or {}) end -- Receptors -- Nodes that can power mesecons -function mesecon:is_receptor_on(nodename) - local receptor = mesecon:get_receptor(nodename) +function mesecon.is_receptor_on(nodename) + local receptor = mesecon.get_receptor(nodename) if receptor and receptor.state == mesecon.state.on then return true end return false end -function mesecon:is_receptor_off(nodename) - local receptor = mesecon:get_receptor(nodename) +function mesecon.is_receptor_off(nodename) + local receptor = mesecon.get_receptor(nodename) if receptor and receptor.state == mesecon.state.off then return true end return false end -function mesecon:is_receptor(nodename) - local receptor = mesecon:get_receptor(nodename) +function mesecon.is_receptor(nodename) + local receptor = mesecon.get_receptor(nodename) if receptor then return true end return false end -function mesecon:receptor_get_rules(node) - local receptor = mesecon:get_receptor(node.name) +function mesecon.receptor_get_rules(node) + local receptor = mesecon.get_receptor(node.name) if receptor then local rules = receptor.rules if type(rules) == 'function' then @@ -140,32 +143,32 @@ end -- Effectors -- Nodes that can be powered by mesecons -function mesecon:is_effector_on(nodename) - local effector = mesecon:get_effector(nodename) +function mesecon.is_effector_on(nodename) + local effector = mesecon.get_effector(nodename) if effector and effector.action_off then return true end return false end -function mesecon:is_effector_off(nodename) - local effector = mesecon:get_effector(nodename) +function mesecon.is_effector_off(nodename) + local effector = mesecon.get_effector(nodename) if effector and effector.action_on then return true end return false end -function mesecon:is_effector(nodename) - local effector = mesecon:get_effector(nodename) +function mesecon.is_effector(nodename) + local effector = mesecon.get_effector(nodename) if effector then return true end return false end -function mesecon:effector_get_rules(node) - local effector = mesecon:get_effector(node.name) +function mesecon.effector_get_rules(node) + local effector = mesecon.get_effector(node.name) if effector then local rules = effector.rules if type(rules) == 'function' then @@ -177,83 +180,168 @@ function mesecon:effector_get_rules(node) return mesecon.rules.default end ---Signals +-- ####################### +-- # Signals (effectors) # +-- ####################### + +-- Activation: +mesecon.queue:add_function("activate", function (pos, rulename) + local node = mesecon.get_node_force(pos) + if not node then return end + + local effector = mesecon.get_effector(node.name) -function mesecon:activate(pos, node, rulename) - local effector = mesecon:get_effector(node.name) if effector and effector.action_on then - effector.action_on (pos, node, rulename) + effector.action_on(pos, node, rulename) end +end) + +function mesecon.activate(pos, node, rulename, depth) + if rulename == nil then + for _,rule in ipairs(mesecon.effector_get_rules(node)) do + mesecon.activate(pos, node, rule, depth + 1) + end + return + end + mesecon.queue:add_action(pos, "activate", {rulename}, nil, rulename, 1 / depth) end -function mesecon:deactivate(pos, node, rulename) - local effector = mesecon:get_effector(node.name) + +-- Deactivation +mesecon.queue:add_function("deactivate", function (pos, rulename) + local node = mesecon.get_node_force(pos) + if not node then return end + + local effector = mesecon.get_effector(node.name) + if effector and effector.action_off then - effector.action_off (pos, node, rulename) + effector.action_off(pos, node, rulename) end +end) + +function mesecon.deactivate(pos, node, rulename, depth) + if rulename == nil then + for _,rule in ipairs(mesecon.effector_get_rules(node)) do + mesecon.deactivate(pos, node, rule, depth + 1) + end + return + end + mesecon.queue:add_action(pos, "deactivate", {rulename}, nil, rulename, 1 / depth) end -function mesecon:changesignal(pos, node, rulename, newstate) - local effector = mesecon:get_effector(node.name) + +-- Change +mesecon.queue:add_function("change", function (pos, rulename, changetype) + local node = mesecon.get_node_force(pos) + if not node then return end + + local effector = mesecon.get_effector(node.name) + if effector and effector.action_change then - effector.action_change (pos, node, rulename, newstate) + effector.action_change(pos, node, rulename, changetype) end -end +end) ---Rules +function mesecon.changesignal(pos, node, rulename, newstate, depth) + if rulename == nil then + for _,rule in ipairs(mesecon.effector_get_rules(node)) do + mesecon.changesignal(pos, node, rule, newstate, depth + 1) + end + return + end -function mesecon:add_rules(name, rules) - mesecon.rules[name] = rules -end - -function mesecon:get_rules(name) - return mesecon.rules[name] + -- Include "change" in overwritecheck so that it cannot be overwritten + -- by "active" / "deactivate" that will be called upon the node at the same time. + local overwritecheck = {"change", rulename} + mesecon.queue:add_action(pos, "change", {rulename, newstate}, nil, overwritecheck, 1 / depth) end -- Conductors -function mesecon:is_conductor_on(nodename) - local conductor = mesecon:get_conductor(nodename) - if conductor and conductor.state == mesecon.state.on then - return true +function mesecon.is_conductor_on(node, rulename) + if not node then return false end + + local conductor = mesecon.get_conductor(node.name) + if conductor then + if conductor.state then + return conductor.state == mesecon.state.on + end + if conductor.states then + if not rulename then + return mesecon.getstate(node.name, conductor.states) ~= 1 + end + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node)) + local binstate = mesecon.getbinstate(node.name, conductor.states) + return mesecon.get_bit(binstate, bit) + end end + return false end -function mesecon:is_conductor_off(nodename) - local conductor = mesecon:get_conductor(nodename) - if conductor and conductor.state == mesecon.state.off then - return true +function mesecon.is_conductor_off(node, rulename) + if not node then return false end + + local conductor = mesecon.get_conductor(node.name) + if conductor then + if conductor.state then + return conductor.state == mesecon.state.off + end + if conductor.states then + if not rulename then + return mesecon.getstate(node.name, conductor.states) == 1 + end + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node)) + local binstate = mesecon.getbinstate(node.name, conductor.states) + return not mesecon.get_bit(binstate, bit) + end end + return false end -function mesecon:is_conductor(nodename) - local conductor = mesecon:get_conductor(nodename) +function mesecon.is_conductor(nodename) + local conductor = mesecon.get_conductor(nodename) if conductor then return true end return false end -function mesecon:get_conductor_on(offstate) - local conductor = mesecon:get_conductor(offstate) +function mesecon.get_conductor_on(node_off, rulename) + local conductor = mesecon.get_conductor(node_off.name) if conductor then - return conductor.onstate + if conductor.onstate then + return conductor.onstate + end + if conductor.states then + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node_off)) + local binstate = mesecon.getbinstate(node_off.name, conductor.states) + binstate = mesecon.set_bit(binstate, bit, "1") + return conductor.states[tonumber(binstate,2)+1] + end end - return false + return offstate end -function mesecon:get_conductor_off(onstate) - local conductor = mesecon:get_conductor(onstate) +function mesecon.get_conductor_off(node_on, rulename) + local conductor = mesecon.get_conductor(node_on.name) if conductor then - return conductor.offstate + if conductor.offstate then + return conductor.offstate + end + if conductor.states then + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node_on)) + local binstate = mesecon.getbinstate(node_on.name, conductor.states) + binstate = mesecon.set_bit(binstate, bit, "0") + return conductor.states[tonumber(binstate,2)+1] + end end - return false + return onstate end -function mesecon:conductor_get_rules(node) - local conductor = mesecon:get_conductor(node.name) +function mesecon.conductor_get_rules(node) + local conductor = mesecon.get_conductor(node.name) if conductor then local rules = conductor.rules if type(rules) == 'function' then @@ -267,206 +355,282 @@ end -- some more general high-level stuff -function mesecon:is_power_on(pos) - local node = minetest.get_node(pos) - if mesecon:is_conductor_on(node.name) or mesecon:is_receptor_on(node.name) then +function mesecon.is_power_on(pos, rulename) + local node = mesecon.get_node_force(pos) + if node and (mesecon.is_conductor_on(node, rulename) or mesecon.is_receptor_on(node.name)) then return true end return false end -function mesecon:is_power_off(pos) - local node = minetest.get_node(pos) - if mesecon:is_conductor_off(node.name) or mesecon:is_receptor_off(node.name) then +function mesecon.is_power_off(pos, rulename) + local node = mesecon.get_node_force(pos) + if node and (mesecon.is_conductor_off(node, rulename) or mesecon.is_receptor_off(node.name)) then return true end return false end -function mesecon:turnon(pos, rulename) - local node = minetest.get_node(pos) +-- Turn off an equipotential section starting at `pos`, which outputs in the direction of `link`. +-- Breadth-first search. Map is abstracted away in a voxelmanip. +-- Follow all all conductor paths replacing conductors that were already +-- looked at, activating / changing all effectors along the way. +function mesecon.turnon(pos, link) + local frontiers = {{pos = pos, link = link}} - if mesecon:is_conductor_off(node.name) then - local rules = mesecon:conductor_get_rules(node) - minetest.add_node(pos, {name = mesecon:get_conductor_on(node.name), param2 = node.param2}) + local depth = 1 + while frontiers[1] do + local f = table.remove(frontiers, 1) + local node = mesecon.get_node_force(f.pos) - for _, rule in ipairs(rules) do - local np = mesecon:addPosRule(pos, rule) - local link, rulename = mesecon:rules_link(pos, np) + if not node then + -- Area does not exist; do nothing + elseif mesecon.is_conductor_off(node, f.link) then + local rules = mesecon.conductor_get_rules(node) - if link then - mesecon:turnon(np, rulename) + -- Call turnon on neighbors + for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do + local np = vector.add(f.pos, r) + for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do + table.insert(frontiers, {pos = np, link = l}) + end + end + + mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link)) + elseif mesecon.is_effector(node.name) then + mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth) + if mesecon.is_effector_off(node.name) then + mesecon.activate(f.pos, node, f.link, depth) end end - elseif mesecon:is_effector(node.name) then - mesecon:changesignal(pos, node, rulename, mesecon.state.on) - if mesecon:is_effector_off(node.name) then - mesecon:activate(pos, node, rulename) - end - end -end - -function mesecon:turnoff(pos, rulename) - local node = minetest.get_node(pos) - - if mesecon:is_conductor_on(node.name) then - local rules = mesecon:conductor_get_rules(node) - minetest.add_node(pos, {name = mesecon:get_conductor_off(node.name), param2 = node.param2}) - - for _, rule in ipairs(rules) do - local np = mesecon:addPosRule(pos, rule) - local link, rulename = mesecon:rules_link(pos, np) - - if link then - mesecon:turnoff(np, rulename) - end - end - elseif mesecon:is_effector(node.name) then - mesecon:changesignal(pos, node, rulename, mesecon.state.off) - if mesecon:is_effector_on(node.name) - and not mesecon:is_powered(pos) then - mesecon:deactivate(pos, node, rulename) - end - end -end - - -function mesecon:connected_to_receptor(pos) - local node = minetest.get_node(pos) - - -- Check if conductors around are connected - local rules = mesecon:get_any_inputrules(node) - if not rules then return false end - - for _, rule in ipairs(rules) do - local np = mesecon:addPosRule(pos, rule) - if mesecon:rules_link(np, pos) then - if mesecon:find_receptor_on(np, {}) then - return true - end - end - end - - return false -end - -function mesecon:find_receptor_on(pos, checked) - -- find out if node has already been checked (to prevent from endless loop) - for _, cp in ipairs(checked) do - if mesecon:cmpPos(cp, pos) then - return false, checked - end - end - - -- add current position to checked - table.insert(checked, {x=pos.x, y=pos.y, z=pos.z}) - local node = minetest.get_node(pos) - - if mesecon:is_receptor_on(node.name) then - return true - end - - if mesecon:is_conductor(node.name) then - local rules = mesecon:conductor_get_rules(node) - for _, rule in ipairs(rules) do - local np = mesecon:addPosRule(pos, rule) - if mesecon:rules_link(np, pos) then - if mesecon:find_receptor_on(np, checked) then - return true + if node and f.link.spread and minetest.get_item_group(node.name, "opaque") == 1 then + -- Call turnon on neighbors + -- Warning: A LOT of nodes need to be looked at for this to work + for _, r in ipairs(mesecon.rule2meta(f.link, mesecon.rules.mcl_alldirs_spread)) do + local np = vector.add(f.pos, r) + for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do + local nlink = table.copy(l) + nlink.spread = false + table.insert(frontiers, {pos = np, link = nlink}) end end end - end - return false + depth = depth + 1 + end end -function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug), second return value: the name of the affected input rule - local outputnode = minetest.get_node(output) - local inputnode = minetest.get_node(input) - local outputrules = dug_outputrules or mesecon:get_any_outputrules (outputnode) - local inputrules = mesecon:get_any_inputrules (inputnode) - if not outputrules or not inputrules then - return - end +-- Turn off an equipotential section starting at `pos`, which outputs in the direction of `link`. +-- Breadth-first search. Map is abstracted away in a voxelmanip. +-- Follow all all conductor paths replacing conductors that were already +-- looked at, deactivating / changing all effectors along the way. +-- In case an onstate receptor is discovered, abort the process by returning false, which will +-- cause `receptor_off` to discard all changes made in the voxelmanip. +-- Contrary to turnon, turnoff has to cache all change and deactivate signals so that they will only +-- be called in the very end when we can be sure that no conductor was found along the path. +-- +-- Signal table entry structure: +-- { +-- pos = position of effector, +-- node = node descriptor (name, param1 and param2), +-- link = link the effector is connected to, +-- depth = indicates order in which signals wire fired, higher is later +-- } +function mesecon.turnoff(pos, link) + local frontiers = {{pos = pos, link = link}} + local signals = {} - for _, outputrule in ipairs(outputrules) do - -- Check if output sends to input - if mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then - for _, inputrule in ipairs(inputrules) do - -- Check if input accepts from output - if mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then - return true, inputrule.name + local depth = 1 + while frontiers[1] do + local f = table.remove(frontiers, 1) + local node = mesecon.get_node_force(f.pos) + + if not node then + -- No-op + elseif mesecon.is_conductor_on(node, f.link) then + local rules = mesecon.conductor_get_rules(node) + for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do + local np = vector.add(f.pos, r) + + -- Check if an onstate receptor is connected. If that is the case, + -- abort this turnoff process by returning false. `receptor_off` will + -- discard all the changes that we made in the voxelmanip: + for _, l in ipairs(mesecon.rules_link_rule_all_inverted(f.pos, r)) do + if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then + return false + end + end + + -- Call turnoff on neighbors + for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do + table.insert(frontiers, {pos = np, link = l}) + end + end + + mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link)) + elseif mesecon.is_effector(node.name) then + table.insert(signals, { + pos = f.pos, + node = node, + link = f.link, + depth = depth + }) + end + + if node and f.link.spread and minetest.get_item_group(node.name, "opaque") == 1 then + -- Call turnoff on neighbors + -- Warning: A LOT of nodes need to be looked at for this to work + for _, r in ipairs(mesecon.rule2meta(f.link, mesecon.rules.mcl_alldirs_spread)) do + local np = vector.add(f.pos, r) + local n = mesecon.get_node_force(np) + if mesecon.is_receptor_on(n.name) then + local receptorrules = mesecon.receptor_get_rules(n) + for _, rr in pairs(receptorrules) do + if rr.spread and vector.equals(mesecon.invertRule(rr), r) then + return false + end + end + end + for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do + local nlink = table.copy(l) + nlink.spread = false + table.insert(frontiers, {pos = np, link = nlink}) end end end + + depth = depth + 1 end - return false -end -function mesecon:rules_link_anydir(pos1, pos2) - return mesecon:rules_link(pos1, pos2) or mesecon:rules_link(pos2, pos1) -end - -function mesecon:is_powered(pos) - local node = minetest.get_node(pos) - local rules = mesecon:get_any_inputrules(node) - if not rules then return false end - - for _, rule in ipairs(rules) do - local np = mesecon:addPosRule(pos, rule) - local nn = minetest.get_node(np) - - if (mesecon:is_conductor_on (nn.name) or mesecon:is_receptor_on (nn.name)) - and mesecon:rules_link(np, pos) then - return true + for _, sig in ipairs(signals) do + mesecon.changesignal(sig.pos, sig.node, sig.link, mesecon.state.off, sig.depth) + if mesecon.is_effector_on(sig.node.name) and not mesecon.is_powered(sig.pos) then + mesecon.deactivate(sig.pos, sig.node, sig.link, sig.depth) end end - - return false + + return true end ---Rules rotation Functions: -function mesecon:rotate_rules_right(rules) - local nr = {} - for i, rule in ipairs(rules) do - table.insert(nr, { - x = -rule.z, - y = rule.y, - z = rule.x}) +-- Get all linking inputrules of inputnode (effector or conductor) that is connected to +-- outputnode (receptor or conductor) at position `output` and has an output in direction `rule` +function mesecon.rules_link_rule_all(output, rule) + local input = vector.add(output, rule) + local inputnode = mesecon.get_node_force(input) + local inputrules = mesecon.get_any_inputrules(inputnode) + if not inputrules then + return {} end - return nr + local rules = {} + + for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do + -- Check if input accepts from output + if vector.equals(vector.add(input, inputrule), output) then + local newrule = table.copy(inputrule) + newrule.spread = rule.spread + table.insert(rules, newrule) + end + end + + return rules end -function mesecon:rotate_rules_left(rules) - local nr = {} - for i, rule in ipairs(rules) do - table.insert(nr, { - x = rule.z, - y = rule.y, - z = -rule.x}) +-- Get all linking outputnodes of outputnode (receptor or conductor) that is connected to +-- inputnode (effector or conductor) at position `input` and has an input in direction `rule` +function mesecon.rules_link_rule_all_inverted(input, rule) + local output = vector.add(input, rule) + local outputnode = mesecon.get_node_force(output) + local outputrules = mesecon.get_any_outputrules(outputnode) + if not outputrules then + return {} end - return nr + local rules = {} + + for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do + if vector.equals(vector.add(output, outputrule), input) then + local newrule = table.copy(outputrule) + newrule = mesecon.invertRule(newrule) + newrule.spread = rule.spread + table.insert(rules, newrule) + end + end + return rules end -function mesecon:rotate_rules_down(rules) - local nr = {} - for i, rule in ipairs(rules) do - table.insert(nr, { - x = -rule.y, - y = rule.x, - z = rule.z}) +function mesecon.is_powered(pos, rule, depth, sourcepos, home_pos) + if depth == nil then depth = 0 end + if depth > 1 then + return false, false + end + local node = mesecon.get_node_force(pos) + local rules = mesecon.get_any_inputrules(node) + if not rules then + return false, false + end + if not home_pos then + home_pos = pos + end + + -- List of nodes that send out power to pos + if sourcepos == nil then + sourcepos = {} + end + + local function power_walk(pos, home_pos, sourcepos, rulenames, rule, depth) + local spread = false + for _, rname in ipairs(rulenames) do + local np = vector.add(pos, rname) + local nn = mesecon.get_node_force(np) + if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname)) + or mesecon.is_receptor_on (nn.name)) then + if not vector.equals(home_pos, np) then + local rulez = mesecon.get_any_outputrules(nn) + local spread_tmp = false + for r=1, #rulez do + if vector.equals(mesecon.invertRule(rname), rulez[r]) then + if rulez[r].spread then + spread_tmp = true + end + end + end + if depth == 0 or spread_tmp then + table.insert(sourcepos, np) + if spread_tmp then + spread = true + end + end + end + elseif depth == 0 and minetest.get_item_group(nn.name, "opaque") == 1 then + local more_sourcepos = mesecon.is_powered(np, nil, depth + 1, sourcepos, home_pos) + if more_sourcepos and #more_sourcepos > 0 then + mesecon.mergetable(sourcepos, more_sourcepos) + end + end + end + return sourcepos, spread + end + + local spread = false + if not rule then + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local spread_temp + local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule) + sourcepos, spread_temp = power_walk(pos, home_pos, sourcepos, rulenames, rule, depth) + if spread_temp then + spread = true + end + end + else + local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule) + sourcepos, spread = power_walk(pos, home_pos, sourcepos, rulenames, rule, depth) + end + + -- Return FALSE if not powered, return list of sources if is powered + + if (#sourcepos == 0) then + return false, false + else + return sourcepos, spread end - return nr end -function mesecon:rotate_rules_up(rules) - local nr = {} - for i, rule in ipairs(rules) do - table.insert(nr, { - x = rule.y, - y = -rule.x, - z = rule.z}) - end - return nr -end diff --git a/mods/ITEMS/REDSTONE/mesecons/legacy.lua b/mods/ITEMS/REDSTONE/mesecons/legacy.lua deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/ITEMS/REDSTONE/mesecons/presets.lua b/mods/ITEMS/REDSTONE/mesecons/presets.lua index 6c8d3eac..f624c52f 100644 --- a/mods/ITEMS/REDSTONE/mesecons/presets.lua +++ b/mods/ITEMS/REDSTONE/mesecons/presets.lua @@ -6,6 +6,9 @@ mesecon.rules.default = {x=1, y=0, z=0}, {x=-1, y=0, z=0}, {x=0, y=0, z=1}, + {x=0, y=1, z=0}, + {x=0, y=-1, z=0}, + {x=1, y=1, z=0}, {x=1, y=-1, z=0}, {x=-1, y=1, z=0}, @@ -15,30 +18,92 @@ mesecon.rules.default = {x=0, y=1, z=-1}, {x=0, y=-1, z=-1}} -mesecon.rules.buttonlike = +mesecon.rules.alldirs = +{{x= 1, y= 0, z= 0}, + {x=-1, y= 0, z= 0}, + {x= 0, y= 1, z= 0}, + {x= 0, y=-1, z= 0}, + {x= 0, y= 0, z= 1}, + {x= 0, y= 0, z=-1}} + +mesecon.rules.pplate = {{x = 1, y = 0, z = 0}, - {x = 1, y = 1, z = 0}, - {x = 1, y =-1, z = 0}, - {x = 1, y =-1, z = 1}, - {x = 1, y =-1, z =-1}, - {x = 2, y = 0, z = 0}} + {x =-1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y =-1, z = 0, spread = true}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1}} + +mesecon.rules.buttonlike = +{{x = 0, y = 0, z =-1}, + {x = 0, y = 0, z = 1}, + {x = 0, y =-1, z = 0}, + {x = 0, y = 1, z = 0}, + {x =-1, y = 0, z = 0}, + {x = 1, y = 0, z = 0, spread = true}} + +mesecon.rules.floor = +{{x = 1, y = 0, z = 0}, + {x =-1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y =-1, z = 0, spread = true}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1}} mesecon.rules.flat = {{x = 1, y = 0, z = 0}, {x =-1, y = 0, z = 0}, {x = 0, y = 0, z = 1}, {x = 0, y = 0, z =-1}} - + + + +-- NOT IN ORIGNAL MESECONS +mesecon.rules.mcl_alldirs_spread = +{{x= 1, y= 0, z= 0, spread = true}, + {x=-1, y= 0, z= 0, spread = true}, + {x= 0, y= 1, z= 0, spread = true}, + {x= 0, y=-1, z= 0, spread = true}, + {x= 0, y= 0, z= 1, spread = true}, + {x= 0, y= 0, z=-1, spread = true}} + +-- END OF UNOFFICIAL RULES + +local rules_buttonlike = { + xp = mesecon.rules.buttonlike, + xn = mesecon.rotate_rules_right(mesecon.rotate_rules_right(mesecon.rules.buttonlike)), + yp = mesecon.rotate_rules_down(mesecon.rules.buttonlike), + yn = mesecon.rotate_rules_up(mesecon.rules.buttonlike), + zp = mesecon.rotate_rules_right(mesecon.rules.buttonlike), + zn = mesecon.rotate_rules_left(mesecon.rules.buttonlike), +} + +local rules_wallmounted = { + xp = mesecon.rotate_rules_down(mesecon.rules.floor), + xn = mesecon.rotate_rules_up(mesecon.rules.floor), + yp = mesecon.rotate_rules_up(mesecon.rotate_rules_up(mesecon.rules.floor)), + yn = mesecon.rules.floor, + zp = mesecon.rotate_rules_left(mesecon.rotate_rules_up(mesecon.rules.floor)), + zn = mesecon.rotate_rules_right(mesecon.rotate_rules_up(mesecon.rules.floor)), +} + +local function rules_from_dir(ruleset, dir) + if dir.x == 1 then return ruleset.xp end + if dir.y == 1 then return ruleset.yp end + if dir.z == 1 then return ruleset.zp end + if dir.x == -1 then return ruleset.xn end + if dir.y == -1 then return ruleset.yn end + if dir.z == -1 then return ruleset.zn end +end + mesecon.rules.buttonlike_get = function(node) - local rules = mesecon.rules.buttonlike - if node.param2 == 2 then - rules=mesecon:rotate_rules_left(rules) - elseif node.param2 == 3 then - rules=mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) - elseif node.param2 == 0 then - rules=mesecon:rotate_rules_right(rules) - end - return rules + local dir = minetest.facedir_to_dir(node.param2) + return rules_from_dir(rules_buttonlike, dir) +end + +mesecon.rules.wallmounted_get = function(node) + local dir = minetest.wallmounted_to_dir(node.param2) + return rules_from_dir(rules_wallmounted, dir) end mesecon.state.on = "on" diff --git a/mods/ITEMS/REDSTONE/mesecons/services.lua b/mods/ITEMS/REDSTONE/mesecons/services.lua index a3aab430..9addda8b 100644 --- a/mods/ITEMS/REDSTONE/mesecons/services.lua +++ b/mods/ITEMS/REDSTONE/mesecons/services.lua @@ -1,28 +1,168 @@ -mesecon.on_placenode = function (pos, node) - if mesecon:is_receptor_on(node.name) then - mesecon:receptor_on(pos, mesecon:receptor_get_rules(node)) - elseif mesecon:is_powered(pos) then - if mesecon:is_conductor(node.name) then - mesecon:turnon (pos) - mesecon:receptor_on (pos, mesecon:conductor_get_rules(node)) - else - mesecon:changesignal(pos, node) - mesecon:activate(pos, node) +-- Dig and place services + +mesecon.on_placenode = function(pos, node) + mesecon.execute_autoconnect_hooks_now(pos, node) + + -- Receptors: Send on signal when active + if mesecon.is_receptor_on(node.name) then + mesecon.receptor_on(pos, mesecon.receptor_get_rules(node)) + end + + -- Conductors: Send turnon signal when powered or replace by respective offstate conductor + -- if placed conductor is an onstate one + if mesecon.is_conductor(node.name) then + local sources = mesecon.is_powered(pos) + if sources then + -- also call receptor_on if itself is powered already, so that neighboring + -- conductors will be activated (when pushing an on-conductor with a piston) + for _, s in ipairs(sources) do + local rule = vector.subtract(pos, s) + mesecon.turnon(pos, rule) + end + mesecon.receptor_on (pos, mesecon.conductor_get_rules(node)) + elseif mesecon.is_conductor_on(node) then + minetest.swap_node(pos, {name = mesecon.get_conductor_off(node)}) + end + end + + -- Effectors: Send changesignal and activate or deactivate + if mesecon.is_effector(node.name) then + local powered_rules = {} + local unpowered_rules = {} + + -- for each input rule, check if powered + for _, r in ipairs(mesecon.effector_get_rules(node)) do + local powered = mesecon.is_powered(pos, r) + if powered then table.insert(powered_rules, r) + else table.insert(unpowered_rules, r) end + + local state = powered and mesecon.state.on or mesecon.state.off + mesecon.changesignal(pos, node, r, state, 1) + end + + if (#powered_rules > 0) then + for _, r in ipairs(powered_rules) do + mesecon.activate(pos, node, r, 1) + end + else + for _, r in ipairs(unpowered_rules) do + mesecon.deactivate(pos, node, r, 1) + end + end + end + + if minetest.get_item_group(node.name, "opaque") == 1 then + local neighbors = mesecon.mcl_get_neighbors(pos) + local is_powered, direct_source = mesecon.is_powered(pos) + if is_powered and direct_source then + for n=1, #neighbors do + local npos = neighbors[n].pos + local nnode = minetest.get_node(npos) + if mesecon.is_conductor_off(nnode) then + mesecon.receptor_on(npos, mesecon.conductor_get_rules(nnode)) + -- Redstone torch is a special case and must be ignored + elseif mesecon.is_effector_on(nnode.name) and minetest.get_item_group(nnode.name, "redstone_torch") == 0 then + mesecon.changesignal(npos, nnode, neighbors[n].link, mesecon.state.on, 1) + mesecon.activate(npos, nnode, neighbors[n].link, 1) + end + end end - elseif mesecon:is_conductor_on(node.name) then - mesecon:swap_node(pos, mesecon:get_conductor_off(node.name)) - elseif mesecon:is_effector_on (node.name) then - mesecon:deactivate(pos, node) end end -mesecon.on_dignode = function (pos, node) - if mesecon:is_conductor_on(node.name) then - mesecon:receptor_off(pos, mesecon:conductor_get_rules(node)) - elseif mesecon:is_receptor_on(node.name) then - mesecon:receptor_off(pos, mesecon:receptor_get_rules(node)) +mesecon.on_dignode = function(pos, node) + if mesecon.is_conductor_on(node) then + mesecon.receptor_off(pos, mesecon.conductor_get_rules(node)) + elseif mesecon.is_receptor_on(node.name) then + mesecon.receptor_off(pos, mesecon.receptor_get_rules(node)) end + if minetest.get_item_group(node.name, "opaque") == 1 then + local sources = mesecon.is_powered(pos) + local neighbors = mesecon.mcl_get_neighbors(pos) + for n=1, #neighbors do + local npos = neighbors[n].pos + local nlink = neighbors[n].link + local nnode = minetest.get_node(npos) + if mesecon.is_conductor_on(nnode) then + mesecon.receptor_off(npos, mesecon.conductor_get_rules(nnode)) + -- Disable neighbor effectors unless they are in a special ignore group + elseif mesecon.is_effector_on(nnode.name) and mesecon.is_powered(npos) == false and minetest.get_item_group(nnode.name, "mesecon_ignore_opaque_dig") == 0 then + mesecon.changesignal(npos, nnode, nlink, mesecon.state.off, 1) + mesecon.deactivate(npos, nnode, nlink, 1) + end + end + end + mesecon.execute_autoconnect_hooks_queue(pos, node) +end + +mesecon.on_blastnode = function(pos, node) + local node = minetest.get_node(pos) + minetest.remove_node(pos) + mesecon.on_dignode(pos, node) + return minetest.get_node_drops(node.name, "") end minetest.register_on_placenode(mesecon.on_placenode) minetest.register_on_dignode(mesecon.on_dignode) + +-- Overheating service for fast circuits +local OVERHEAT_MAX = mesecon.setting("overheat_max", 8) +local COOLDOWN_TIME = mesecon.setting("cooldown_time", 3.0) +local COOLDOWN_STEP = mesecon.setting("cooldown_granularity", 0.5) +local COOLDOWN_MULTIPLIER = OVERHEAT_MAX / COOLDOWN_TIME +local cooldown_timer = 0.0 +local object_heat = {} + +-- returns true if heat is too high +function mesecon.do_overheat(pos) + local id = minetest.hash_node_position(pos) + local heat = (object_heat[id] or 0) + 1 + object_heat[id] = heat + if heat >= OVERHEAT_MAX then + minetest.log("action", "Node overheats at " .. minetest.pos_to_string(pos)) + object_heat[id] = nil + return true + end + return false +end + +function mesecon.do_cooldown(pos) + local id = minetest.hash_node_position(pos) + object_heat[id] = nil +end + +function mesecon.get_heat(pos) + local id = minetest.hash_node_position(pos) + return object_heat[id] or 0 +end + +function mesecon.move_hot_nodes(moved_nodes) + local new_heat = {} + for _, n in ipairs(moved_nodes) do + local old_id = minetest.hash_node_position(n.oldpos) + local new_id = minetest.hash_node_position(n.pos) + new_heat[new_id] = object_heat[old_id] + object_heat[old_id] = nil + end + for id, heat in pairs(new_heat) do + object_heat[id] = heat + end +end + +local function global_cooldown(dtime) + cooldown_timer = cooldown_timer + dtime + if cooldown_timer < COOLDOWN_STEP then + return -- don't overload the CPU + end + local cooldown = COOLDOWN_MULTIPLIER * cooldown_timer + cooldown_timer = 0 + for id, heat in pairs(object_heat) do + heat = heat - cooldown + if heat <= 0 then + object_heat[id] = nil -- free some RAM + else + object_heat[id] = heat + end + end +end +minetest.register_globalstep(global_cooldown) diff --git a/mods/ITEMS/REDSTONE/mesecons/settings.lua b/mods/ITEMS/REDSTONE/mesecons/settings.lua index 64f4d7fc..02207073 100644 --- a/mods/ITEMS/REDSTONE/mesecons/settings.lua +++ b/mods/ITEMS/REDSTONE/mesecons/settings.lua @@ -1,4 +1,15 @@ --- SETTINGS -NEW_STYLE_WIRES = true -- true = new nodebox wires, false = old raillike wires -PRESSURE_PLATE_INTERVAL = 0.04 -PISTON_MAXIMUM_PUSH = 12 +-- SETTINGS +function mesecon.setting(setting, default) + if type(default) == "boolean" then + local read = minetest.settings:get_bool("mesecon."..setting) + if read == nil then + return default + else + return read + end + elseif type(default) == "string" then + return minetest.settings:get("mesecon."..setting) or default + elseif type(default) == "number" then + return tonumber(minetest.settings:get("mesecon."..setting) or default) + end +end diff --git a/mods/ITEMS/REDSTONE/mesecons/util.lua b/mods/ITEMS/REDSTONE/mesecons/util.lua index fc381f65..b6602526 100644 --- a/mods/ITEMS/REDSTONE/mesecons/util.lua +++ b/mods/ITEMS/REDSTONE/mesecons/util.lua @@ -1,24 +1,461 @@ -function mesecon:swap_node(pos, name) - local node = minetest.get_node(pos) - local data = minetest.get_meta(pos):to_table() - node.name = name - minetest.add_node(pos, node) - minetest.get_meta(pos):from_table(data) -end - -function mesecon:move_node(pos, newpos) +function mesecon.move_node(pos, newpos) local node = minetest.get_node(pos) local meta = minetest.get_meta(pos):to_table() minetest.remove_node(pos) - minetest.add_node(newpos, node) + minetest.set_node(newpos, node) minetest.get_meta(pos):from_table(meta) end - -function mesecon:addPosRule(p, r) - return {x = p.x + r.x, y = p.y + r.y, z = p.z + r.z} +--Rules rotation Functions: +function mesecon.rotate_rules_right(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = -rule.z, + y = rule.y, + z = rule.x, + name = rule.name, + spread = rule.spread,}) + end + return nr end -function mesecon:cmpPos(p1, p2) - return (p1.x == p2.x and p1.y == p2.y and p1.z == p2.z) +function mesecon.rotate_rules_left(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = rule.z, + y = rule.y, + z = -rule.x, + name = rule.name, + spread = rule.spread,}) + end + return nr +end + +function mesecon.rotate_rules_down(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = -rule.y, + y = rule.x, + z = rule.z, + name = rule.name, + spread = rule.spread,}) + end + return nr +end + +function mesecon.rotate_rules_up(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = rule.y, + y = -rule.x, + z = rule.z, + name = rule.name, + spread = rule.spread,}) + end + return nr +end + +function mesecon.flattenrules(allrules) +--[[ + { + { + {xyz}, + {xyz}, + }, + { + {xyz}, + {xyz}, + }, + } +--]] + if allrules[1] and + allrules[1].x then + return allrules + end + + local shallowrules = {} + for _, metarule in ipairs( allrules) do + for _, rule in ipairs(metarule ) do + table.insert(shallowrules, rule) + end + end + return shallowrules +--[[ + { + {xyz}, + {xyz}, + {xyz}, + {xyz}, + } +--]] +end + +function mesecon.rule2bit(findrule, allrules) + --get the bit of the metarule the rule is in, or bit 1 + if (allrules[1] and + allrules[1].x) or + not findrule then + return 1 + end + for m,metarule in ipairs( allrules) do + for _, rule in ipairs(metarule ) do + if vector.equals(findrule, rule) then + return m + end + end + end +end + +function mesecon.rule2metaindex(findrule, allrules) + --get the metarule the rule is in, or allrules + if allrules[1].x then + return nil + end + + if not(findrule) then + return mesecon.flattenrules(allrules) + end + + for m, metarule in ipairs( allrules) do + for _, rule in ipairs(metarule ) do + if vector.equals(findrule, rule) then + return m + end + end + end +end + +function mesecon.rule2meta(findrule, allrules) + if #allrules == 0 then return {} end + + local index = mesecon.rule2metaindex(findrule, allrules) + if index == nil then + if allrules[1].x then + return allrules + else + return {} + end + end + return allrules[index] +end + +-- Returns the 6 immediate neighbors of pos +-- (nodes which touch the sides of pos). +-- NOT PART OF ORIGINAL MESECONS! +function mesecon.mcl_get_neighbors(pos) + local r = mesecon.rules.alldirs + local e = {} + for i=1, #r do + table.insert(e, { pos = vector.add(pos, r[i]), link = r[i] }) + end + return e +end + +function mesecon.dec2bin(n) + local x, y = math.floor(n / 2), n % 2 + if (n > 1) then + return mesecon.dec2bin(x)..y + else + return ""..y + end +end + +function mesecon.getstate(nodename, states) + for state, name in ipairs(states) do + if name == nodename then + return state + end + end + error(nodename.." doesn't mention itself in "..dump(states)) +end + +function mesecon.getbinstate(nodename, states) + return mesecon.dec2bin(mesecon.getstate(nodename, states)-1) +end + +function mesecon.get_bit(binary,bit) + bit = bit or 1 + local c = binary:len()-(bit-1) + return binary:sub(c,c) == "1" +end + +function mesecon.set_bit(binary,bit,value) + if value == "1" then + if not mesecon.get_bit(binary,bit) then + return mesecon.dec2bin(tonumber(binary,2)+math.pow(2,bit-1)) + end + elseif value == "0" then + if mesecon.get_bit(binary,bit) then + return mesecon.dec2bin(tonumber(binary,2)-math.pow(2,bit-1)) + end + end + return binary + +end + +function mesecon.invertRule(r) + local spread = r.spread + r = vector.multiply(r, -1) + if spread then + r.spread = true + end + return r +end + +function mesecon.tablecopy(table) -- deep table copy + if type(table) ~= "table" then return table end -- no need to copy + local newtable = {} + + for idx, item in pairs(table) do + if type(item) == "table" then + newtable[idx] = mesecon.tablecopy(item) + else + newtable[idx] = item + end + end + + return newtable +end + +function mesecon.cmpAny(t1, t2) + if type(t1) ~= type(t2) then return false end + if type(t1) ~= "table" and type(t2) ~= "table" then return t1 == t2 end + + for i, e in pairs(t1) do + if not mesecon.cmpAny(e, t2[i]) then return false end + end + + return true +end + +-- does not overwrite values; number keys (ipairs) are appended, not overwritten +function mesecon.mergetable(source, dest) + local rval = mesecon.tablecopy(dest) + + for k, v in pairs(source) do + rval[k] = dest[k] or mesecon.tablecopy(v) + end + for i, v in ipairs(source) do + table.insert(rval, mesecon.tablecopy(v)) + end + + return rval +end + +function mesecon.register_node(name, spec_common, spec_off, spec_on) + spec_common.drop = spec_common.drop or name .. "_off" + spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode + spec_common.__mesecon_basename = name + spec_on.__mesecon_state = "on" + spec_off.__mesecon_state = "off" + + spec_on = mesecon.mergetable(spec_common, spec_on); + spec_off = mesecon.mergetable(spec_common, spec_off); + + minetest.register_node(name .. "_on", spec_on) + minetest.register_node(name .. "_off", spec_off) +end + +-- swap onstate and offstate nodes, returns new state +function mesecon.flipstate(pos, node) + local nodedef = minetest.registered_nodes[node.name] + local newstate + if (nodedef.__mesecon_state == "on") then newstate = "off" end + if (nodedef.__mesecon_state == "off") then newstate = "on" end + + minetest.swap_node(pos, {name = nodedef.__mesecon_basename .. "_" .. newstate, + param2 = node.param2}) + + return newstate +end + +-- File writing / reading utilities +local wpath = minetest.get_worldpath() +function mesecon.file2table(filename) + local f = io.open(wpath..DIR_DELIM..filename, "r") + if f == nil then return {} end + local t = f:read("*all") + f:close() + if t == "" or t == nil then return {} end + return minetest.deserialize(t) +end + +function mesecon.table2file(filename, table) + local f = io.open(wpath..DIR_DELIM..filename, "w") + f:write(minetest.serialize(table)) + f:close() +end + +-- Block position "hashing" (convert to integer) functions for voxelmanip cache +local BLOCKSIZE = 16 + +-- convert node position --> block hash +local function hash_blockpos(pos) + return minetest.hash_node_position({ + x = math.floor(pos.x/BLOCKSIZE), + y = math.floor(pos.y/BLOCKSIZE), + z = math.floor(pos.z/BLOCKSIZE) + }) +end + +-- Maps from a hashed mapblock position (as returned by hash_blockpos) to a +-- table. +-- +-- Contents of the table are: +-- “vm” → the VoxelManipulator +-- “va” → the VoxelArea +-- “data” → the data array +-- “param1” → the param1 array +-- “param2” → the param2 array +-- “dirty” → true if data has been modified +-- +-- Nil if no VM-based transaction is in progress. +local vm_cache = nil + +-- Starts a VoxelManipulator-based transaction. +-- +-- During a VM transaction, calls to vm_get_node and vm_swap_node operate on a +-- cached copy of the world loaded via VoxelManipulators. That cache can later +-- be committed to the real map by means of vm_commit or discarded by means of +-- vm_abort. +function mesecon.vm_begin() + vm_cache = {} +end + +-- Finishes a VoxelManipulator-based transaction, freeing the VMs and map data +-- and writing back any modified areas. +function mesecon.vm_commit() + for hash, tbl in pairs(vm_cache) do + if tbl.dirty then + local vm = tbl.vm + vm:set_data(tbl.data) + vm:write_to_map() + vm:update_map() + end + end + vm_cache = nil +end + +-- Finishes a VoxelManipulator-based transaction, freeing the VMs and throwing +-- away any modified areas. +function mesecon.vm_abort() + vm_cache = nil +end + +-- Gets the cache entry covering a position, populating it if necessary. +local function vm_get_or_create_entry(pos) + local hash = hash_blockpos(pos) + local tbl = vm_cache[hash] + if not tbl then + local vm = minetest.get_voxel_manip(pos, pos) + local min_pos, max_pos = vm:get_emerged_area() + local va = VoxelArea:new{MinEdge = min_pos, MaxEdge = max_pos} + tbl = {vm = vm, va = va, data = vm:get_data(), param1 = vm:get_light_data(), param2 = vm:get_param2_data(), dirty = false} + vm_cache[hash] = tbl + end + return tbl +end + +-- Gets the node at a given position during a VoxelManipulator-based +-- transaction. +function mesecon.vm_get_node(pos) + local tbl = vm_get_or_create_entry(pos) + local index = tbl.va:indexp(pos) + local node_value = tbl.data[index] + if node_value == minetest.CONTENT_IGNORE then + return nil + else + local node_param1 = tbl.param1[index] + local node_param2 = tbl.param2[index] + return {name = minetest.get_name_from_content_id(node_value), param1 = node_param1, param2 = node_param2} + end +end + +-- Sets a node’s name during a VoxelManipulator-based transaction. +-- +-- Existing param1, param2, and metadata are left alone. +function mesecon.vm_swap_node(pos, name) + local tbl = vm_get_or_create_entry(pos) + local index = tbl.va:indexp(pos) + tbl.data[index] = minetest.get_content_id(name) + tbl.dirty = true +end + +-- Gets the node at a given position, regardless of whether it is loaded or +-- not, respecting a transaction if one is in progress. +-- +-- Outside a VM transaction, if the mapblock is not loaded, it is pulled into +-- the server’s main map data cache and then accessed from there. +-- +-- Inside a VM transaction, the transaction’s VM cache is used. +function mesecon.get_node_force(pos) + if vm_cache then + return mesecon.vm_get_node(pos) + else + local node = minetest.get_node_or_nil(pos) + if node == nil then + -- Node is not currently loaded; use a VoxelManipulator to prime + -- the mapblock cache and try again. + minetest.get_voxel_manip(pos, pos) + node = minetest.get_node_or_nil(pos) + end + return node + end +end + +-- Swaps the node at a given position, regardless of whether it is loaded or +-- not, respecting a transaction if one is in progress. +-- +-- Outside a VM transaction, if the mapblock is not loaded, it is pulled into +-- the server’s main map data cache and then accessed from there. +-- +-- Inside a VM transaction, the transaction’s VM cache is used. +-- +-- This function can only be used to change the node’s name, not its parameters +-- or metadata. +function mesecon.swap_node_force(pos, name) + if vm_cache then + return mesecon.vm_swap_node(pos, name) + else + -- This serves to both ensure the mapblock is loaded and also hand us + -- the old node table so we can preserve param2. + local node = mesecon.get_node_force(pos) + node.name = name + minetest.swap_node(pos, node) + end +end + +-- Autoconnect Hooks +-- Nodes like conductors may change their appearance and their connection rules +-- right after being placed or after being dug, e.g. the default wires use this +-- to automatically connect to linking nodes after placement. +-- After placement, the update function will be executed immediately so that the +-- possibly changed rules can be taken into account when recalculating the circuit. +-- After digging, the update function will be queued and executed after +-- recalculating the circuit. The update function must take care of updating the +-- node at the given position itself, but also all of the other nodes the given +-- position may have (had) a linking connection to. +mesecon.autoconnect_hooks = {} + +-- name: A unique name for the hook, e.g. "foowire". Used to name the actionqueue function. +-- fct: The update function with parameters function(pos, node) +function mesecon.register_autoconnect_hook(name, fct) + mesecon.autoconnect_hooks[name] = fct + mesecon.queue:add_function("autoconnect_hook_"..name, fct) +end + +function mesecon.execute_autoconnect_hooks_now(pos, node) + for _, fct in pairs(mesecon.autoconnect_hooks) do + fct(pos, node) + end +end + +function mesecon.execute_autoconnect_hooks_queue(pos, node) + for name in pairs(mesecon.autoconnect_hooks) do + mesecon.queue:add_action(pos, "autoconnect_hook_"..name, {node}) + end end diff --git a/mods/ITEMS/REDSTONE/mesecons/wires.lua b/mods/ITEMS/REDSTONE/mesecons/wires.lua deleted file mode 100644 index d9c9efba..00000000 --- a/mods/ITEMS/REDSTONE/mesecons/wires.lua +++ /dev/null @@ -1,269 +0,0 @@ --- naming scheme: wire:(xp)(zp)(xm)(zm)_on/off --- The conditions in brackets define whether there is a mesecon at that place or not --- 1 = there is one; 0 = there is none --- y always means y+ - -box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/64, 1/16} -- filler for curves and straight lines -box_bump1 = { -3/16, -.5, -3/16, 3/16, -.5+1/64, 3/16 } -- filler for redstone dust “dot” - -box_xp = {1/16, -.5, -1/16, 8/16, -.5+1/64, 1/16} -box_zp = {-1/16, -.5, 1/16, 1/16, -.5+1/64, 8/16} -box_xm = {-8/16, -.5, -1/16, -1/16, -.5+1/64, 1/16} -box_zm = {-1/16, -.5, -8/16, 1/16, -.5+1/64, -1/16} - -box_xpy = {.5-1/16, -.5+1/64, -1/16, .5, .4999+1/64, 1/16} -box_zpy = {-1/16, -.5+1/64, .5-1/16, 1/16, .4999+1/64, .5} -box_xmy = {-.5, -.5+1/64, -1/16, -.5+1/16, .4999+1/64, 1/16} -box_zmy = {-1/16, -.5+1/64, -.5, 1/16, .4999+1/64, -.5+1/16} - --- Registering the wires - -for xp=0, 1 do -for zp=0, 1 do -for xm=0, 1 do -for zm=0, 1 do -for xpy=0, 1 do -for zpy=0, 1 do -for xmy=0, 1 do -for zmy=0, 1 do - if (xpy == 1 and xp == 0) or (zpy == 1 and zp == 0) - or (xmy == 1 and xm == 0) or (zmy == 1 and zm == 0) then break end - - local groups - local nodeid = tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm ).. - tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy) - - local wirehelp - local longdesc - local usagehelp - if nodeid == "00000000" then - groups = {dig_immediate = 3, mesecon_conductor_craftable = 1, attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1} - wiredesc = "Redstone" - wirehelp = nodeid == "00000000" - if wirehelp then - longdesc = [[Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on trail the ground as a trail. -A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components. -Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.]] - usagehelp = [[Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch. - -Read the help entries on the other redstone components to learn how redstone components interact.]] - end - else - groups = {dig_immediate = 3, not_in_creative_inventory = 1, attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1} - wiredesc = "Redstone Trail (ID: "..nodeid..")" - wirehelp = false - end - - local nodebox = {} - local adjx = false - local adjz = false - if xp == 1 then table.insert(nodebox, box_xp) adjx = true end - if zp == 1 then table.insert(nodebox, box_zp) adjz = true end - if xm == 1 then table.insert(nodebox, box_xm) adjx = true end - if zm == 1 then table.insert(nodebox, box_zm) adjz = true end - if xpy == 1 then table.insert(nodebox, box_xpy) end - if zpy == 1 then table.insert(nodebox, box_zpy) end - if xmy == 1 then table.insert(nodebox, box_xmy) end - if zmy == 1 then table.insert(nodebox, box_zmy) end - - local ratio_off = 128 - local ratio_on = 192 - local crossing_off = "(redstone_redstone_dust_dot.png^redstone_redstone_dust_line0.png^(redstone_redstone_dust_line1.png^[transformR90))^[colorize:#FF0000:"..ratio_off - local crossing_on = "(redstone_redstone_dust_dot.png^redstone_redstone_dust_line0.png^(redstone_redstone_dust_line1.png^[transformR90))^[colorize:#FF0000:"..ratio_on - local straight0_off = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_off - local straight0_on = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_on - local straight1_off = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_off - local straight1_on = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_on - local dot_off = "redstone_redstone_dust_dot.png^[colorize:#FF0000:"..ratio_off - local dot_on = "redstone_redstone_dust_dot.png^[colorize:#FF0000:"..ratio_on - - if nodeid == "00000000" then - -- Non-connected redstone wire - nodebox = {-8/16, -.5, -8/16, 8/16, -.5+1/16, 8/16} - -- “Dot” texture - tiles_off = { dot_off, dot_off, "blank.png", "blank.png", "blank.png", "blank.png" } - tiles_on = { dot_on, dot_on, "blank.png", "blank.png", "blank.png", "blank.png" } - elseif adjx and adjz and (xp + zp + xm + zm > 2) then - -- Connected redstone wire (crossing or t-junction) - table.insert(nodebox, box_bump1) - tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off, } - tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on, } - else - -- Connected redstone wire (straight line or curve) - table.insert(nodebox, box_center) - tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off, } - tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on, } - end - - minetest.register_node("mesecons:wire_"..nodeid.."_off", { - description = "Redstone", - _doc_items_create_entry = wirehelp, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, - drawtype = "nodebox", - tiles = tiles_off, - is_ground_content = false, --- inventory_image = "wires_inv.png", --- wield_image = "wires_inv.png", - inventory_image = "redstone_redstone_dust.png", - wield_image = "redstone_redstone_dust.png", - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - selection_box = { - type = "fixed", - fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5} - }, - node_box = { - type = "fixed", - fixed = nodebox - }, - groups = groups, - walkable = false, - stack_max = 64, - drop = "mesecons:wire_00000000_off", - mesecons = {conductor={ - state = mesecon.state.off, - onstate = "mesecons:wire_"..nodeid.."_on" - }}, - sounds = mcl_sounds.node_sound_defaults(), - }) - - minetest.register_node("mesecons:wire_"..nodeid.."_on", { - description = "Redstone (Powered)", - _doc_items_create_entry = false, - drawtype = "nodebox", - tiles = tiles_on, - is_ground_content = false, --- inventory_image = "wires_inv.png", --- wield_image = "wires_inv.png", - inventory_image = "redstone_redstone_dust.png", - wield_image = "redstone_redstone_dust.png", - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - selection_box = { - type = "fixed", - fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5} - }, - node_box = { - type = "fixed", - fixed = nodebox - }, - groups = {dig_immediate = 3, mesecon = 2, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1, attached_node = 1, not_in_creative_inventory = 1}, - walkable = false, - stack_max = 64, - drop = "mesecons:wire_00000000_off", - mesecons = {conductor={ - state = mesecon.state.on, - offstate = "mesecons:wire_"..nodeid.."_off" - }}, - sounds = mcl_sounds.node_sound_defaults(), - }) - - -- Add Help entry aliases for e.g. making it identifiable by the lookup tool [doc_identifier] - if minetest.get_modpath("doc") then - if nodeid ~= "00000000" then - doc.add_entry_alias("nodes", "mesecons:wire_00000000_off", "nodes", "mesecons:wire_"..nodeid.."_off") - end - doc.add_entry_alias("nodes", "mesecons:wire_00000000_off", "nodes", "mesecons:wire_"..nodeid.."_on") - end -end -end -end -end -end -end -end -end - --- Updating the wires: --- Place the right connection wire - -local update_on_place_dig = function (pos, node) - if minetest.registered_nodes[node.name] - and minetest.registered_nodes[node.name].mesecons then - mesecon:update_autoconnect(pos) - end -end - -minetest.register_on_placenode(update_on_place_dig) -minetest.register_on_dignode(update_on_place_dig) - -function mesecon:update_autoconnect(pos, secondcall, replace_old) - local xppos = {x=pos.x+1, y=pos.y, z=pos.z} - local zppos = {x=pos.x, y=pos.y, z=pos.z+1} - local xmpos = {x=pos.x-1, y=pos.y, z=pos.z} - local zmpos = {x=pos.x, y=pos.y, z=pos.z-1} - - local xpympos = {x=pos.x+1, y=pos.y-1, z=pos.z} - local zpympos = {x=pos.x, y=pos.y-1, z=pos.z+1} - local xmympos = {x=pos.x-1, y=pos.y-1, z=pos.z} - local zmympos = {x=pos.x, y=pos.y-1, z=pos.z-1} - - local xpypos = {x=pos.x+1, y=pos.y+1, z=pos.z} - local zpypos = {x=pos.x, y=pos.y+1, z=pos.z+1} - local xmypos = {x=pos.x-1, y=pos.y+1, z=pos.z} - local zmypos = {x=pos.x, y=pos.y+1, z=pos.z-1} - - if secondcall == nil then - mesecon:update_autoconnect(xppos, true) - mesecon:update_autoconnect(zppos, true) - mesecon:update_autoconnect(xmpos, true) - mesecon:update_autoconnect(zmpos, true) - - mesecon:update_autoconnect(xpypos, true) - mesecon:update_autoconnect(zpypos, true) - mesecon:update_autoconnect(xmypos, true) - mesecon:update_autoconnect(zmypos, true) - - mesecon:update_autoconnect(xpympos, true) - mesecon:update_autoconnect(zpympos, true) - mesecon:update_autoconnect(xmympos, true) - mesecon:update_autoconnect(zmympos, true) - end - - local nodename = minetest.get_node(pos).name - if string.find(nodename, "mesecons:wire_") == nil and not replace_old then return nil end - - if mesecon:rules_link_anydir(pos, xppos) then xp = 1 else xp = 0 end - if mesecon:rules_link_anydir(pos, xmpos) then xm = 1 else xm = 0 end - if mesecon:rules_link_anydir(pos, zppos) then zp = 1 else zp = 0 end - if mesecon:rules_link_anydir(pos, zmpos) then zm = 1 else zm = 0 end - - if mesecon:rules_link_anydir(pos, xpympos) then xp = 1 end - if mesecon:rules_link_anydir(pos, xmympos) then xm = 1 end - if mesecon:rules_link_anydir(pos, zpympos) then zp = 1 end - if mesecon:rules_link_anydir(pos, zmympos) then zm = 1 end - - if mesecon:rules_link_anydir(pos, xpypos) then xpy = 1 else xpy = 0 end - if mesecon:rules_link_anydir(pos, zpypos) then zpy = 1 else zpy = 0 end - if mesecon:rules_link_anydir(pos, xmypos) then xmy = 1 else xmy = 0 end - if mesecon:rules_link_anydir(pos, zmypos) then zmy = 1 else zmy = 0 end - - if xpy == 1 then xp = 1 end - if zpy == 1 then zp = 1 end - if xmy == 1 then xm = 1 end - if zmy == 1 then zm = 1 end - - local nodeid = tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm ).. - tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy) - - - if string.find(nodename, "_off") ~= nil then - minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_off"}) - else - minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_on" }) - end -end - -minetest.register_alias("mesecons:redstone", "mesecons:wire_00000000_off") - -minetest.register_craft({ - type = "cooking", - output = "mesecons:redstone", - recipe = "mcl_core:stone_with_redstone", - cooktime = 10, -}) - - diff --git a/mods/ITEMS/REDSTONE/mesecons_alias/init.lua b/mods/ITEMS/REDSTONE/mesecons_alias/init.lua index a27d1a5b..111a4b1c 100644 --- a/mods/ITEMS/REDSTONE/mesecons_alias/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_alias/init.lua @@ -1,9 +1,5 @@ -- This file registers aliases for the /give /giveme commands. -minetest.register_alias("mesecons:removestone", "mesecons_random:removestone") -minetest.register_alias("mesecons:power_plant", "mesecons_powerplant:power_plant") -minetest.register_alias("mesecons:powerplant", "mesecons_powerplant:power_plant") -minetest.register_alias("mesecons:meselamp", "mesecons_lamp:lamp_off") minetest.register_alias("mesecons:mesecon", "mesecons:wire_00000000_off") minetest.register_alias("mesecons:object_detector", "mesecons_detector:object_detector_off") minetest.register_alias("mesecons:wireless_inverter", "mesecons_wireless:wireless_inverter_on") @@ -12,18 +8,18 @@ minetest.register_alias("mesecons:wireless_transmitter", "mesecons_wireless:wire minetest.register_alias("mesecons:switch", "mesecons_switch:mesecon_switch_off") minetest.register_alias("mesecons:button", "mesecons_button:button_off") minetest.register_alias("mesecons:piston", "mesecons_pistons:piston_normal_off") -minetest.register_alias("mesecons:blinky_plant", "mesecons_blinkyplant:blinky_plant_off") minetest.register_alias("mesecons:mesecon_torch", "mesecons_torch:mesecon_torch_on") minetest.register_alias("mesecons:torch", "mesecons_torch:mesecon_torch_on") -minetest.register_alias("mesecons:hydro_turbine", "mesecons_hydroturbine:hydro_turbine_off") minetest.register_alias("mesecons:pressure_plate_stone", "mesecons_pressureplates:pressure_plate_stone_off") minetest.register_alias("mesecons:pressure_plate_wood", "mesecons_pressureplates:pressure_plate_wood_off") +minetest.register_alias("mesecons:pressure_plate_birchwood", "mesecons_pressureplates:pressure_plate_birchwood_off") +minetest.register_alias("mesecons:pressure_plate_acaciawood", "mesecons_pressureplates:pressure_plate_acaciawood_off") +minetest.register_alias("mesecons:pressure_plate_darkwood", "mesecons_pressureplates:pressure_plate_darkwood_off") +minetest.register_alias("mesecons:pressure_plate_sprucewood", "mesecons_pressureplates:pressure_plate_sprucewood_off") +minetest.register_alias("mesecons:pressure_plate_junglewood", "mesecons_pressureplates:pressure_plate_junglewood_off") minetest.register_alias("mesecons:mesecon_socket", "mesecons_temperest:mesecon_socket_off") minetest.register_alias("mesecons:mesecon_inverter", "mesecons_temperest:mesecon_inverter_on") -minetest.register_alias("mesecons:movestone", "mesecons_movestones:movestone") -minetest.register_alias("mesecons:sticky_movestone", "mesecons_movestones:sticky_movestone") minetest.register_alias("mesecons:noteblock", "mesecons_noteblock:noteblock") -minetest.register_alias("mesecons:microcontroller", "mesecons_microcontroller:microcontroller0000") minetest.register_alias("mesecons:delayer", "mesecons_delayer:delayer_off_1") minetest.register_alias("mesecons:solarpanel", "mesecons_solarpanel:solar_panel_off") diff --git a/mods/ITEMS/REDSTONE/mesecons_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index 4db6b375..5ff15ecc 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_button/init.lua @@ -1,34 +1,9 @@ -- WALL BUTTON --- A button that when pressed emits power for 1 second --- and then turns off again +-- A button that when pressed emits power for a short moment and then turns off again --- FIXME: Power lower/upper nodes as well -local button_get_output_rules = function(node) - local rules = { - {x = -1, y = 0, z = 0}, - {x = 1, y = 0, z = 0}, - {x = 0, y = 0, z = -1}, - {x = 0, y = 0, z = 1}, - {x = 0, y = -1, z = 0}, - } - if minetest.wallmounted_to_dir(node.param2).y == 1 then - table.insert(rules, {x=0, y=1, z=1}) - end - return rules -end +local S = minetest.get_translator("mesecons_button") -mesecon.button_turnoff = function (pos) - local node = minetest.get_node(pos) - if node.name=="mesecons_button:button_stone_on" then --has not been dug - mesecon:swap_node(pos, "mesecons_button:button_stone_off") - minetest.sound_play("mesecons_button_pop", {pos=pos}) - mesecon:receptor_off(pos, button_get_output_rules(node)) - elseif node.name=="mesecons_button:button_wood_on" then --has not been dug - mesecon:swap_node(pos, "mesecons_button:button_wood_off") - minetest.sound_play("mesecons_button_pop", {pos=pos}) - mesecon:receptor_off(pos, button_get_output_rules(node)) - end -end +local button_get_output_rules = mesecon.rules.wallmounted_get local boxes_off = { type = "wallmounted", @@ -43,6 +18,20 @@ local boxes_on = { wall_top = { -4/16, 7/16, -2/16, 4/16, 8/16, 2/16 }, } +-- Push the button +mesecon.push_button = function(pos, node) + -- No-op if button is already pushed + if mesecon.is_receptor_on(node) then + return + end + local def = minetest.registered_nodes[node.name] + minetest.set_node(pos, {name="mesecons_button:button_"..def._mcl_button_basename.."_on", param2=node.param2}) + mesecon.receptor_on(pos, button_get_output_rules(node)) + minetest.sound_play("mesecons_button_push", {pos=pos}, true) + local timer = minetest.get_node_timer(pos) + timer:start(def._mcl_button_timer) +end + local on_button_place = function(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then -- no interaction possible with entities @@ -84,151 +73,165 @@ local on_button_place = function(itemstack, placer, pointed_thing) if success then if idef.sounds and idef.sounds.place then - --minetest.sound_play(idef.sounds.place, {pos=above, gain=1}) + minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true) end end return itemstack end -local buttonuse = "Rightclick the button to push it." -minetest.register_node("mesecons_button:button_stone_off", { - drawtype = "nodebox", - tiles = {"default_stone.png"}, - wield_image = "default_stone.png^[mask:mesecons_button_wield_mask.png", - -- FIXME: Use proper 3D inventory image - inventory_image = "default_stone.png^[mask:mesecons_button_wield_mask.png", - wield_scale = { x=1, y=1, z=1}, - paramtype = "light", - paramtype2 = "wallmounted", - is_ground_content = false, - walkable = false, - sunlight_propagates = true, - node_box = boxes_off, - groups = {handy=1,pickaxey=1, attached_node=1, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1}, - description = "Stone Button", - _doc_items_longdesc = "A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second. It can only be placed on solid opaque full cubes (like cobblestone).", - _doc_items_usagehelp = buttonuse, - on_place = on_button_place, - node_placement_prediction = "", - on_rightclick = function (pos, node) - mesecon:swap_node(pos, "mesecons_button:button_stone_on") - mesecon:receptor_on(pos, button_get_output_rules(node)) - minetest.sound_play("mesecons_button_push", {pos=pos}) - minetest.after(1, mesecon.button_turnoff, pos) - end, - sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {receptor = { - state = mesecon.state.off, - rules = button_get_output_rules, - }}, - _mcl_blast_resistance = 2.5, - _mcl_hardness = 0.5, -}) +local buttonuse = S("Use the button to push it.") -minetest.register_node("mesecons_button:button_stone_on", { - drawtype = "nodebox", - tiles = {"default_stone.png"}, - wield_image = "default_stone.png^[mask:mesecons_button_wield_mask.png", - inventory_image = "default_stone.png^[mask:mesecons_button_wield_mask.png", - wield_scale = { x=1, y=1, z=0.5}, - paramtype = "light", - paramtype2 = "wallmounted", - is_ground_content = false, - walkable = false, - sunlight_propagates = true, - node_box = boxes_on, - groups = {handy=1,pickaxey=1, not_in_creative_inventory=1, attached_node=1, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1}, - drop = 'mesecons_button:button_stone_off', - description = "Stone Button", - _doc_items_create_entry = false, - node_placement_prediction = "", - sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {receptor = { - state = mesecon.state.on, - rules = button_get_output_rules - }}, - _mcl_blast_resistance = 2.5, - _mcl_hardness = 0.5, -}) +mesecon.register_button = function(basename, description, texture, recipeitem, sounds, plusgroups, button_timer, push_by_arrow, longdesc) + local groups_off = table.copy(plusgroups) + groups_off.attached_node=1 + groups_off.dig_by_water=1 + groups_off.destroy_by_lava_flow=1 + groups_off.dig_by_piston=1 + groups_off.button=1 -- button (off) -minetest.register_node("mesecons_button:button_wood_off", { - drawtype = "nodebox", - tiles = {"default_wood.png"}, - wield_image = "default_wood.png^[mask:mesecons_button_wield_mask.png", - inventory_image = "default_wood.png^[mask:mesecons_button_wield_mask.png", - wield_scale = { x=1, y=1, z=1}, - paramtype = "light", - paramtype2 = "wallmounted", - is_ground_content = false, - walkable = false, - sunlight_propagates = true, - node_box = boxes_off, - groups = {handy=1,axey=1, attached_node=1, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1}, - description = "Wooden Button", - _doc_items_longdesc = "A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. It can only be placed on solid opaque full cubes (like cobblestone).", - _doc_items_usagehelp = buttonuse, - on_place = on_button_place, - node_placement_prediction = "", - on_rightclick = function (pos, node) - mesecon:swap_node(pos, "mesecons_button:button_wood_on") - mesecon:receptor_on(pos, button_get_output_rules(node)) - minetest.sound_play("mesecons_button_push", {pos=pos}) - minetest.after(1.5, mesecon.button_turnoff, pos) - end, - sounds = mcl_sounds.node_sound_wood_defaults(), - mesecons = {receptor = { - state = mesecon.state.off, - rules = button_get_output_rules, - }}, - _mcl_blast_resistance = 2.5, - _mcl_hardness = 0.5, -}) + local groups_on = table.copy(groups_off) + groups_on.not_in_creative_inventory=1 + groups_on.button=2 -- button (on) -minetest.register_node("mesecons_button:button_wood_on", { - drawtype = "nodebox", - tiles = {"default_wood.png"}, - wield_image = "default_wood.png^[mask:mesecons_button_wield_mask.png", - inventory_image = "default_wood.png^[mask:mesecons_button_wield_mask.png", - wield_scale = { x=1, y=1, z=0.5}, - paramtype = "light", - paramtype2 = "wallmounted", - is_ground_content = false, - walkable = false, - sunlight_propagates = true, - node_box = boxes_on, - groups = {handy=1,axey=1, not_in_creative_inventory=1, attached_node=1, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1}, - drop = 'mesecons_button:button_wood_off', - description = "Wooden Button", - _doc_items_create_entry = false, - node_placement_prediction = "", - sounds = mcl_sounds.node_sound_wood_defaults(), - mesecons = {receptor = { - state = mesecon.state.on, - rules = button_get_output_rules, - }}, - _mcl_blast_resistance = 2.5, - _mcl_hardness = 0.5, -}) + if push_by_arrow then + groups_off.button_push_by_arrow = 1 + groups_on.button_push_by_arrow = 1 + end + local tt = S("Provides redstone power when pushed") + tt = tt .. "\n" .. S("Push duration: @1s", string.format("%.1f", button_timer)) + if push_by_arrow then + tt = tt .. "\n" .. S("Pushable by arrow") + end + minetest.register_node("mesecons_button:button_"..basename.."_off", { + drawtype = "nodebox", + tiles = {texture}, + wield_image = "mesecons_button_wield_mask.png^"..texture.."^mesecons_button_wield_mask.png^[makealpha:255,126,126", + -- FIXME: Use proper 3D inventory image + inventory_image = "mesecons_button_wield_mask.png^"..texture.."^mesecons_button_wield_mask.png^[makealpha:255,126,126", + wield_scale = { x=1, y=1, z=1}, + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = false, + walkable = false, + sunlight_propagates = true, + node_box = boxes_off, + groups = groups_off, + description = description, + _tt_help = tt, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = buttonuse, + on_place = on_button_place, + node_placement_prediction = "", + on_rightclick = function (pos, node) + mesecon.push_button(pos, node) + end, + sounds = sounds, + mesecons = {receptor = { + state = mesecon.state.off, + rules = button_get_output_rules, + }}, + _mcl_button_basename = basename, + _mcl_button_timer = button_timer, -minetest.register_craft({ - output = 'mesecons_button:button_stone_off', - recipe = { - {'mcl_core:stone'}, - } -}) + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + }) -minetest.register_craft({ - output = 'mesecons_button:button_wood_off', - recipe = { - {'group:wood'}, - } -}) + minetest.register_node("mesecons_button:button_"..basename.."_on", { + drawtype = "nodebox", + tiles = {texture}, + wield_image = "mesecons_button_wield_mask.png^"..texture.."^mesecons_button_wield_mask.png^[makealpha:255,126,126", + wield_scale = { x=1, y=1, z=0.5}, + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = false, + walkable = false, + sunlight_propagates = true, + node_box = boxes_on, + groups = groups_on, + drop = 'mesecons_button:button_'..basename..'_off', + _doc_items_create_entry = false, + node_placement_prediction = "", + sounds = sounds, + mesecons = {receptor = { + state = mesecon.state.on, + rules = button_get_output_rules + }}, + _mcl_button_basename = basename, + _mcl_button_timer = button_timer, + on_timer = function(pos, elapsed) + local node = minetest.get_node(pos) + if node.name=="mesecons_button:button_"..basename.."_on" then --has not been dug + -- Is button pushable by arrow? + if push_by_arrow then + -- If there's an arrow stuck in the button, keep it pressed and check + -- it again later. + local objs = minetest.get_objects_inside_radius(pos, 1) + for o=1, #objs do + local entity = objs[o]:get_luaentity() + if entity and entity.name == "mcl_bows:arrow_entity" then + local timer = minetest.get_node_timer(pos) + timer:start(button_timer) + return + end + end + end -minetest.register_craft({ - type = "fuel", - recipe = 'mesecons_button:button_wood_off', - burntime = 5, -}) + -- Normal operation: Un-press the button + minetest.set_node(pos, {name="mesecons_button:button_"..basename.."_off",param2=node.param2}) + minetest.sound_play("mesecons_button_pop", {pos=pos}, true) + mesecon.receptor_off(pos, button_get_output_rules(node)) + end + end, + + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + }) + + minetest.register_craft({ + output = "mesecons_button:button_"..basename.."_off", + recipe = {{ recipeitem }}, + }) +end + +mesecon.register_button( + "stone", + S("Stone Button"), + "default_stone.png", + "mcl_core:stone", + mcl_sounds.node_sound_stone_defaults(), + {material_stone=1,handy=1,pickaxey=1}, + 1, + false, + S("A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.")) + +local woods = { + { "wood", "mcl_core:wood", "default_wood.png", S("Oak Button") }, + { "acaciawood", "mcl_core:acaciawood", "default_acacia_wood.png", S("Acacia Button") }, + { "birchwood", "mcl_core:birchwood", "mcl_core_planks_birch.png", S("Birch Button") }, + { "darkwood", "mcl_core:darkwood", "mcl_core_planks_big_oak.png", S("Dark Oak Button") }, + { "sprucewood", "mcl_core:sprucewood", "mcl_core_planks_spruce.png", S("Spruce Button") }, + { "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Button") }, +} + +for w=1, #woods do + mesecon.register_button( + woods[w][1], + woods[w][4], + woods[w][3], + woods[w][2], + mcl_sounds.node_sound_wood_defaults(), + {material_wood=1,handy=1,axey=1}, + 1.5, + true, + S("A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.")) + + minetest.register_craft({ + type = "fuel", + recipe = "mesecons_button:button_"..woods[w][1].."_off", + burntime = 5, + }) +end -- Add entry aliases for the Help if minetest.get_modpath("doc") then diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr new file mode 100644 index 00000000..9b311b9a --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr @@ -0,0 +1,14 @@ +# textdomain: mesecons_button +Use the button to push it.=Benutzen Sie den Knopf, um ihn zu drücken. +Stone Button=Steinknopf +A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Ein Steinknopf ist eine Redstonekomponente aus Stein. Er kann gedrückt werden, um ein Redstonesignal zu senden. Im gedrückten Zustand versorgt er benachbarte Redstonekomponenten für 1 Sekunde mit Redstoneenergie. +Oak Button=Eichenknopf +Acacia Button=Akazienknopf +Birch Button=Birkenknopf +Dark Oak Button=Schwarzeichenknopf +Spruce Button=Fichtenknopf +Jungle Button=Dschungelknopf +A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.=Ein Holzknopf ist eine Redstonekomponente aus Holz. Er kann gedrückt werden, um ein Redstonesignal zu senden. Im gedrückten Zustand versorgt er benachbarte Redstonekomponenten für 1,5 Sekunden mit Redstoneenergie. Holzknöpfe können auch von Pfeilen gedrückt werden. +Provides redstone power when pushed=Gibt Redstoneenergie, wenn gedrückt +Push duration: @1s=Druckdauer: @1s +Pushable by arrow=Drückbar von Pfeilen diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.es.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.es.tr new file mode 100644 index 00000000..d793b7a9 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.es.tr @@ -0,0 +1,11 @@ +# textdomain: mesecons_button +Use the button to push it.=Usa el botón para pulsarlo. +Stone Button=Botón de piedra +A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Un botón de piedra es un componente de redstone hecho de piedra que se puede presionar para proporcionar energía de redstone. Cuando se empuja, alimenta los componentes adyacentes de redstone durante 1 segundo. +Oak Button=Botón de roble +Acacia Button=Botón de acacia +Birch Button=Botón de abedul +Dark Oak Button=Botón de roble oscuro +Spruce Button=Botón de abeto +Jungle Button=Botón de jungla +A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.=Ein Holzknopf ist eine Redstonekomponente aus Holz. Er kann gedrückt werden, um ein Redstonesignal zu senden. Im gedrückten Zustand versorgt er benachbarte Redstonekomponenten für 1,5 Sekunden mit Redstoneenergie. Holzknöpfe können auch von Pfeilen gedrückt werden. diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr new file mode 100644 index 00000000..96f963b4 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr @@ -0,0 +1,14 @@ +# textdomain: mesecons_button +Use the button to push it.=Utilisez le bouton pour le pousser. +Stone Button=Bouton de pierre +A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Un bouton en pierre est un composant Redstone en pierre qui peut être poussé pour fournir de la puissance Redstone. Lorsqu'il est poussé, il alimente les composants Redstone adjacents pendant 1 seconde. +Oak Button=Bouton en Chêne +Acacia Button=Bouton en Acacia +Birch Button=Bouton en Bouleau +Dark Oak Button=Bouton en Chêne Noir +Spruce Button=Bouton en Sapin +Jungle Button=Bouton en Acajou +A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.=Un bouton en bois est un composant de redstone en bois qui peut être poussé pour fournir une puissance de redstone. Lorsqu'il est poussé, il alimente les composants Redstone adjacents pendant 1,5 seconde. Les boutons en bois peuvent également être poussés par des flèches. +Provides redstone power when pushed=Fournit une puissance de redstone lorsqu'il est poussé +Push duration: @1s=Durée de poussée: @1s +Pushable by arrow=Poussable par une flèche diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt new file mode 100644 index 00000000..4c352b87 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt @@ -0,0 +1,14 @@ +# textdomain: mesecons_button +Use the button to push it.= +Stone Button= +A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.= +Oak Button= +Acacia Button= +Birch Button= +Dark Oak Button= +Spruce Button= +Jungle Button= +A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.= +Provides redstone power when pushed= +Push duration: @1s= +Pushable by arrow= diff --git a/mods/ITEMS/REDSTONE/mesecons_button/textures/mesecons_button_wield_mask.png b/mods/ITEMS/REDSTONE/mesecons_button/textures/mesecons_button_wield_mask.png index e553ae38..211ac43f 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_button/textures/mesecons_button_wield_mask.png and b/mods/ITEMS/REDSTONE/mesecons_button/textures/mesecons_button_wield_mask.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 3bd14ba4..44db17a4 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -1,32 +1,40 @@ - -local function initialize_data(meta) - local commands = minetest.formspec_escape(meta:get_string("commands")) -end +local S = minetest.get_translator("mesecons_commandblock") +local F = minetest.formspec_escape local function construct(pos) local meta = minetest.get_meta(pos) meta:set_string("commands", "") - initialize_data(meta) + meta:set_string("commander", "") end local function after_place(pos, placer) if placer then local meta = minetest.get_meta(pos) - initialize_data(meta) + meta:set_string("commander", placer:get_player_name()) end end local function resolve_commands(commands, pos) local players = minetest.get_connected_players() + local meta = minetest.get_meta(pos) + local commander = meta:get_string("commander") + + -- A non-printable character used while replacing “@@”. + local SUBSTITUTE_CHARACTER = '\26' -- ASCII SUB + -- No players online: remove all commands containing - -- @nearest, @farthest and @random + -- problematic placeholders. if #players == 0 then commands = commands:gsub("[^\r\n]+", function (line) - if line:find("@nearest") then return "" end - if line:find("@farthest") then return "" end - if line:find("@random") then return "" end + line = line:gsub("@@", SUBSTITUTE_CHARACTER) + if line:find("@n") then return "" end + if line:find("@p") then return "" end + if line:find("@f") then return "" end + if line:find("@r") then return "" end + line = line:gsub("@c", commander) + line = line:gsub(SUBSTITUTE_CHARACTER, "@") return line end) return commands @@ -35,7 +43,7 @@ local function resolve_commands(commands, pos) local nearest, farthest = nil, nil local min_distance, max_distance = math.huge, -1 for index, player in pairs(players) do - local distance = vector.distance(pos, player:getpos()) + local distance = vector.distance(pos, player:get_pos()) if distance < min_distance then min_distance = distance nearest = player:get_player_name() @@ -46,13 +54,17 @@ local function resolve_commands(commands, pos) end end local random = players[math.random(#players)]:get_player_name() - commands = commands:gsub("@nearest", nearest) - commands = commands:gsub("@farthest", farthest) - commands = commands:gsub("@random", random) + commands = commands:gsub("@@", SUBSTITUTE_CHARACTER) + commands = commands:gsub("@p", nearest) + commands = commands:gsub("@n", nearest) + commands = commands:gsub("@f", farthest) + commands = commands:gsub("@r", random) + commands = commands:gsub("@c", commander) + commands = commands:gsub(SUBSTITUTE_CHARACTER, "@") return commands end -local function check_commands(commands) +local function check_commands(commands, player_name) for _, command in pairs(commands:split("\n")) do local pos = command:find(" ") local cmd, param = command, "" @@ -62,7 +74,21 @@ local function check_commands(commands) local cmddef = minetest.chatcommands[cmd] if not cmddef then -- Invalid chat command - return false, cmd + local msg = S("Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.", cmd) + if string.sub(cmd, 1, 1) == "/" then + msg = S("Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.", cmd) + end + return false, minetest.colorize("#FF0000", msg) + end + if player_name then + local player_privs = minetest.get_player_privs(player_name) + + for cmd_priv, _ in pairs(cmddef.privs) do + if player_privs[cmd_priv] ~= true then + local msg = S("Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.", cmd, cmd_priv) + return false, minetest.colorize("#FF0000", msg) + end + end end end return true @@ -79,19 +105,20 @@ local function commandblock_action_on(pos, node) local commands = resolve_commands(meta:get_string("commands"), pos) for _, command in pairs(commands:split("\n")) do - local pos = command:find(" ") + local cpos = command:find(" ") local cmd, param = command, "" - if pos then - cmd = command:sub(1, pos - 1) - param = command:sub(pos + 1) + if cpos then + cmd = command:sub(1, cpos - 1) + param = command:sub(cpos + 1) end local cmddef = minetest.chatcommands[cmd] if not cmddef then -- Invalid chat command return end - local dummy_player = "" - cmddef.func(dummy_player, param) + -- Execute command in the name of commander + local commander = meta:get_string("commander") + cmddef.func(commander, param) end end @@ -102,50 +129,120 @@ local function commandblock_action_off(pos, node) end local on_rightclick = function(pos, node, player, itemstack, pointed_thing) - -- Only allow access in Creative Mode + local can_edit = true + -- Only allow write access in Creative Mode if not minetest.settings:get_bool("creative_mode") then - return + can_edit = false + end + local pname = player:get_player_name() + if minetest.is_protected(pos, pname) then + can_edit = false + end + local privs = minetest.get_player_privs(pname) + if not privs.maphack then + can_edit = false end local meta = minetest.get_meta(pos) local commands = meta:get_string("commands") - local formspec = "invsize[9,5;]" .. - "textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" .. - "label[1,3.8;@nearest, @farthest, and @random are replaced by the respective player names]" .. - "button_exit[3.3,4.5;2,1;submit;Submit]" .. - "image_button[8,4.5;1,1;doc_button_icon_lores.png;doc;]" .. - "tooltip[doc;Help]" - minetest.show_formspec(player:get_player_name(), "commandblock_"..pos.x.."_"..pos.y.."_"..pos.z, formspec) + if not commands then + commands = "" + end + local commander = meta:get_string("commander") + local commanderstr + if commander == "" or commander == nil then + commanderstr = S("Error: No commander! Block must be replaced.") + else + commanderstr = S("Commander: @1", commander) + end + local textarea_name, submit, textarea + -- If editing is not allowed, only allow read-only access. + -- Player can still view the contents of the command block. + if can_edit then + textarea_name = "commands" + submit = "button_exit[3.3,4.4;2,1;submit;"..F(S("Submit")).."]" + else + textarea_name = "" + submit = "" + end + if not can_edit and commands == "" then + textarea = "label[0.5,0.5;"..F(S("No commands.")).."]" + else + textarea = "textarea[0.5,0.5;8.5,4;"..textarea_name..";"..F(S("Commands:"))..";"..F(commands).."]" + end + local formspec = "size[9,5;]" .. + textarea .. + submit .. + "image_button[8,4.4;1,1;doc_button_icon_lores.png;doc;]" .. + "tooltip[doc;"..F(S("Help")).."]" .. + "label[0,4;"..F(commanderstr).."]" + minetest.show_formspec(pname, "commandblock_"..pos.x.."_"..pos.y.."_"..pos.z, formspec) +end + +local on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if placer and not placer: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, placer, itemstack) or itemstack + end + end + + local privs = minetest.get_player_privs(placer:get_player_name()) + if not privs.maphack then + minetest.chat_send_player(placer:get_player_name(), S("Placement denied. You need the “maphack” privilege to place command blocks.")) + return itemstack + end + + return minetest.item_place_node(itemstack, placer, pointed_thing) end minetest.register_node("mesecons_commandblock:commandblock_off", { - description = "Command Block", + description = S("Command Block"), + _tt_help = S("Executes server commands when powered by redstone power"), _doc_items_longdesc = -"Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.", +S("Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power."), _doc_items_usagehelp = -[[Using a command block which someone already placed and set up properly is easy: Just supply it with redstone power and see what happens. This will execute the commands once. To execute the commands again, turn the redstone power off and on again. +S("Everyone can activate a command block and look at its commands, but not everyone can edit and place them.").."\n\n".. -Changing the commands or breaking the command block is only possible in Creative Mode. Directly after placing, a command block does not have any commands and does nothing. Rightclick the command block (in Creative Mode!) to edit its commands. Refer to the help entry about server commands to understand how they work. Each line contains a single command, the commands will be executed from top to bottom. The commands DO NOT require a leading slash. +S("To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.").. +"\n\n".. -You can optionally use the following placeholders in your commands: -• “@nearest” is replaced by the name of the player nearest to the command block -• “@farthest” is replaced by the name of the player farthest away from the command block -• “@random” is replaced by the name of a random player currently connected]], +S("To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.").."\n\n".. + +S("All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.").."\n\n".. + +S("Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:").."\n".. +S("• “@@c”: commander of this command block").."\n".. +S("• “@@n” or “@@p”: nearest player from the command block").."\n".. +S("• “@@f” farthest player from the command block").."\n".. +S("• “@@r”: random player currently in the world").."\n".. +S("• “@@@@”: literal “@@” sign").."\n\n".. + +S("Example 1:\n time 12000\nSets the game clock to 12:00").."\n\n".. + +S("Example 2:\n give @@n mcl_core:apple 5\nGives the nearest player 5 apples"), tiles = {{name="jeija_commandblock_off.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=2}}}, - groups = {creative_breakable=1, mesecon_effector_off=1, not_in_creative_inventory=1}, + groups = {creative_breakable=1, mesecon_effector_off=1}, drop = "", on_blast = function() end, on_construct = construct, is_ground_content = false, + on_place = on_place, after_place_node = after_place, on_rightclick = on_rightclick, sounds = mcl_sounds.node_sound_stone_defaults(), mesecons = {effector = { - action_on = commandblock_action_on + action_on = commandblock_action_on, + rules = mesecon.rules.alldirs, }}, - _mcl_blast_resistance = 18000000, + _mcl_blast_resistance = 3600000, _mcl_hardness = -1, }) @@ -156,51 +253,52 @@ minetest.register_node("mesecons_commandblock:commandblock_on", { on_blast = function() end, on_construct = construct, is_ground_content = false, + on_place = on_place, after_place_node = after_place, on_rightclick = on_rightclick, sounds = mcl_sounds.node_sound_stone_defaults(), mesecons = {effector = { - action_off = commandblock_action_off + action_off = commandblock_action_off, + rules = mesecon.rules.alldirs, }}, - _mcl_blast_resistance = 18000000, + _mcl_blast_resistance = 3600000, _mcl_hardness = -1, }) minetest.register_on_player_receive_fields(function(player, formname, fields) if string.sub(formname, 1, 13) == "commandblock_" then - if not fields.submit and not fields.doc then - return - end if fields.doc and minetest.get_modpath("doc") then doc.show_entry(player:get_player_name(), "nodes", "mesecons_commandblock:commandblock_off", true) return end + if (not fields.submit and not fields.key_enter) or (not fields.commands) then + return + end + + local privs = minetest.get_player_privs(player:get_player_name()) + if not privs.maphack then + minetest.chat_send_player(player:get_player_name(), S("Access denied. You need the “maphack” privilege to edit command blocks.")) + return + end + local index, _, x, y, z = string.find(formname, "commandblock_(-?%d+)_(-?%d+)_(-?%d+)") if index ~= nil and x ~= nil and y ~= nil and z ~= nil then local pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} local meta = minetest.get_meta(pos) if not minetest.settings:get_bool("creative_mode") then - minetest.chat_send_player(player:get_player_name(), "Editing the command block has failed! You can only change the command block in Creative Mode!") + minetest.chat_send_player(player:get_player_name(), S("Editing the command block has failed! You can only change the command block in Creative Mode!")) return end - local check, bad_command = check_commands(fields.commands) + local check, error_message = check_commands(fields.commands, player:get_player_name()) if check == false then - local msg - if bad_command ~= nil and bad_command ~= "" then - msg = "Warning: The command “"..bad_command.."” does not exist; your command block won't do anything. See the help command for a list of available commands." - if string.sub(bad_command, 1, 1) == "/" then - msg = msg .. " Hint: Try to remove the trailing slash" - end - else - msg = "Warning: You have entered an unknown command; your command block won't do anything.. See the help command for a list of available commands." - end - minetest.chat_send_player(player:get_player_name(), msg) + -- Command block rejected + minetest.chat_send_player(player:get_player_name(), error_message) + return + else + meta:set_string("commands", fields.commands) end - - meta:set_string("commands", fields.commands) - initialize_data(meta) else - minetest.chat_send_player(player:get_player_name(), "Editing the command block has failed! The command block is gone.") + minetest.chat_send_player(player:get_player_name(), S("Editing the command block has failed! The command block is gone.")) end end end) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr new file mode 100644 index 00000000..d114a47b --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr @@ -0,0 +1,29 @@ +# textdomain: mesecons_commandblock +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.=Fehler: Der Befehl „@1“ existiert nicht; Ihr Befehlsblock bleibt unverändert. Benutzen Sie den Chatbefehl „help“ für eine Liste der verfügbaren Befehle. +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.=Fehler: Der Befehl „@1“ existiert nicht; Ihr Befehlsblock bleibt unverändert. Benutzen Sie den Chatbefehl „help“ für eine Liste der verfügbaren Befehle. Tipp: Versuchen Sie, den Schrägstrich am Anfang zu entfernen. +Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Fehler: Sie haben nicht die ausreichenden Privilegien, um den Befehl „@1“ zu benutzen (fehlendes Privileg: @2)! Der Befehlsblock bleibt unverändert. +Error: No commander! Block must be replaced.=Fehler: Kein Kommandant! Block muss ersetzt werden. +Commander: @1=Kommandant: @1 +Submit=OK +No commands.=Keine Befehle. +Commands:=Befehle: +Help=Hilfe +Placement denied. You need the “maphack” privilege to place command blocks.=Platzierung fehlgeschlagen. Sie brauchen das „maphack“-Privileg, um Befehlsblöcke platzieren zu können. +Command Block=Befehlsblock +Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.=Befehlsblöcke sind mächtige Redstonekomponenten, die das Gefüge der Realität selbst verändern können. Mit anderen Worten, sie lassen den Server Serverbefehle ausführen, wenn sie mit Redstoneenergie versorgt werden. +Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Jeder kann einen Befehlsblock aktivieren und sich seine Befehle ansehen, aber nicht jeder kann sie bearbeiten und platzieren. +To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Um die Befehle in einem Befehlsblock zu betrachten, benutzen Sie ihn. Um ihn zu aktivieren, versorgen Sie ihn einfach mit Redstoneenergie. Das wird die Befehle einmalig ausführen. Um sie erneut auszuführen, schalten Sie die Redstoneenergie aus und wieder ein. +To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Um einen Befehlsblock platzieren und die Befehle ändern zu können, müssen Sie im Kreativmodus sein und das „maphack“-Privileg haben. Ein neuer Befehlsblock hat keine Befehle und tut gar nichts. Benutzen Sie den Befehlsblock (im Kreativmodus!), um seine Befehle zu bearbeiten. Lesen Sie den Hilfeeintrag „Fortgeschrittenes > Serverbefehle“, um zu verstehen, wie Befehle funktionieren. Jede Zeile enthält einen einzigen Befehl. Sie geben Sie wie in der Konsole ein, aber ohne den Schrägstrich am Anfang. +All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.=Alle Befehle werden im Namen des Spielers, der den Befehlsblock platziert hat, ausgeführt, als ob der Spieler die Befehle eingegeben hätte. Diesen Spieler nennen wir den „Kommandanten“ des Blocks. +Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Befehlsblöcke unterstützen Platzhalter. Geben Sie einen dieser Platzhalter ein und sie werden durch einen anderen Text ersetzt: +• “@@c”: commander of this command block=• „@@c“: Kommandant dieses Befehlsblocks +• “@@n” or “@@p”: nearest player from the command block=• „@@n“ oder „@@p“: Nächster Spieler am Befehlsblock +• “@@f” farthest player from the command block=• „@@f“: Der vom Befehlsblock am weitesten entfernte Spieler +• “@@r”: random player currently in the world=• „@@r“: Zufälliger Spieler in der Welt +• “@@@@”: literal “@@” sign=• „@@@@“: Nur das „@@“-Zeichen +Example 1:@n time 12000@nSets the game clock to 12:00=1. Beispiel:@n time 12000@nSetzt die Spieluhr auf 12:00 Uhr +Example 2:@n give @@n mcl_core:apple 5@nGives the nearest player 5 apples=2. Beispiel:@n give @@n mcl_core:apple 5@nGibt dem nächsten Spieler 5 Äpfel +Access denied. You need the “maphack” privilege to edit command blocks.=Zugriff verweigert. Sie brauchen das „maphack“-Privileg, um Befehlsblöcke zu bearbeiten. +Editing the command block has failed! You can only change the command block in Creative Mode!=Bearbeitung des Befehlsblocks fehlgeschlagen! Sie können den Befehlsblock nur im Kreativmodus ändern! +Editing the command block has failed! The command block is gone.=Bearbeiten des Befehlsblocks fehlgeschlagen! Der Befehlsblock ist verschwunden. +Executes server commands when powered by redstone power=Führt Serverbefehle aus, wenn mit Redstoneenergie versorgt diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr new file mode 100644 index 00000000..65e59115 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr @@ -0,0 +1,29 @@ +# textdomain: mesecons_commandblock +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.=Error: el comando "@1" no existe; su bloque de comando no ha sido cambiado. Utilice el comando de chat "help" para obtener una lista de los comandos disponibles. +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.=Error: el comando "@1" no existe; su bloque de comando no ha sido cambiado. Utilice el comando de chat "help" para obtener una lista de los comandos disponibles. Sugerencia: intente eliminar la barra diagonal inicial. +Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Error: ¡No tiene suficientes privilegios para usar el comando “@ 1” (faltan privilegios: @ 2)! El bloque de comando no ha sido cambiado. +Error: No commander! Block must be replaced.=Error: ¡Sin dueño! El bloque debe ser reemplazado. +Commander: @1=Dueño: @1 +Submit=Aceptar +No commands.=Sin comandos. +Commands:=Comandos: +Help=Ayuda +Placement denied. You need the “maphack” privilege to place command blocks.=Colocación denegada. Necesita el privilegio "maphack" para colocar bloques de comandos. +Command Block=Bloque de comandos +Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.=Los bloques de comandos son poderosos componentes de redstone que pueden alterar la realidad misma. En otras palabras, hacen que el servidor ejecute comandos del servidor cuando se les suministra energía redstone. +Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Todos pueden activar un bloque de comandos y ver sus comandos, pero no todos pueden editarlos y colocarlos. +To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Para ver los comandos en un bloque de comandos, úselo. Para activar el bloque de comando, solo suminístrelo con redstone power. Esto ejecutará los comandos una vez. Para ejecutar los comandos nuevamente, apague y vuelva a encender la redstone. +To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Para poder colocar un bloque de comandos y cambiar los comandos, debe estar en modo creativo y debe tener el privilegio de "maphack". Un nuevo bloque de comandos no tiene ningún comando y no hace nada. Use el bloque de comandos (en modo creativo) para editar sus comandos. Lea la entrada de ayuda "Temas avanzados> Comandos del servidor" para comprender cómo funcionan los comandos. Cada línea contiene un solo comando. Los ingresas como lo harías en la consola, pero sin la barra inclinada. Los comandos se ejecutarán de arriba a abajo. + +All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.=Todos los comandos se ejecutarán en el nombre del jugador que colocó el bloque de comandos, como si el jugador tecleara los comandos. Se dice que este jugador es el "dueño" del bloque. +Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Los bloques de comando admiten marcadores de posición, inserte uno de estos marcadores de posición y serán reemplazados por otro texto: +• “@@c”: commander of this command block=• "@@c“: dueño de este bloque de comandos +• “@@n” or “@@p”: nearest player from the command block=• "@@n“ o "@@p“: jugador más cercano del bloque de comandos +• “@@f” farthest player from the command block=• "@@f“: jugador más alejado del bloque de comandos +• “@@r”: random player currently in the world=• "@@r“: jugador aleatorio actualmente en el mundo +• “@@@@”: literal “@@” sign=• „@@@@“: literal "@@“ firmado +Example 1:@n time 12000@nSets the game clock to 12:00=1. Ejemplo:@n time 12000@nConfigura el reloj del juego a las 12:00 +Example 2:@n give @@n mcl_core:apple 5@nGives the nearest player 5 apples=2. Beispiel:@n give @@n mcl_core:apple 5@nDa al jugador más cercano a 5 manzanas +Access denied. You need the “maphack” privilege to edit command blocks.=Acceso denegado. Necesita el privilegio "maphack" para editar bloques de comandos. +Editing the command block has failed! You can only change the command block in Creative Mode!=¡La edición del bloque de comando ha fallado! ¡Solo puede cambiar el bloque de comandos en modo creativo! +Editing the command block has failed! The command block is gone.=¡La edición del bloque de comando ha fallado! El bloque de comando se ha ido. diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.fr.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.fr.tr new file mode 100644 index 00000000..739f6ece --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.fr.tr @@ -0,0 +1,29 @@ +# textdomain: mesecons_commandblock +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.=Erreur: la commande "@1" n'existe pas; votre bloc de commande n'a pas été modifié. Utilisez la commande de discussion "help" pour obtenir la liste des commandes disponibles. +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.=Erreur: la commande "@1" n'existe pas; votre bloc de commande n'a pas été modifié. Utilisez la commande de discussion "help" pour obtenir la liste des commandes disponibles. Astuce: essayez de supprimer la barre oblique principale. +Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Erreur: vous ne disposez pas de privilèges suffisants pour utiliser la commande "@1" (privilège manquant: @2)! Le bloc de commandes n'a pas été modifié. +Error: No commander! Block must be replaced.=Erreur: pas de commandant! Le bloc doit être remplacé. +Commander: @1=Commandant: @1 +Submit=Soumettre +No commands.=Aucune commande. +Commands:=Commandes: +Help=Aide +Placement denied. You need the “maphack” privilege to place command blocks.=Placement refusé. Vous avez besoin du privilège "maphack" pour placer des blocs de commande. +Command Block=Bloc de Commande +Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.=Les blocs de commande sont des composants redstone puissants qui sont capables de modifier la réalité elle-même. En d'autres termes, ils obligent le serveur à exécuter des commandes serveur lorsqu'ils sont alimentés en redstone. +Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Tout le monde peut activer un bloc de commandes et consulter ses commandes, mais tout le monde ne peut pas les modifier et les placer. +To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Pour afficher les commandes dans un bloc de commandes, utilisez-le. Pour activer le bloc de commande, il suffit de l'alimenter en redstone. Cela exécutera les commandes une fois. Pour exécuter à nouveau les commandes, éteignez puis rallumez le Redstone. +To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Pour pouvoir placer un bloc de commande et modifier les commandes, vous devez être en mode créatif et avoir le privilège "maphack". Un nouveau bloc de commandes n'a aucune commande et ne fait rien. Utilisez le bloc de commande (en mode créatif!) Pour modifier ses commandes. Lisez l'entrée d'aide "Rubriques avancées> Commandes du serveur" pour comprendre le fonctionnement des commandes. Chaque ligne contient une seule commande. Vous les entrez comme vous le feriez dans la console, mais sans la barre oblique principale. Les commandes seront exécutées de haut en bas. +All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.=Toutes les commandes seront exécutées au nom du joueur qui a placé le bloc de commande, comme si le joueur avait tapé les commandes. Ce joueur est appelé le "commandant" du bloc. +Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Les blocs de commande prennent en charge les espaces réservés, insérez l'un de ces espaces réservés et ils seront remplacés par un autre texte: +• “@@c”: commander of this command block=• “@@c”: commandant de ce bloc que commande +• “@@n” or “@@p”: nearest player from the command block=• “@@n” or “@@p”: joueur le plus proche du bloc de commande +• “@@f” farthest player from the command block=• “@@f” : joueur le plus éloigné du bloc de commande +• “@@r”: random player currently in the world=• “@@r”: joueur aléatoire actuellement dans le monde +• “@@@@”: literal “@@” sign= • “@@@@”: literalement le symbole “@@” +Example 1:@n time 12000@nSets the game clock to 12:00=Exemple 1:@n time 12000@nRègle l'horloge du jeu sur 12:00 +Example 2:@n give @@n mcl_core:apple 5@nGives the nearest player 5 apples=Exemple 2:@n give @@n mcl_core:apple 5@nDonne au joueur le plus proche 5 pommes +Access denied. You need the “maphack” privilege to edit command blocks.=Accès refusé. Vous avez besoin du privilège "maphack" pour modifier les blocs de commande. +Editing the command block has failed! You can only change the command block in Creative Mode!=La modification du bloc de commandes a échoué! Vous ne pouvez modifier le bloc de commandes qu'en mode créatif! +Editing the command block has failed! The command block is gone.=La modification du bloc de commandes a échoué! Le bloc de commande a disparu. +Executes server commands when powered by redstone power=Exécute les commandes du serveur lorsqu'il est alimenté par l'alimentation Redstone diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt new file mode 100644 index 00000000..c03e0d1d --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt @@ -0,0 +1,29 @@ +# textdomain: mesecons_commandblock +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.= +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.= +Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.= +Error: No commander! Block must be replaced.= +Commander: @1= +Submit= +No commands.= +Commands:= +Help= +Placement denied. You need the “maphack” privilege to place command blocks.= +Command Block= +Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.= +Everyone can activate a command block and look at its commands, but not everyone can edit and place them.= +To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.= +To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.= +All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.= +Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:= +• “@@c”: commander of this command block= +• “@@n” or “@@p”: nearest player from the command block= +• “@@f” farthest player from the command block= +• “@@r”: random player currently in the world= +• “@@@@”: literal “@@” sign= +Example 1:@n time 12000@nSets the game clock to 12:00= +Example 2:@n give @@n mcl_core:apple 5@nGives the nearest player 5 apples= +Access denied. You need the “maphack” privilege to edit command blocks.= +Editing the command block has failed! You can only change the command block in Creative Mode!= +Editing the command block has failed! The command block is gone.= +Executes server commands when powered by redstone power= diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/depends.txt b/mods/ITEMS/REDSTONE/mesecons_delayer/depends.txt index 4fdbda79..14ced930 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/depends.txt +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/depends.txt @@ -1,2 +1,3 @@ mesecons doc? +screwdriver? diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua index 3cfdcfc2..80489814 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua @@ -1,8 +1,13 @@ +local S = minetest.get_translator("mesecons_delayer") + +local DELAYS = { 0.1, 0.2, 0.3, 0.4 } +local DEFAULT_DELAY = DELAYS[1] + -- Function that get the input/output rules of the delayer local delayer_get_output_rules = function(node) - local rules = {{x = -1, y = 0, z = 0}} + local rules = {{x = -1, y = 0, z = 0, spread=true}} for i = 0, node.param2 do - rules = mesecon:rotate_rules_left(rules) + rules = mesecon.rotate_rules_left(rules) end return rules end @@ -10,35 +15,131 @@ end local delayer_get_input_rules = function(node) local rules = {{x = 1, y = 0, z = 0}} for i = 0, node.param2 do - rules = mesecon:rotate_rules_left(rules) + rules = mesecon.rotate_rules_left(rules) end return rules end +-- Return the sides of a delayer. +-- Those are used to toggle the lock state. +local delayer_get_sides = function(node) + local rules = { + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1}, + } + for i = 0, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + return rules +end + +-- Make the repeater at pos try to lock any repeater it faces. +-- Returns true if a repeater was locked. +local check_lock_repeater = function(pos, node) + -- Check the repeater at pos and look if it faces + -- a repeater placed sideways. + -- If yes, lock the second repeater. + local r = delayer_get_output_rules(node)[1] + local lpos = vector.add(pos, r) + local lnode = minetest.get_node(lpos) + local ldef = minetest.registered_nodes[lnode.name] + local g = minetest.get_item_group(lnode.name, "redstone_repeater") + if g >= 1 and g <= 4 then + local lrs = delayer_get_input_rules(lnode) + local fail = false + for _, lr in pairs(lrs) do + if lr.x == r.x or lr.z == r.z then + fail = true + break + end + end + if not fail then + minetest.set_node(lpos, {name=ldef.delayer_lockstate, param2=lnode.param2}) + local meta = minetest.get_meta(lpos) + -- Metadata: delay. Used to remember the delay for locked repeaters. + -- The number is the torch position (1-4). + meta:set_int("delay", g) + return true + end + end + return false +end + +-- Make the repeater at pos try to unlock any repeater it faces. +-- Returns true if a repeater was unlocked. +local check_unlock_repeater = function(pos, node) + -- Check the repeater at pos and look if it faces + -- a repeater placed sideways. + -- If yes, also check if the second repeater doesn't receive + -- a locking signal on the other side. If not, unlock the second repeater. + local r = delayer_get_output_rules(node)[1] + local lpos = vector.add(pos, r) + local lnode = minetest.get_node(lpos) + local ldef = minetest.registered_nodes[lnode.name] + local g = minetest.get_item_group(lnode.name, "redstone_repeater") + -- Are we facing a locked repeater? + if g == 5 then + -- First check the orientation of the faced repeater + local lrs = delayer_get_input_rules(lnode) + for _, lr in pairs(lrs) do + if lr.x == r.x or lr.z == r.z then + -- Invalid orientation. Do nothing + return false + end + end + -- Now we check if there's a powered repeater on the other side of the + -- locked repeater. + -- To get to the other side, we just take another step in the direction which we already face. + local other_side = vector.add(lpos, r) + local other_node = minetest.get_node(other_side) + if minetest.get_item_group(other_node.name, "redstone_repeater") ~= 0 and mesecon.is_receptor_on(other_node.name) then + -- Final check: The other repeater must also face the right way + local other_face = delayer_get_output_rules(other_node)[1] + local other_facing_pos = vector.add(other_side, other_face) + if vector.equals(other_facing_pos, lpos) then + -- Powered repeater found AND it's facing the locked repeater. Do NOT unlock! + return false + end + end + local lmeta = minetest.get_meta(lpos) + local ldelay = lmeta:get_int("delay") + if tonumber(ldelay) == nil or ldelay < 1 or ldelay > 4 then + ldelay = 1 + end + if mesecon.is_powered(lpos, delayer_get_input_rules(lnode)[1]) then + minetest.set_node(lpos, {name="mesecons_delayer:delayer_on_"..ldelay, param2=lnode.param2}) + mesecon.queue:add_action(lpos, "receptor_on", {delayer_get_output_rules(lnode)}, ldef.delayer_time, nil) + else + minetest.set_node(lpos, {name="mesecons_delayer:delayer_off_"..ldelay, param2=lnode.param2}) + mesecon.queue:add_action(lpos, "receptor_off", {delayer_get_output_rules(lnode)}, ldef.delayer_time, nil) + end + return true + end + return false +end + -- Functions that are called after the delay time - -local delayer_turnon = function(params) - local rules = delayer_get_output_rules(params.node) - mesecon:receptor_on(params.pos, rules) -end - -local delayer_turnoff = function(params) - local rules = delayer_get_output_rules(params.node) - mesecon:receptor_off(params.pos, rules) -end - local delayer_activate = function(pos, node) local def = minetest.registered_nodes[node.name] local time = def.delayer_time - mesecon:swap_node(pos, def.delayer_onstate) - minetest.after(time, delayer_turnon , {pos = pos, node = node}) + minetest.set_node(pos, {name=def.delayer_onstate, param2=node.param2}) + mesecon.queue:add_action(pos, "receptor_on", {delayer_get_output_rules(node)}, time, nil) + + check_lock_repeater(pos, node) end local delayer_deactivate = function(pos, node) local def = minetest.registered_nodes[node.name] local time = def.delayer_time - mesecon:swap_node(pos, def.delayer_offstate) - minetest.after(time, delayer_turnoff, {pos = pos, node = node}) + minetest.set_node(pos, {name=def.delayer_offstate, param2=node.param2}) + mesecon.queue:add_action(pos, "receptor_off", {delayer_get_output_rules(node)}, time, nil) + + check_unlock_repeater(pos, node) +end + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.disallow end -- Register the 2 (states) x 4 (delay times) delayers @@ -46,17 +147,12 @@ end for i = 1, 4 do local groups = {} if i == 1 then - groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1} + groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1,redstone_repeater=i} else - groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1, not_in_creative_inventory=1} + groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1,redstone_repeater=i,not_in_creative_inventory=1} end -local delaytime -if i == 1 then delaytime = 0.1 -elseif i == 2 then delaytime = 0.2 -elseif i == 3 then delaytime = 0.3 -elseif i == 4 then delaytime = 0.4 -end +local delaytime = DELAYS[i] local boxes if i == 1 then @@ -85,20 +181,60 @@ boxes = { } end -local help, longdesc, usagehelp, icon +local help, tt, longdesc, usagehelp, icon, on_construct if i == 1 then help = true - longdesc = "Redstone repeaters are versatile redstone components which delay redstone signals and only allow redstone signals to travel through one direction. The delay of the signal is indicated by the redstone torches and is between 0.1 and 0.4 seconds long." - usagehelp = "To power a redstone repeater, send a signal in “arrow” direction. To change the delay, rightclick the redstone repeater. The delay is changed in steps of 0.1 seconds." + tt = S("Transmits redstone power only in one direction").."\n".. + S("Delays signal").."\n".. + S("Output locks when getting active redstone repeater signal from the side") + longdesc = S("Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.") + usagehelp = S("To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.").."\n".. + S("To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.") icon = "mesecons_delayer_item.png" + + -- Check sides of constructed repeater and lock it, if required + on_construct = function(pos) + local node = minetest.get_node(pos) + local sides = delayer_get_sides(node) + for s=1, #sides do + local spos = vector.add(pos, sides[s]) + local snode = minetest.get_node(spos) + -- Is there a powered repeater at one of our sides? + local g = minetest.get_item_group(snode.name, "redstone_repeater") + if g ~= 0 and mesecon.is_receptor_on(snode.name) then + -- The other repeater must also face towards the constructed node + local sface = delayer_get_output_rules(snode)[1] + local sface_pos = vector.add(spos, sface) + if vector.equals(sface_pos, pos) then + -- Repeater is facing towards us! Now we just need to lock the costructed node + if mesecon.is_powered(pos, delayer_get_input_rules(node)[1]) ~= false then + local newnode = {name="mesecons_delayer:delayer_on_locked", param2 = node.param2} + minetest.set_node(pos, newnode) + mesecon.queue:add_action(pos, "receptor_on", {delayer_get_output_rules(newnode)}, DEFAULT_DELAY, nil) + else + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_locked", param2 = node.param2}) + end + break + end + end + end + end else help = false end +local desc_off +if i == 1 then + desc_off = S("Redstone Repeater") +else + desc_off = S("Redstone Repeater (Delay @1)", i) +end + minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { - description = "Redstone Repeater", + description = desc_off, inventory_image = icon, wield_image = icon, + _tt_help = tt, _doc_items_create_entry = help, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, @@ -131,19 +267,26 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { sunlight_propagates = false, is_ground_content = false, drop = 'mesecons_delayer:delayer_off_1', - on_rightclick = function (pos, node) + on_rightclick = function (pos, node, clicker) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end if node.name=="mesecons_delayer:delayer_off_1" then - mesecon:swap_node(pos,"mesecons_delayer:delayer_off_2") + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_2", param2=node.param2}) elseif node.name=="mesecons_delayer:delayer_off_2" then - mesecon:swap_node(pos,"mesecons_delayer:delayer_off_3") + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_3", param2=node.param2}) elseif node.name=="mesecons_delayer:delayer_off_3" then - mesecon:swap_node(pos,"mesecons_delayer:delayer_off_4") + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_4", param2=node.param2}) elseif node.name=="mesecons_delayer:delayer_off_4" then - mesecon:swap_node(pos,"mesecons_delayer:delayer_off_1") + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_1", param2=node.param2}) end end, + on_construct = on_construct, delayer_time = delaytime, delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i), + delayer_lockstate = "mesecons_delayer:delayer_off_locked", sounds = mcl_sounds.node_sound_stone_defaults(), mesecons = { receptor = @@ -156,12 +299,13 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { rules = delayer_get_input_rules, action_on = delayer_activate } - } + }, + on_rotate = on_rotate, }) minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), { - description = "Redstone Repeater (Powered)", + description = S("Redstone Repeater (Delay @1, Powered)", i), _doc_items_create_entry = false, drawtype = "nodebox", tiles = { @@ -185,25 +329,35 @@ minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), { type = "fixed", fixed = boxes }, - groups = {dig_immediate = 3, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1, attached_node=1, not_in_creative_inventory = 1}, + groups = {dig_immediate = 3, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1, attached_node=1, redstone_repeater=i, not_in_creative_inventory = 1}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = false, is_ground_content = false, drop = 'mesecons_delayer:delayer_off_1', - on_rightclick = function (pos, node) - if node.name=="mesecons_delayer:delayer_on_1" then - mesecon:swap_node(pos,"mesecons_delayer:delayer_on_2") - elseif node.name=="mesecons_delayer:delayer_on_2" then - mesecon:swap_node(pos,"mesecons_delayer:delayer_on_3") - elseif node.name=="mesecons_delayer:delayer_on_3" then - mesecon:swap_node(pos,"mesecons_delayer:delayer_on_4") - elseif node.name=="mesecons_delayer:delayer_on_4" then - mesecon:swap_node(pos,"mesecons_delayer:delayer_on_1") + on_rightclick = function (pos, node, clicker) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return end + if node.name=="mesecons_delayer:delayer_on_1" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_on_2",param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_on_2" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_on_3",param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_on_3" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_on_4",param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_on_4" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_on_1",param2=node.param2}) + end + end, + after_dig_node = function(pos, oldnode) + check_unlock_repeater(pos, oldnode) end, delayer_time = delaytime, delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i), + delayer_lockstate = "mesecons_delayer:delayer_on_locked", + sounds = mcl_sounds.node_sound_stone_defaults(), mesecons = { receptor = { @@ -215,10 +369,123 @@ minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), { rules = delayer_get_input_rules, action_off = delayer_deactivate } - } + }, + on_rotate = on_rotate, }) + end + +-- Locked repeater + +minetest.register_node("mesecons_delayer:delayer_off_locked", { + description = S("Redstone Repeater (Locked)"), + _doc_items_create_entry = false, + drawtype = "nodebox", + -- FIXME: Textures of torch and the lock bar overlap. Nodeboxes are (sadly) not suitable for this. + -- So this needs to be turned into a mesh. + tiles = { + "mesecons_delayer_locked_off.png", + "mcl_stairs_stone_slab_top.png", + "mesecons_delayer_sides_locked_off.png", + "mesecons_delayer_sides_locked_off.png", + "mesecons_delayer_front_locked_off.png", + "mesecons_delayer_end_locked_off.png", + }, + wield_image = "mesecons_delayer_locked_off.png", + walkable = true, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + }, + collision_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -6/16, -6/16, -1/16, 6/16, -4/16, 1/16}, -- lock + } + }, + groups = {dig_immediate = 3, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1, attached_node=1, redstone_repeater=5, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = false, + is_ground_content = false, + drop = 'mesecons_delayer:delayer_off_1', + delayer_time = DEFAULT_DELAY, + sounds = mcl_sounds.node_sound_stone_defaults(), + mesecons = { + receptor = + { + state = mesecon.state.off, + rules = delayer_get_output_rules + }, + effector = + { + rules = delayer_get_input_rules, + } + }, + on_rotate = on_rotate, +}) + +minetest.register_node("mesecons_delayer:delayer_on_locked", { + description = S("Redstone Repeater (Locked, Powered)"), + _doc_items_create_entry = false, + drawtype = "nodebox", + tiles = { + "mesecons_delayer_locked_on.png", + "mcl_stairs_stone_slab_top.png", + "mesecons_delayer_sides_locked_on.png", + "mesecons_delayer_sides_locked_on.png", + "mesecons_delayer_front_locked_on.png", + "mesecons_delayer_end_locked_on.png", + }, + walkable = true, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + }, + collision_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -6/16, -6/16, -1/16, 6/16, -4/16, 1/16}, -- lock + } + }, + after_dig_node = function(pos, oldnode) + check_unlock_repeater(pos, oldnode) + end, + groups = {dig_immediate = 3, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1, attached_node=1, redstone_repeater=5, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = false, + is_ground_content = false, + drop = 'mesecons_delayer:delayer_off_1', + delayer_time = DEFAULT_DELAY, + sounds = mcl_sounds.node_sound_stone_defaults(), + mesecons = { + receptor = + { + state = mesecon.state.on, + rules = delayer_get_output_rules + }, + effector = + { + rules = delayer_get_input_rules, + } + }, + on_rotate = on_rotate, +}) + minetest.register_craft({ output = "mesecons_delayer:delayer_off_1", recipe = { @@ -232,8 +499,10 @@ if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_off_2") doc.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_off_3") doc.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_off_4") + doc.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_off_locked") doc.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_1") doc.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_2") doc.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_3") doc.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_4") + doc.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_locked") end diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr new file mode 100644 index 00000000..45c95952 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr @@ -0,0 +1,13 @@ +# textdomain: mesecons_delayer +Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.=Redstoneverstärker sind vielseitige Komponenten mit den folgenden Verwendungszwecken: 1.: Sie lassen Signale nur in eine Richtung durch. 2.: Sie verzögern das Signal. 3.: Sie können optional ihr Ausgangssignal sperren +To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.=Um einen Redstoneverstärker zu versorgen, senden Sie ein Signal in „Pfeilrichtung“ (dem Eingang). Das Signal geht aus der gegenüberliegenden Seite (dem Ausgang) mit einer Verzögerung hinaus. Um die Verzögerung zu ändern, benutzen Sie den Redstoneverstärker. Die Verzögerung ist zwischen 0,1 bis 0,4 Sekunden lang und kann in Schritten von 0,1 Sekunden geändert werden. Das wird mit der Position der verschiebbaren Redstonefackel angezeigt. +To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.=Um einen Verstärker zu sperren, senden Sie ein Signal eines benachbarten Verstärkers in eines der Seiten. Im gesperrten Zustand verschwindet die verschiebbare Redstonefackel, die Ausgabe ändert sich nicht mehr und der Eingang wird ignoriert. +Redstone Repeater=Redstoneverstärker +Redstone Repeater (Powered)=Redstoneverstärker (bestromt) +Redstone Repeater (Locked)=Redstoneverstärker (gesperrt) +Redstone Repeater (Locked, Powered)=Redstoneverstärker (gesperrt, bestromt) +Redstone Repeater (Delay @1)=Redstoneverstärker (Verzögerung @1) +Redstone Repeater (Delay @1, Powered)=Redstoneverstärker (Verzögerung @1, bestromt) +Transmits redstone power only in one direction=Überträgt Redstoneenergie in nur eine Richtung +Delays signal=Verzögert Signal +Output locks when getting active redstone repeater signal from the side=Ausgangssignal wird gesperrt, wenn Signal von aktivem Redstoneverstärker an der Seite erhalten diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.es.tr b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.es.tr new file mode 100644 index 00000000..fd502c73 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.es.tr @@ -0,0 +1,10 @@ +# textdomain: mesecons_delayer +Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.=Los repetidores Redstone son componentes versátiles de redstone con múltiples propósitos: 1. Solo permiten que las señales viajen en una dirección. 2. Retrasan la señal. 3. Opcionalmente, pueden bloquear su salida en un estado. +To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.=Para alimentar un repetidor de redstone, envíe una señal en la dirección de "flecha" (la entrada). La señal se apaga en el lado opuesto (la salida) con un retraso. Para cambiar el retraso, use el repetidor de redstone. El retraso es de entre 0.1 y 0.4 segundos y se puede cambiar en pasos de 0.1 segundos. Está indicado por la posición de la antorcha de redstone en movimiento. +To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.=Para bloquear un repetidor, envíe una señal desde un repetidor adyacente a uno de sus lados. Mientras está bloqueado, la antorcha de redstone en movimiento desaparece, la salida no cambia y la señal de entrada se ignora. +Redstone Repeater=Repetidor de redstone +Redstone Repeater (Powered)=Repetidor de redstone (Motorizado) +Redstone Repeater (Locked)=Repetidor de redstone (Bloqueado) +Redstone Repeater (Locked, Powered)=Repetidor de redstone (Bloqueado, Motorizado) +Redstone Repeater (Delay @1)=Repetidor de redstone (Retardar @1) +Redstone Repeater (Delay @1, Powered)=Repetidor de redstone (Retardar @1, Motorizado) diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.fr.tr b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.fr.tr new file mode 100644 index 00000000..e2831716 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.fr.tr @@ -0,0 +1,13 @@ +# textdomain: mesecons_delayer +Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.=Les répéteurs Redstone sont des composants Redstone polyvalents à usages multiples: 1. Ils ne permettent aux signaux de voyager que dans une seule direction. 2. Ils retardent le signal. 3. En option, ils peuvent verrouiller leur sortie dans un état. +To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.=Pour alimenter un répéteur redstone, envoyez un signal dans le sens de la «flèche» (l'entrée). Le signal s'éteint du côté opposé (la sortie) avec un retard. Pour modifier le délai, utilisez le répéteur redstone. Le délai est compris entre 0,1 et 0,4 seconde et peut être modifié par incréments de 0,1 seconde. Elle est indiquée par la position de la torche en pierre rouge en mouvement. +To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.=Pour verrouiller un répéteur, envoyez un signal d'un répéteur adjacent à l'un de ses côtés. Lorsqu'elle est verrouillée, la torche Redstone en mouvement disparaît, la sortie ne change pas et le signal d'entrée est ignoré. +Redstone Repeater=Répéteur Redstone +Redstone Repeater (Powered)=Répéteur Redstone (Alimenté) +Redstone Repeater (Locked)=Répéteur Redstone (Bloqué) +Redstone Repeater (Locked, Powered)=Répéteur Redstone (Bloqué, Alimenté) +Redstone Repeater (Delay @1)=Répéteur Redstone (Délai @1) +Redstone Repeater (Delay @1, Powered)=Répéteur Redstone (Délai @1, Alimenté) +Transmits redstone power only in one direction=Transmet la puissance de redstone seulement dans une direction +Delays signal=Retard du signal +Output locks when getting active redstone repeater signal from the side=La sortie se verrouille lorsque le signal du répéteur Redstone est actif sur le côté diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt new file mode 100644 index 00000000..58012480 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt @@ -0,0 +1,13 @@ +# textdomain: mesecons_delayer +Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.= +To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.= +To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.= +Redstone Repeater= +Redstone Repeater (Powered)= +Redstone Repeater (Locked)= +Redstone Repeater (Locked, Powered)= +Redstone Repeater (Delay @1)= +Redstone Repeater (Delay @1, Powered)= +Transmits redstone power only in one direction= +Delays signal= +Output locks when getting active redstone repeater signal from the side= diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_end_locked_off.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_end_locked_off.png new file mode 100644 index 00000000..bee3eeb0 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_end_locked_off.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_end_locked_on.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_end_locked_on.png new file mode 100644 index 00000000..3347f1b6 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_end_locked_on.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_ends_off.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_ends_off.png index 1b71813a..ed6f4a03 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_ends_off.png and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_ends_off.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_ends_on.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_ends_on.png index a5613764..8569fcd2 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_ends_on.png and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_ends_on.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_front_locked_off.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_front_locked_off.png new file mode 100644 index 00000000..e8cff329 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_front_locked_off.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_front_locked_on.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_front_locked_on.png new file mode 100644 index 00000000..59ca9382 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_front_locked_on.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_locked_off.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_locked_off.png new file mode 100644 index 00000000..3a5482a9 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_locked_off.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_locked_on.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_locked_on.png new file mode 100644 index 00000000..7e905a64 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_locked_on.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_off.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_off.png index 2bb7a170..ed33c422 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_off.png and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_off.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_on.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_on.png index 3fd2c4e5..2456cf02 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_on.png and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_on.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_locked_off.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_locked_off.png new file mode 100644 index 00000000..8b857bdd Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_locked_off.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_locked_on.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_locked_on.png new file mode 100644 index 00000000..c98e9d18 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_locked_on.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_off.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_off.png index bb67ae69..326dbe63 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_off.png and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_off.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_on.png b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_on.png index 80dca4d7..bab909eb 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_on.png and b/mods/ITEMS/REDSTONE/mesecons_delayer/textures/mesecons_delayer_sides_on.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua b/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua index 87e639eb..c09bcf59 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua @@ -1,36 +1,40 @@ +local S = minetest.get_translator("mesecons_lightstone") + +local light = minetest.LIGHT_MAX + minetest.register_node("mesecons_lightstone:lightstone_off", { tiles = {"jeija_lightstone_gray_off.png"}, - inventory_image = minetest.inventorycube("jeija_lightstone_gray_off.png"), groups = {handy=1, mesecon_effector_off = 1, mesecon = 2}, is_ground_content = false, - description= "Redstone Lamp", - _doc_items_longdesc = "Redstone lamps are simple redstone components which glow brightly (light level 14) when they receive redstone power.", + description= S("Redstone Lamp"), + _tt_help = S("Glows when powered by redstone power"), + _doc_items_longdesc = S("Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.", light), sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {effector = { action_on = function (pos, node) - mesecon:swap_node(pos, "mesecons_lightstone:lightstone_on") - end + minetest.swap_node(pos, {name="mesecons_lightstone:lightstone_on", param2 = node.param2}) + end, + rules = mesecon.rules.alldirs, }}, - _mcl_blast_resistance = 1.5, + _mcl_blast_resistance = 0.3, _mcl_hardness = 0.3, }) minetest.register_node("mesecons_lightstone:lightstone_on", { tiles = {"jeija_lightstone_gray_on.png"}, - inventory_image = minetest.inventorycube("jeija_lightstone_gray_off.png"), - groups = {handy=1, not_in_creative_inventory=1, mesecon = 2}, + groups = {handy=1, not_in_creative_inventory=1, mesecon = 2, opaque = 1}, drop = "node mesecons_lightstone:lightstone_off", is_ground_content = false, paramtype = "light", - -- Real light level: 15 (Minetest caps at 14) - light_source = 14, + light_source = light, sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {effector = { action_off = function (pos, node) - mesecon:swap_node(pos, "mesecons_lightstone:lightstone_off") - end + minetest.swap_node(pos, {name="mesecons_lightstone:lightstone_off", param2 = node.param2}) + end, + rules = mesecon.rules.alldirs, }}, - _mcl_blast_resistance = 1.5, + _mcl_blast_resistance = 0.3, _mcl_hardness = 0.3, }) diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr new file mode 100644 index 00000000..a0cfc221 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_lightstone +Redstone Lamp=Redstonelampe +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Redstonelampen sind einfache Redstonekomponenten, die hell aufleuchten (Helligkeitspegel von @1), wenn sie Redstoneenergie erhalten. +Glows when powered by redstone power=Leuchtet, wenn mit Redstoneenergie versorgt diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr new file mode 100644 index 00000000..713f0be5 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr @@ -0,0 +1,3 @@ +# textdomain: mesecons_lightstone +Redstone Lamp=Lámpara de redstone +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Las lámparas Redstone son componentes simples de redstone que brillan intensamente (nivel de luz @ 1) cuando reciben energía de redstone. diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.fr.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.fr.tr new file mode 100644 index 00000000..16601ace --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_lightstone +Redstone Lamp=Lampe Redstone +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Les lampes Redstone sont de simples composants Redstone qui brillent (niveau de lumière @1) lorsqu'elles reçoivent une puissance Redstone. +Glows when powered by redstone power=Brille lorsqu'il est alimenté par la puissance Redstone diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt new file mode 100644 index 00000000..2d2cc419 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_lightstone +Redstone Lamp= +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.= +Glows when powered by redstone power= diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 89d51b03..9eaceb88 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -1,25 +1,21 @@ --- Register stoppers for pistons -mesecon.mvps_stoppers={} +--register stoppers for movestones/pistons --- Register nodes which drop as item when pushed or pulled -mesecon.mvps_droppers={} +mesecon.mvps_stoppers = {} +mesecon.mvps_unsticky = {} +mesecon.mvps_droppers = {} +mesecon.on_mvps_move = {} +mesecon.mvps_unmov = {} -function mesecon:is_mvps_stopper(node, pushdir, stack, stackid) - local get_stopper = mesecon.mvps_stoppers[node.name] - if type (get_stopper) == "function" then - get_stopper = get_stopper(node, pushdir, stack, stackid) - end - return get_stopper +--- Objects (entities) that cannot be moved +function mesecon.register_mvps_unmov(objectname) + mesecon.mvps_unmov[objectname] = true; end -function mesecon:register_mvps_stopper(nodename, get_stopper) - if get_stopper == nil then - get_stopper = true - end - mesecon.mvps_stoppers[nodename] = get_stopper +function mesecon.is_mvps_unmov(objectname) + return mesecon.mvps_unmov[objectname] end -function mesecon:is_mvps_dropper(node, pushdir, stack, stackid) +function mesecon.is_mvps_dropper(node, pushdir, stack, stackid) local get_dropper = mesecon.mvps_droppers[node.name] if type (get_dropper) == "function" then get_dropper = get_dropper(node, pushdir, stack, stackid) @@ -30,47 +26,187 @@ function mesecon:is_mvps_dropper(node, pushdir, stack, stackid) return get_dropper end -function mesecon:register_mvps_dropper(nodename, get_dropper) +function mesecon.register_mvps_dropper(nodename, get_dropper) if get_dropper == nil then get_dropper = true end mesecon.mvps_droppers[nodename] = get_dropper end -function mesecon:mvps_process_stack(stack) - -- update mesecons for placed nodes ( has to be done after all nodes have been added ) - for _, n in ipairs(stack) do - core.check_for_falling(n.pos) - mesecon.on_placenode(n.pos, minetest.get_node(n.pos)) - mesecon:update_autoconnect(n.pos) +-- Nodes that cannot be pushed / pulled by movestones, pistons +function mesecon.is_mvps_stopper(node, pushdir, stack, stackid) + -- unknown nodes are always stoppers + if not minetest.registered_nodes[node.name] then + return true + end + + local get_stopper = mesecon.mvps_stoppers[node.name] + if type (get_stopper) == "function" then + get_stopper = get_stopper(node, pushdir, stack, stackid) + end + + return get_stopper +end + +function mesecon.register_mvps_stopper(nodename, get_stopper) + if get_stopper == nil then + get_stopper = true + end + mesecon.mvps_stoppers[nodename] = get_stopper +end + +-- For nodes which ignore sticky sides. +-- They can't be pulled by sticky pistons and don't interact with slime blocks. +-- TODO: This has NOT any actual effect so far. The actual functionality +-- still needs to be implemented. +function mesecon.register_mvps_unsticky(nodename, get_unsticky) + if get_unsticky == nil then + get_unsticky = true + end + mesecon.mvps_unsticky[nodename] = get_unsticky +end + +function mesecon.is_mvps_unsticky(node, pulldir, stack, stackid) + -- unknown nodes are always unsticky + if not minetest.registered_nodes[node.name] then + return true + end + + local get_unsticky = mesecon.mvps_unsticky[node.name] + if type(get_unsticky) == "function" then + get_unsticky = get_unsticky(node, pulldir, stack, stackid) + end + if get_unsticky == nil then + get_unsticky = false + end + + return get_unsticky +end + +-- Functions to be called on mvps movement +function mesecon.register_on_mvps_move(callback) + mesecon.on_mvps_move[#mesecon.on_mvps_move+1] = callback +end + +local function on_mvps_move(moved_nodes) + for _, callback in ipairs(mesecon.on_mvps_move) do + callback(moved_nodes) end end -function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: direction of push; maximum: maximum nodes to be pushed - np = {x = pos.x, y = pos.y, z = pos.z} +function mesecon.mvps_process_stack(stack) + -- update mesecons for placed nodes ( has to be done after all nodes have been added ) + for _, n in ipairs(stack) do + mesecon.on_placenode(n.pos, minetest.get_node(n.pos)) + end +end - -- determine the number of nodes to be pushed - local nodes = {} - while true do - nn = minetest.get_node_or_nil(np) - if not nn or #nodes > maximum then - -- don't push at all, something is in the way (unloaded map or too many nodes) - return - end +-- tests if the node can be pushed into, e.g. air, water, grass +local function node_replaceable(name) + if name == "ignore" then return true end - if nn.name == "air" - or minetest.registered_nodes[nn.name].liquidtype ~= "none" then --is liquid - break - end - - table.insert (nodes, {node = nn, pos = np}) - - np = mesecon:addPosRule(np, dir) + if minetest.registered_nodes[name] then + return minetest.registered_nodes[name].buildable_to or false end - -- determine if one of the nodes blocks the push + return false +end + +function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky) + -- determine the number of nodes to be pushed + local nodes = {} + local frontiers = {pos} + + while #frontiers > 0 do + local np = frontiers[1] + local nn = minetest.get_node(np) + + if not node_replaceable(nn.name) then + + table.insert(nodes, {node = nn, pos = np}) + if #nodes > maximum then return nil end + + -- add connected nodes to frontiers, connected is a vector list + -- the vectors must be absolute positions + local connected = {} + if minetest.registered_nodes[nn.name] + and minetest.registered_nodes[nn.name].mvps_sticky then + connected = minetest.registered_nodes[nn.name].mvps_sticky(np, nn) + end + + table.insert(connected, vector.add(np, dir)) + + -- If adjacent node is sticky block and connects add that + -- position to the connected table + for _, r in ipairs(mesecon.rules.alldirs) do + local adjpos = vector.add(np, r) + local adjnode = minetest.get_node(adjpos) + if minetest.registered_nodes[adjnode.name] + and minetest.registered_nodes[adjnode.name].mvps_sticky then + local sticksto = minetest.registered_nodes[adjnode.name] + .mvps_sticky(adjpos, adjnode) + + -- connects to this position? + for _, link in ipairs(sticksto) do + if vector.equals(link, np) then + table.insert(connected, adjpos) + end + end + end + end + + if all_pull_sticky then + table.insert(connected, vector.subtract(np, dir)) + end + + -- Make sure there are no duplicates in frontiers / nodes before + -- adding nodes in "connected" to frontiers + for _, cp in ipairs(connected) do + local duplicate = false + for _, rp in ipairs(nodes) do + if vector.equals(cp, rp.pos) then + duplicate = true + end + end + for _, fp in ipairs(frontiers) do + if vector.equals(cp, fp) then + duplicate = true + end + end + if not duplicate then + table.insert(frontiers, cp) + end + end + end + table.remove(frontiers, 1) + end + + return nodes +end + +function mesecon.mvps_push(pos, dir, maximum) + return mesecon.mvps_push_or_pull(pos, dir, dir, maximum, nil, false) +end + +function mesecon.mvps_pull_all(pos, dir, maximum) + return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, true, true) +end + +function mesecon.mvps_pull_single(pos, dir, maximum) + return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, nil, true) +end + +-- pos: pos of mvps; stackdir: direction of building the stack +-- movedir: direction of actual movement +-- maximum: maximum nodes to be pushed +-- all_pull_sticky: All nodes are sticky in the direction that they are pulled from +function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sticky) + local nodes = mesecon.mvps_get_stack(pos, movedir, maximum, all_pull_sticky) + + if not nodes then return end + -- determine if one of the nodes blocks the push / pull for id, n in ipairs(nodes) do - if mesecon:is_mvps_stopper(n.node, dir, nodes, id) then + if mesecon.is_mvps_stopper(n.node, movedir, nodes, id) then return end end @@ -79,13 +215,13 @@ function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio -- remove all nodes for id, n in ipairs(nodes) do n.meta = minetest.get_meta(n.pos):to_table() - local is_dropper = mesecon:is_mvps_dropper(n.node, dir, nodes, id) + local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, nodes, id) if is_dropper then local drops = minetest.get_node_drops(n.node.name, "") - local droppos = vector.add(n.pos, dir) - minetest.handle_node_drops(droppos, drops, nil) + minetest.dig_node(n.pos) + else + minetest.remove_node(n.pos) end - minetest.remove_node(n.pos) if is_dropper then first_dropper = id break @@ -98,7 +234,6 @@ function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio break end mesecon.on_dignode(n.pos, n.node) - mesecon:update_autoconnect(n.pos) end -- add nodes @@ -106,7 +241,7 @@ function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio if first_dropper and id >= first_dropper then break end - np = mesecon:addPosRule(n.pos, dir) + local np = vector.add(n.pos, movedir) minetest.add_node(np, n.node) minetest.get_meta(np):from_table(n.meta) end @@ -115,93 +250,137 @@ function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio if first_dropper and i >= first_dropper then break end - nodes[i].pos = mesecon:addPosRule(nodes[i].pos, dir) + nodes[i].pos = vector.add(nodes[i].pos, movedir) end - return true, nodes -end - -function mesecon:mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: direction of pull (matches push direction for sticky pistons) - np = mesecon:addPosRule(pos, dir) - nn = minetest.get_node(np) - - if minetest.registered_nodes[nn.name].liquidtype == "none" - and not mesecon:is_mvps_stopper(nn, {x = -dir.x, y = -dir.y, z = -dir.z}, {{pos = np, node = nn}}, 1) - and not mesecon:is_mvps_dropper(nn, {x = -dir.x, y = -dir.y, z = -dir.z}, {{pos = np, node = nn}}, 1) then - local meta = minetest.get_meta(np):to_table() - minetest.remove_node(np) - minetest.add_node(pos, nn) - minetest.get_meta(pos):from_table(meta) - - core.check_for_falling(np) - core.check_for_falling(pos) - mesecon.on_dignode(np, nn) - mesecon:update_autoconnect(np) + local moved_nodes = {} + local oldstack = mesecon.tablecopy(nodes) + for i in ipairs(nodes) do + if first_dropper and i >= first_dropper then + break + end + moved_nodes[i] = {} + moved_nodes[i].oldpos = nodes[i].pos + nodes[i].pos = vector.add(nodes[i].pos, movedir) + moved_nodes[i].pos = nodes[i].pos + moved_nodes[i].node = nodes[i].node + moved_nodes[i].meta = nodes[i].meta end - return {{pos = np, node = {param2 = 0, name = "air"}}, {pos = pos, node = nn}} + + on_mvps_move(moved_nodes) + + return true, nodes, oldstack end -function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: direction of pull - local lpos = {x=pos.x-direction.x, y=pos.y-direction.y, z=pos.z-direction.z} -- 1 away - local lnode = minetest.get_node(lpos) - local lpos2 = {x=pos.x-direction.x*2, y=pos.y-direction.y*2, z=pos.z-direction.z*2} -- 2 away - local lnode2 = minetest.get_node(lpos2) +mesecon.register_on_mvps_move(function(moved_nodes) + for _, n in ipairs(moved_nodes) do + mesecon.on_placenode(n.pos, n.node) + end +end) - if lnode.name ~= "ignore" and lnode.name ~= "air" and minetest.registered_nodes[lnode.name].liquidtype == "none" then return end - if lnode2.name == "ignore" or lnode2.name == "air" or not(minetest.registered_nodes[lnode2.name].liquidtype == "none") then return end +function mesecon.mvps_move_objects(pos, dir, nodestack) + local objects_to_move = {} - local oldpos = {x=lpos2.x+direction.x, y=lpos2.y+direction.y, z=lpos2.z+direction.z} - repeat - lnode2 = minetest.get_node(lpos2) - minetest.add_node(oldpos, {name=lnode2.name}) - core.check_for_falling(oldpos) - oldpos = {x=lpos2.x, y=lpos2.y, z=lpos2.z} - lpos2.x = lpos2.x-direction.x - lpos2.y = lpos2.y-direction.y - lpos2.z = lpos2.z-direction.z - lnode = minetest.get_node(lpos2) - until lnode.name=="air" or lnode.name=="ignore" or not(minetest.registered_nodes[lnode2.name].liquidtype == "none") - minetest.remove_node(oldpos) + -- Move object at tip of stack, pushpos is position at tip of stack + local pushpos = vector.add(pos, vector.multiply(dir, #nodestack)) + + local objects = minetest.get_objects_inside_radius(pushpos, 1) + for _, obj in ipairs(objects) do + table.insert(objects_to_move, obj) + end + + -- Move objects lying/standing on the stack (before it was pushed - oldstack) + if tonumber(minetest.settings:get("movement_gravity")) > 0 and dir.y == 0 then + -- If gravity positive and dir horizontal, push players standing on the stack + for _, n in ipairs(nodestack) do + local p_above = vector.add(n.pos, {x=0, y=1, z=0}) + local objects = minetest.get_objects_inside_radius(p_above, 1) + for _, obj in ipairs(objects) do + table.insert(objects_to_move, obj) + end + end + end + + for _, obj in ipairs(objects_to_move) do + local entity = obj:get_luaentity() + if not entity or not mesecon.is_mvps_unmov(entity.name) then + local np = vector.add(obj:get_pos(), dir) + + --move only if destination is not solid + local nn = minetest.get_node(np) + if not ((not minetest.registered_nodes[nn.name]) + or minetest.registered_nodes[nn.name].walkable) then + obj:set_pos(np) + end + end + end end -mesecon:register_mvps_stopper("mcl_core:obsidian") -mesecon:register_mvps_stopper("mcl_core:bedrock") -mesecon:register_mvps_stopper("mcl_core:barrier") -mesecon:register_mvps_stopper("mcl_core:void") -mesecon:register_mvps_stopper("mcl_chests:chest") -mesecon:register_mvps_stopper("mcl_chests:chest_left") -mesecon:register_mvps_stopper("mcl_chests:chest_right") -mesecon:register_mvps_stopper("mcl_chests:trapped_chest") -mesecon:register_mvps_stopper("mcl_chests:trapped_chest_left") -mesecon:register_mvps_stopper("mcl_chests:trapped_chest_right") -mesecon:register_mvps_stopper("mcl_chests:trapped_chest_on") -mesecon:register_mvps_stopper("mcl_chests:trapped_chest_on_left") -mesecon:register_mvps_stopper("mcl_chests:trapped_chest_on_right") -mesecon:register_mvps_stopper("mcl_chests:ender_chest") -mesecon:register_mvps_stopper("mcl_furnaces:furnace") -mesecon:register_mvps_stopper("mcl_furnaces:furnace_active") -mesecon:register_mvps_stopper("mcl_hoppers:hopper") -mesecon:register_mvps_stopper("mcl_hoppers:hopper_side") -mesecon:register_mvps_stopper("mcl_droppers:dropper") -mesecon:register_mvps_stopper("mcl_droppers:dropper_up") -mesecon:register_mvps_stopper("mcl_droppers:dropper_down") -mesecon:register_mvps_stopper("mcl_dispensers:dispenser") -mesecon:register_mvps_stopper("mcl_dispensers:dispenser_up") -mesecon:register_mvps_stopper("mcl_dispensers:dispenser_down") -mesecon:register_mvps_stopper("mcl_anvils:anvil") -mesecon:register_mvps_stopper("mcl_anvils:anvil_damage_1") -mesecon:register_mvps_stopper("mcl_anvils:anvil_damage_2") -mesecon:register_mvps_stopper("mcl_jukebox:jukebox") -mesecon:register_mvps_stopper("mcl_mobspawners:spawner") -mesecon:register_mvps_stopper("mcl_signs:standing_sign") -mesecon:register_mvps_stopper("mcl_signs:wall_sign") -mesecon:register_mvps_stopper("mesecons_commandblock:commandblock_off") -mesecon:register_mvps_stopper("mesecons_commandblock:commandblock_on") -mesecon:register_mvps_stopper("mesecons_solarpanel:solar_panel_off") -mesecon:register_mvps_stopper("mesecons_solarpanel:solar_panel_on") -mesecon:register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off") -mesecon:register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on") -mesecon:register_mvps_stopper("mesecons_noteblock:noteblock") -mesecon:register_mvps_stopper("3d_armor_stand:armor_stand") -mesecon:register_mvps_stopper("mcl_portals:portal") -mesecon:register_mvps_stopper("mcl_portals:portal_end") +-- Unmovable by design +mesecon.register_mvps_stopper("mcl_core:barrier") +mesecon.register_mvps_stopper("mcl_core:realm_barrier") +mesecon.register_mvps_stopper("mcl_core:void") +mesecon.register_mvps_stopper("mcl_core:bedrock") +mesecon.register_mvps_stopper("mcl_core:obsidian") +mesecon.register_mvps_stopper("mcl_chests:ender_chest") +mesecon.register_mvps_stopper("mcl_mobspawners:spawner") +mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off") +mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on") +mesecon.register_mvps_stopper("mcl_portals:portal") +mesecon.register_mvps_stopper("mcl_portals:portal_end") +mesecon.register_mvps_stopper("mcl_portals:end_portal_frame") +mesecon.register_mvps_stopper("mcl_portals:end_portal_frame_eye") + +-- Unmovable by technical restrictions. +-- Open formspec would screw up if node is destroyed (minor problem) +mesecon.register_mvps_stopper("mcl_furnaces:furnace") +mesecon.register_mvps_stopper("mcl_furnaces:furnace_active") +mesecon.register_mvps_stopper("mcl_hoppers:hopper") +mesecon.register_mvps_stopper("mcl_hoppers:hopper_side") +mesecon.register_mvps_stopper("mcl_droppers:dropper") +mesecon.register_mvps_stopper("mcl_droppers:dropper_up") +mesecon.register_mvps_stopper("mcl_droppers:dropper_down") +mesecon.register_mvps_stopper("mcl_dispensers:dispenser") +mesecon.register_mvps_stopper("mcl_dispensers:dispenser_up") +mesecon.register_mvps_stopper("mcl_dispensers:dispenser_down") +mesecon.register_mvps_stopper("mcl_anvils:anvil") +mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1") +mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2") +-- Would screw up on/off state of trapped chest (big problem) + +-- Glazed terracotta: unpullable +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_red") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_orange") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_yellow") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_green") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_lime") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_purple") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_magenta") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_blue") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_cyan") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_white") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_grey") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_silver") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_black") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_brown") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue") +mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink") + +mesecon.register_on_mvps_move(mesecon.move_hot_nodes) + +-- Check for falling after moving node +mesecon.register_on_mvps_move(function(moved_nodes) + for i = 1, #moved_nodes do + local moved_node = moved_nodes[i] + mesecon.on_placenode(moved_node.pos, moved_node.node) + minetest.after(0, function() + minetest.check_for_falling(moved_node.oldpos) + minetest.check_for_falling(moved_node.pos) + end) + local node_def = minetest.registered_nodes[moved_node.node.name] + if node_def and node_def.mesecon and node_def.mesecon.on_mvps_move then + node_def.mesecon.on_mvps_move(moved_node.pos, moved_node.node, + moved_node.oldpos, moved_node.meta) + end + end +end) diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/LICENSE.txt b/mods/ITEMS/REDSTONE/mesecons_noteblock/LICENSE.txt deleted file mode 100644 index ec3fc396..00000000 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/LICENSE.txt +++ /dev/null @@ -1,8 +0,0 @@ -Licensing information - -* All code: GPLv3 by Mesecons Mod Developer Team, contributors and Wuzzy -* mesecons_noteblock_temp_bass_guitar.ogg: CC0 -* mesecons_noteblock_temp_stick.ogg: CC0 -* Other sounds and data: CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/) by Mesecons Mod Developer Team and contributors - -Note: All “temp” sounds are subject to be replaced in later versions. diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/README.txt b/mods/ITEMS/REDSTONE/mesecons_noteblock/README.txt new file mode 100644 index 00000000..dd6822a3 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/README.txt @@ -0,0 +1,57 @@ +Credits of sound files: + +Note: Most sounds have not been used verbatim, but tweaked a little to be more suitable for the noteblock mod. + +### Sounds licensed CC0: + + * by freesound.org user AmateurJ + * Source: https://freesound.org/people/AmateurJ/sounds/399523/ +* mesecons_noteblock_bass_drum.ogg + * by freesound.org user Mattc90 + * Source: https://freesound.org/people/Mattc90/sounds/264285/ +* mesecons_noteblock_bell.ogg + * by opengameart.org user Brandon75689 + * Source: https://opengameart.org/content/point-bell +* mesecons_noteblock_chime.ogg + * by freesound.org user + * Source: https://freesound.org/people/ikonochris/sounds/213380/ +* mesecons_noteblock_cowbell.ogg + * by freesound.org user timgormly + * Source: https://freesound.org/people/timgormly/sounds/159760/ +* mesecons_noteblock_flute.ogg + * by freesound.org user menegass + * Source: https://freesound.org/people/menegass/sounds/107307/ +* mesecons_noteblock_bass_guitar.ogg + * by freesound.org user Vres + * Source: https://freesound.org/people/Vres/sounds/133024/ +* mesecons_noteblock_hit.ogg + * by freesound.org user rubberduck + * Source: https://opengameart.org/content/100-cc0-sfx +* mesecons_noteblock_piano_digital.ogg + * by freesound.org user monotraum + * Source: https://freesound.org/people/monotraum/sounds/208889/ +* mesecons_noteblock_squarewave.ogg + * by Wuzzy +* mesecons_noteblock_xylophone_metal.ogg + * by freesound.org user JappeHallunken + * Source: https://freesound.org/people/JappeHallunken/sounds/501300/ +* mesecons_noteblock_xylophone_wood.ogg + * by freesound.org user connersaw8 + * Source: https://freesound.org/people/connersaw8/sounds/125271/ + +### Sounds licensed CC BY 3.0: + +* mesecons_noteblock_bass_guitar.ogg + * by freesound.org user Kyster + * Source: https://freesound.org/people/Kyster/sounds/117707/ +* mesecons_noteblock_didgeridoo.ogg + * by freesound.org user InspectorJ + * Source: https://freesound.org/people/InspectorJ/sounds/398272/ + +Everything else: +Created by Mesecons authors, licensed CC BY 3.0. + +-------------------- +License links: +* CC0: http://creativecommons.org/publicdomain/zero/1.0/ +* CC BY 3.0: http://creativecommons.org/licenses/by/3.0/ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua index dca7762e..f521638f 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua @@ -1,21 +1,40 @@ +local S = minetest.get_translator("mesecons_noteblock") + minetest.register_node("mesecons_noteblock:noteblock", { - description = "Note Block", - _doc_items_longdesc = "A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.", - _doc_items_usagehelp = [[Rightclick the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block: + description = S("Note Block"), + _tt_help = S("Plays a musical note when powered by redstone power"), + _doc_items_longdesc = S("A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power."), + _doc_items_usagehelp = S("Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:").."\n\n".. -• Glass: Sticks -• Wood: Bass guitar -• Stone: Bass drum -• Sand or gravel: Snare drum -• Anything else: Piano +S("• Glass: Sticks").."\n".. +S("• Wood: Bass guitar").."\n".. +S("• Stone: Bass drum").."\n".. +S("• Sand or gravel: Snare drum").."\n".. +S("• Block of Gold: Bell").."\n".. +S("• Clay: Flute").."\n".. +S("• Packed Ice: Chime").."\n".. +S("• Wool: Guitar").."\n".. +S("• Bone Block: Xylophne").."\n".. +S("• Block of Iron: Iron xylophne").."\n".. +S("• Soul Sand: Cow bell").."\n".. +S("• Pumpkin: Didgeridoo").."\n".. +S("• Block of Emerald: Square wave").."\n".. +S("• Hay Bale: Banjo").."\n".. +S("• Glowstone: Electric piano").."\n".. +S("• Anything else: Piano").."\n\n".. -The note block will only play a note when it is below air, otherwise, it stays silent.]], +S("The note block will only play a note when it is below air, otherwise, it stays silent."), tiles = {"mesecons_noteblock.png"}, - groups = {handy=1,axey=1, material_wood=1}, + groups = {handy=1,axey=1, material_wood=1, flammable=-1}, is_ground_content = false, place_param2 = 0, - on_rightclick = function (pos, node) -- change sound when rightclicked - node.param2 = (node.param2+1)%24 + on_rightclick = function (pos, node, clicker) -- change sound when rightclicked + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end + node.param2 = (node.param2+1)%25 mesecon.noteblock_play(pos, node.param2) minetest.set_node(pos, node) end, @@ -26,9 +45,10 @@ The note block will only play a note when it is below air, otherwise, it stays s mesecons = {effector = { -- play sound when activated action_on = function (pos, node) mesecon.noteblock_play(pos, node.param2) - end + end, + rules = mesecon.rules.alldirs, }}, - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) @@ -74,6 +94,8 @@ local soundnames_piano = { "mesecons_noteblock_asharp2", "mesecons_noteblock_b2", + -- TODO: Add dedicated sound file? + "mesecons_noteblock_b2", } mesecon.noteblock_play = function (pos, param2) @@ -83,24 +105,55 @@ mesecon.noteblock_play = function (pos, param2) return end - -- Default: One of 24 piano notes - local soundname = soundnames_piano[param2] - local block_below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name - - if minetest.get_item_group(block_below_name, "material_glass") ~= 0 then - -- TODO: 24 sticks and clicks - soundname="mesecons_noteblock_temp_stick" - elseif minetest.get_item_group(block_below_name, "material_wood") ~= 0 then - -- TODO: 24 bass guitar sounds - soundname="mesecons_noteblock_temp_bass_guitar" - elseif minetest.get_item_group(block_below_name, "material_sand") ~= 0 then - -- TODO: 24 snare drum sounds - soundname="mesecons_noteblock_temp_snare" - elseif minetest.get_item_group(block_below_name, "material_stone") ~= 0 then - -- TODO: 24 bass drum sounds - soundname="mesecons_noteblock_temp_kick" + local param2_to_pitch = function(param2) + return 2^((param2-12)/12) end + local pitched = false + local soundname, pitch + if block_below_name == "mcl_core:goldblock" then + soundname="mesecons_noteblock_bell" + elseif block_below_name == "mcl_core:clay" then + soundname="mesecons_noteblock_flute" + elseif block_below_name == "mcl_core:packed_ice" then + soundname="mesecons_noteblock_chime" + elseif block_below_name == "mcl_core:bone_block" then + soundname="mesecons_noteblock_xylophone_wood" + elseif block_below_name == "mcl_core:ironblock" then + soundname="mesecons_noteblock_xylophone_metal" + elseif block_below_name == "mcl_nether:soul_sand" then + soundname="mesecons_noteblock_cowbell" + elseif block_below_name == "mcl_farming:pumpkin" or block_below_name == "mcl_farming:pumpkin_face" or block_below_name == "mcl_farming:pumpkin_face_light" then + soundname="mesecons_noteblock_didgeridoo" + elseif block_below_name == "mcl_core:emeraldblock" then + soundname="mesecons_noteblock_squarewave" + elseif block_below_name == "mcl_farming:hay_block" then + soundname="mesecons_noteblock_banjo" + elseif block_below_name == "mcl_nether:glowstone" then + soundname="mesecons_noteblock_piano_digital" + elseif minetest.get_item_group(block_below_name, "wool") ~= 0 then + soundname="mesecons_noteblock_guitar" + elseif minetest.get_item_group(block_below_name, "material_glass") ~= 0 then + soundname="mesecons_noteblock_hit" + elseif minetest.get_item_group(block_below_name, "material_wood") ~= 0 then + soundname="mesecons_noteblock_bass_guitar" + elseif minetest.get_item_group(block_below_name, "material_sand") ~= 0 then + soundname="mesecons_noteblock_snare" + elseif minetest.get_item_group(block_below_name, "material_stone") ~= 0 then + soundname="mesecons_noteblock_bass_drum" + else + -- Default: One of 25 piano notes + soundname = soundnames_piano[param2] + -- Workaround: Final sound gets automatic higher pitch instead + if param2 == 24 then + pitch = 2^(1/12) + end + pitched = true + end + if not pitched then + pitch = param2_to_pitch(param2) + end + minetest.sound_play(soundname, - {pos = pos, gain = 1.0, max_hear_distance = 48,}) + {pos = pos, gain = 1.0, max_hear_distance = 48, pitch = pitch}) end diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr new file mode 100644 index 00000000..b3fe2224 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr @@ -0,0 +1,22 @@ +# textdomain: mesecons_noteblock +Note Block=Notenblock +A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.=Ein Notenblock ist ein musikalischer Block, der eine von vielen Noten von verschiedenen Instrumenten spielt, wenn er geschlagen oder mit Redstoneenergie versorgt wird. +Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:=Benutzen Sie den Notenblock, um die nächste Musiknote zu wählen (es gibt 25 Halbtöne bzw. oder 2 Oktaven). Das gespielte Instrument hängt vom Material des Blocks unter dem Notenblock ab: +• Glass: Sticks=• Glas: Stöcke +• Wood: Bass guitar=• Holz: Bassgitarre +• Stone: Bass drum=• Stein: Basstrommel +• Sand or gravel: Snare drum=• Sand oder Kies: Kleine Trommel +• Block of Gold: Bell=• Goldblock: Glocke +• Clay: Flute=• Ton: Flöte +• Packed Ice: Chime=• Packeis: Glockenspiel +• Wool: Guitar=• Wolle: Gitarre +• Bone Block: Xylophne=• Knochenblock: Xylophon +• Block of Iron: Iron xylophne=• Eisenblock: Eisenxylophon +• Soul Sand: Cow bell=• Seelensand: Kuhglocke +• Pumpkin: Didgeridoo=• Kürbis: Didgeridoo +• Block of Emerald: Square wave=• Smaragdblock: Rechteckschwingung +• Hay Bale: Banjo=• Heuballen: Banjo +• Glowstone: Electric piano=• Leuchtstein: E-Piano +• Anything else: Piano=• Alles andere: Klavier +The note block will only play a note when it is below air, otherwise, it stays silent.=Der Notenblock wird nur eine Note spielen, wenn er sich unter Luft befindet, sonst bleibt er stumm. +Plays a musical note when powered by redstone power=Spielt eine Musiknote, wenn mit Redstoneenergie versorgt diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.es.tr b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.es.tr new file mode 100644 index 00000000..123862d2 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.es.tr @@ -0,0 +1,10 @@ +# textdomain: mesecons_noteblock +Note Block=Bloque musical +A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.=Un bloque de notas es un bloque musical que reproduce una de las muchas notas musicales e instrumentos diferentes cuando se golpea o se le suministra energía de redstone. +Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:=Use el bloque de notas para elegir la siguiente nota musical (hay 25 semitonos, o 2 octavas). El instrumento jugado depende del material del bloque debajo del bloque de nota: +• Glass: Sticks=• Cristal: Palos +• Wood: Bass guitar=• Madera: Bajo +• Stone: Bass drum=• Piedra: Bombo +• Sand or gravel: Snare drum=• Arena o grava: tambor +• Anything else: Piano=• Cualquier otra cosa: piano +The note block will only play a note when it is below air, otherwise, it stays silent.=El bloque de notas solo reproducirá una nota cuando esté debajo del aire, de lo contrario, permanecerá en silencio. diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.fr.tr b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.fr.tr new file mode 100644 index 00000000..f8d8e3d7 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.fr.tr @@ -0,0 +1,22 @@ +# textdomain: mesecons_noteblock +Note Block=Bloc de notes +A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.=Un bloc de notes est un bloc musical qui joue l'une des nombreuses notes de musique et différents instruments lorsqu'il est frappé ou alimenté en redstone. +Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:=Utilisez le bloc de notes pour choisir la prochaine note de musique (il y a 25 demi-tons ou 2 octaves). L'instrument joué dépend du matériau du bloc situé sous le bloc de notes: +• Glass: Sticks=• Glass: Sticks +• Wood: Bass guitar=• Bois: Guitare Basse +• Stone: Bass drum=• Pierre: Grosse caisse +• Sand or gravel: Snare drum=• Sable ou gravier: Caisse claire +• Block of Gold: Bell=• Bloc d'OR: Cloche +• Clay: Flute=• Argile: Flûte +• Packed Ice: Chime=• Glace tassée: Carillon +• Wool: Guitar=• Laine: Guitare +• Bone Block: Xylophne=• Bloc osseux: Xylophne +• Block of Iron: Iron xylophne=• Bloc de fer: Xylophone en fer +• Soul Sand: Cow bell=• Soul Sand: Cloche de vache +• Pumpkin: Didgeridoo=• Citrouille: Didgeridoo +• Block of Emerald: Square wave=• Bloc d'émeraude: Onde carrée +• Hay Bale: Banjo=• Hay Bale: Banjo +• Glowstone: Electric piano=• Glowstone: Piano Electrique +• Anything else: Piano=• Autres: Piano +The note block will only play a note when it is below air, otherwise, it stays silent.=Le bloc de notes ne jouera une note que lorsqu'il est sous l'air, sinon il reste silencieux. +Plays a musical note when powered by redstone power=Joue une note de musique lorsqu'il est alimenté par une puissance redstone diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt new file mode 100644 index 00000000..d0daa96a --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt @@ -0,0 +1,22 @@ +# textdomain: mesecons_noteblock +Note Block= +A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.= +Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:= +• Glass: Sticks= +• Wood: Bass guitar= +• Stone: Bass drum= +• Sand or gravel: Snare drum= +• Anything else: Piano= +• Block of Gold: Bell +• Clay: Flute +• Packed Ice: Chime +• Wool: Guitar +• Bone Block: Xylophne +• Block of Iron: Iron xylophne +• Soul Sand: Cow bell +• Pumpkin: Didgeridoo +• Block of Emerald: Square wave +• Hay Bale: Banjo +• Glowstone: Electric piano +The note block will only play a note when it is below air, otherwise, it stays silent.= +Plays a musical note when powered by redstone power= diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg index 5668a8aa..331fc1cc 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg index 4cd2dccf..db96aedb 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg index 621a6b54..810fe18f 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_banjo.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_banjo.ogg new file mode 100644 index 00000000..62d93d57 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_banjo.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bass_drum.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bass_drum.ogg new file mode 100644 index 00000000..c470537e Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bass_drum.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bass_guitar.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bass_guitar.ogg new file mode 100644 index 00000000..48069d8e Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bass_guitar.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bell.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bell.ogg new file mode 100644 index 00000000..6758e2c7 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bell.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg index e2359789..5c60d315 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_chime.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_chime.ogg new file mode 100644 index 00000000..4c131263 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_chime.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_cowbell.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_cowbell.ogg new file mode 100644 index 00000000..32b4c9fb Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_cowbell.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg index 50ba8351..12c1ef38 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg index f1227bac..929b7fba 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_didgeridoo.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_didgeridoo.ogg new file mode 100644 index 00000000..221cd844 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_didgeridoo.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg index 817728e7..eb6045d4 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg index c91d1a6d..94977e0d 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg index 3f1eaea5..221d9264 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_flute.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_flute.ogg new file mode 100644 index 00000000..3a8bbc6a Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_flute.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg index 9f137979..7af83a8e 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg index d2a90dd9..480ca367 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg index 6177b8cf..2e71fea0 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_guitar.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_guitar.ogg new file mode 100644 index 00000000..1dcd5b83 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_guitar.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_hit.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_hit.ogg new file mode 100644 index 00000000..cf8a5bfd Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_hit.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_piano_digital.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_piano_digital.ogg new file mode 100644 index 00000000..6461a700 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_piano_digital.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg new file mode 100644 index 00000000..329a43b4 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_squarewave.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_squarewave.ogg new file mode 100644 index 00000000..b6bc5c44 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_squarewave.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_bass_guitar.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_bass_guitar.ogg deleted file mode 100644 index 38e30490..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_bass_guitar.ogg and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_kick.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_kick.ogg deleted file mode 100644 index 108e89e3..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_kick.ogg and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_snare.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_snare.ogg deleted file mode 100644 index 25d7b783..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_snare.ogg and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_stick.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_stick.ogg deleted file mode 100644 index 5f52a95d..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_stick.ogg and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_xylophone_metal.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_xylophone_metal.ogg new file mode 100644 index 00000000..2d99327f Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_xylophone_metal.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_xylophone_wood.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_xylophone_wood.ogg new file mode 100644 index 00000000..5598f62d Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_xylophone_wood.ogg differ diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/depends.txt b/mods/ITEMS/REDSTONE/mesecons_pistons/depends.txt index 9455a4a7..c19acf4b 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/depends.txt +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/depends.txt @@ -2,3 +2,4 @@ mesecons mesecons_mvps mcl_mobitems doc? +screwdriver? diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua index e7e85a01..eb69d338 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua @@ -1,52 +1,46 @@ +local S = minetest.get_translator("mesecons_pistons") + +local PISTON_MAXIMUM_PUSH = 12 + -- Get mesecon rules of pistons -piston_rules = +local piston_rules = {{x=0, y=0, z=1}, --everything apart from z- (pusher side) {x=1, y=0, z=0}, {x=-1, y=0, z=0}, - {x=1, y=1, z=0}, - {x=1, y=-1, z=0}, - {x=-1, y=1, z=0}, - {x=-1, y=-1, z=0}, - {x=0, y=1, z=1}, - {x=0, y=-1, z=1}} + {x=0, y=1, z=0}, + {x=0, y=-1, z=0}} local piston_up_rules = {{x=0, y=0, z=-1}, --everything apart from y+ (pusher side) - {x=1, y=0, z=0}, - {x=-1, y=0, z=0}, {x=0, y=0, z=1}, - {x=1, y=-1, z=0}, - {x=-1, y=-1, z=0}, - {x=0, y=-1, z=1}, - {x=0, y=-1, z=-1}} + {x=-1, y=0, z=0}, + {x=1, y=0, z=0}, + {x=0, y=-1, z=0}} local piston_down_rules = {{x=0, y=0, z=-1}, --everything apart from y- (pusher side) - {x=1, y=0, z=0}, - {x=-1, y=0, z=0}, {x=0, y=0, z=1}, - {x=1, y=1, z=0}, - {x=-1, y=1, z=0}, - {x=0, y=1, z=1}, - {x=0, y=1, z=-1}} + {x=-1, y=0, z=0}, + {x=1, y=0, z=0}, + {x=0, y=1, z=0}} local piston_get_rules = function (node) local rules = piston_rules for i = 1, node.param2 do - rules = mesecon:rotate_rules_left(rules) + rules = mesecon.rotate_rules_left(rules) end return rules end -piston_facedir_direction = function (node) +local piston_facedir_direction = function (node) local rules = {{x = 0, y = 0, z = -1}} for i = 1, node.param2 do - rules = mesecon:rotate_rules_left(rules) + rules = mesecon.rotate_rules_left(rules) end return rules[1] end -piston_get_direction = function (dir, node) +local piston_get_direction = function (dir, node) if type(dir) == "function" then return dir(node) else @@ -54,30 +48,53 @@ piston_get_direction = function (dir, node) end end -local piston_remove_pusher = function (pos, node) - local pistonspec = minetest.registered_nodes[node.name].mesecons_piston +-- Remove pusher of piston. +-- To be used when piston was destroyed or dug. +local piston_remove_pusher = function (pos, oldnode) + local pistonspec = minetest.registered_nodes[oldnode.name].mesecons_piston - local dir = piston_get_direction(pistonspec.dir, node) - local pusherpos = mesecon:addPosRule(pos, dir) + local dir = piston_get_direction(pistonspec.dir, oldnode) + local pusherpos = vector.add(pos, dir) local pushername = minetest.get_node(pusherpos).name - if pushername == pistonspec.pusher then --make sure there actually is a pusher (for compatibility reasons mainly) + if pushername == pistonspec.pusher then -- make sure there actually is a pusher minetest.remove_node(pusherpos) core.check_for_falling(pusherpos) minetest.sound_play("piston_retract", { pos = pos, - max_hear_distance = 20, + max_hear_distance = 31, gain = 0.3, - }) + }, true) + end +end + +-- Remove base node of piston. +-- To be used when pusher was destroyed. +local piston_remove_base = function (pos, oldnode) + local basenodename = minetest.registered_nodes[oldnode.name].corresponding_piston + local pistonspec = minetest.registered_nodes[basenodename].mesecons_piston + + local dir = piston_get_direction(pistonspec.dir, oldnode) + local basepos = vector.subtract(pos, dir) + local basename = minetest.get_node(basepos).name + + if basename == pistonspec.onname then -- make sure there actually is a base node + minetest.remove_node(basepos) + core.check_for_falling(basepos) + minetest.sound_play("piston_retract", { + pos = pos, + max_hear_distance = 31, + gain = 0.3, + }, true) end end local piston_on = function (pos, node) local pistonspec = minetest.registered_nodes[node.name].mesecons_piston - dir = piston_get_direction(pistonspec.dir, node) - local np = mesecon:addPosRule(pos, dir) - success, stack = mesecon:mvps_push(np, dir, PISTON_MAXIMUM_PUSH) + local dir = piston_get_direction(pistonspec.dir, node) + local np = vector.add(pos, dir) + local success, stack, oldstack = mesecon.mvps_push(np, dir, PISTON_MAXIMUM_PUSH) if success then minetest.add_node(pos, {param2 = node.param2, name = pistonspec.onname}) minetest.add_node(np, {param2 = node.param2, name = pistonspec.pusher}) @@ -85,12 +102,13 @@ local piston_on = function (pos, node) if below.name == "mcl_farming:soil" or below.name == "mcl_farming:soil_wet" then minetest.set_node({x=np.x,y=np.y-1,z=np.z}, {name = "mcl_core:dirt"}) end - mesecon:mvps_process_stack(stack) + mesecon.mvps_process_stack(stack) + mesecon.mvps_move_objects(np, dir, oldstack) minetest.sound_play("piston_extend", { pos = pos, - max_hear_distance = 20, + max_hear_distance = 31, gain = 0.3, - }) + }, true) end end @@ -100,10 +118,10 @@ local piston_off = function (pos, node) piston_remove_pusher (pos, node) if pistonspec.sticky then - dir = piston_get_direction(pistonspec.dir, node) - pullpos = mesecon:addPosRule(pos, dir) - stack = mesecon:mvps_pull_single(pullpos, dir) - mesecon:mvps_process_stack(stack) + local dir = piston_get_direction(pistonspec.dir, node) + local pullpos = vector.add(pos, vector.multiply(dir, 2)) + local stack = mesecon.mvps_pull_single(pullpos, vector.multiply(dir, -1), PISTON_MAXIMUM_PUSH) + mesecon.mvps_process_stack(pos, dir, stack) end end @@ -112,14 +130,14 @@ local piston_orientate = function (pos, placer) if not placer then return end -- placer pitch in degrees - local pitch = placer:get_look_pitch() * (180 / math.pi) + local pitch = placer:get_look_vertical() * (180 / math.pi) local node = minetest.get_node(pos) local pistonspec = minetest.registered_nodes[node.name].mesecons_piston - if pitch > 55 then --looking upwards - minetest.add_node(pos, {name=pistonspec.piston_down}) - elseif pitch < -55 then --looking downwards + if pitch > 55 then minetest.add_node(pos, {name=pistonspec.piston_up}) + elseif pitch < -55 then + minetest.add_node(pos, {name=pistonspec.piston_down}) end end @@ -155,12 +173,13 @@ local pistonspec_normal = { piston_up = "mesecons_pistons:piston_up_normal_off", } -local usagehelp_piston = "This block can have one of 6 possible orientations. On placement, the pusher will face you." +local usagehelp_piston = S("This block can have one of 6 possible orientations.") -- offstate minetest.register_node("mesecons_pistons:piston_normal_off", { - description = "Piston", - _doc_items_longdesc = "A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.", + description = S("Piston"), + _tt_help = S("Pushes block when powered by redstone power"), + _doc_items_longdesc = S("A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however."), _doc_items_usagehelp = usagehelp_piston, tiles = { "mesecons_piston_bottom.png^[transformR180", @@ -170,9 +189,8 @@ minetest.register_node("mesecons_pistons:piston_normal_off", { "mesecons_piston_back.png", "mesecons_piston_pusher_front.png" }, - groups = {handy = 1}, + groups = {handy = 1, piston=1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, after_place_node = piston_orientate, @@ -182,8 +200,14 @@ minetest.register_node("mesecons_pistons:piston_normal_off", { action_on = piston_on, rules = piston_get_rules }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_AXIS then + minetest.set_node(pos, {name="mesecons_pistons:piston_up_normal_off"}) + return true + end + end, }) -- onstate @@ -197,13 +221,12 @@ minetest.register_node("mesecons_pistons:piston_normal_on", { "mesecons_piston_back.png", "mesecons_piston_on_front.png" }, - groups = {handy=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston=1, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_normal_off", - after_dig_node = piston_remove_pusher, + after_destruct = piston_remove_pusher, node_box = piston_on_box, selection_box = piston_on_box, mesecons_piston = pistonspec_normal, @@ -212,8 +235,9 @@ minetest.register_node("mesecons_pistons:piston_normal_on", { action_off = piston_off, rules = piston_get_rules }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = false, }) -- pusher @@ -228,15 +252,18 @@ minetest.register_node("mesecons_pistons:piston_pusher_normal", { "mesecons_piston_pusher_front.png" }, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", + groups = { piston_pusher = 1 }, is_ground_content = false, + after_destruct = piston_remove_base, diggable = false, + drop = "", corresponding_piston = "mesecons_pistons:piston_normal_on", selection_box = piston_pusher_box, node_box = piston_pusher_box, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, + on_rotate = false, }) -- Sticky ones @@ -253,8 +280,9 @@ local pistonspec_sticky = { -- offstate minetest.register_node("mesecons_pistons:piston_sticky_off", { - description = "Sticky Piston", - _doc_items_longdesc = "A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.", + description = S("Sticky Piston"), + _tt_help = S("Pushes or pulls block when powered by redstone power"), + _doc_items_longdesc = S("A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled."), _doc_items_usagehelp = usagehelp_piston, tiles = { @@ -265,9 +293,8 @@ minetest.register_node("mesecons_pistons:piston_sticky_off", { "mesecons_piston_back.png", "mesecons_piston_pusher_front_sticky.png" }, - groups = {handy=1}, + groups = {handy=1, piston=2}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, after_place_node = piston_orientate, @@ -277,8 +304,14 @@ minetest.register_node("mesecons_pistons:piston_sticky_off", { action_on = piston_on, rules = piston_get_rules }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_AXIS then + minetest.set_node(pos, {name="mesecons_pistons:piston_up_sticky_off"}) + return true + end + end, }) -- onstate @@ -292,13 +325,12 @@ minetest.register_node("mesecons_pistons:piston_sticky_on", { "mesecons_piston_back.png", "mesecons_piston_on_front.png" }, - groups = {handy=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston=2, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_sticky_off", - after_dig_node = piston_remove_pusher, + after_destruct = piston_remove_pusher, node_box = piston_on_box, selection_box = piston_on_box, mesecons_piston = pistonspec_sticky, @@ -307,8 +339,9 @@ minetest.register_node("mesecons_pistons:piston_sticky_on", { action_off = piston_off, rules = piston_get_rules }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = false, }) -- pusher @@ -323,15 +356,18 @@ minetest.register_node("mesecons_pistons:piston_pusher_sticky", { "mesecons_piston_pusher_front_sticky.png" }, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", + groups = { piston_pusher = 2 }, is_ground_content = false, + after_destruct = piston_remove_base, diggable = false, + drop = "", corresponding_piston = "mesecons_pistons:piston_sticky_on", selection_box = piston_pusher_box, node_box = piston_pusher_box, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, + on_rotate = false, }) -- @@ -374,9 +410,8 @@ minetest.register_node("mesecons_pistons:piston_up_normal_off", { "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", }, - groups = {handy=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston=1, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_normal_off", @@ -385,9 +420,18 @@ minetest.register_node("mesecons_pistons:piston_up_normal_off", { action_on = piston_on, rules = piston_up_rules, }}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 2.5, + sounds = mcl_sounds.node_sound_stone_defaults({ + footstep = mcl_sounds.node_sound_wood_defaults().footstep + }), + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_AXIS then + minetest.set_node(pos, {name="mesecons_pistons:piston_down_normal_off"}) + return true + end + return false + end, }) -- onstate @@ -401,23 +445,23 @@ minetest.register_node("mesecons_pistons:piston_up_normal_on", { "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", }, - groups = {hanry=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston_=1, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_normal_off", - after_dig_node = piston_remove_pusher, + after_destruct = piston_remove_pusher, node_box = piston_up_on_box, selection_box = piston_up_on_box, mesecons_piston = pistonspec_normal_up, - sounds = mcl_sounds.node_sound_wood_defaults(), + sounds = mcl_sounds.node_sound_stone_defaults(), mesecons = {effector={ action_off = piston_off, rules = piston_up_rules, }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = false, }) -- pusher @@ -432,15 +476,18 @@ minetest.register_node("mesecons_pistons:piston_up_pusher_normal", { "mesecons_piston_pusher_top.png^[transformR180", }, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", + groups = { piston_pusher = 1 }, is_ground_content = false, + after_destruct = piston_remove_base, diggable = false, + drop = "", corresponding_piston = "mesecons_pistons:piston_up_normal_on", selection_box = piston_up_pusher_box, node_box = piston_up_pusher_box, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, + on_rotate = false, }) @@ -466,20 +513,28 @@ minetest.register_node("mesecons_pistons:piston_up_sticky_off", { "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", }, - groups = {handy=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston=2, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_sticky_off", mesecons_piston = pistonspec_sticky_up, - sounds = mcl_sounds.node_sound_wood_defaults(), + sounds = mcl_sounds.node_sound_stone_defaults({ + footstep = mcl_sounds.node_sound_wood_defaults().footstep + }), mesecons = {effector={ action_on = piston_on, rules = piston_up_rules, }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_AXIS then + minetest.set_node(pos, {name="mesecons_pistons:piston_down_sticky_off"}) + return true + end + return false + end, }) -- onstate @@ -493,23 +548,23 @@ minetest.register_node("mesecons_pistons:piston_up_sticky_on", { "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", }, - groups = {handy=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston=2, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_sticky_off", - after_dig_node = piston_remove_pusher, + after_destruct = piston_remove_pusher, node_box = piston_up_on_box, selection_box = piston_up_on_box, mesecons_piston = pistonspec_sticky_up, - sounds = mcl_sounds.node_sound_wood_defaults(), + sounds = mcl_sounds.node_sound_stone_defaults(), mesecons = {effector={ action_off = piston_off, rules = piston_up_rules, }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = false, }) -- pusher @@ -524,15 +579,18 @@ minetest.register_node("mesecons_pistons:piston_up_pusher_sticky", { "mesecons_piston_pusher_top.png^[transformR180", }, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", + groups = { piston_pusher = 2 }, is_ground_content = false, + after_destruct = piston_remove_base, diggable = false, + drop = "", corresponding_piston = "mesecons_pistons:piston_up_sticky_on", selection_box = piston_up_pusher_box, node_box = piston_up_pusher_box, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, + on_rotate = false, }) -- @@ -577,9 +635,8 @@ minetest.register_node("mesecons_pistons:piston_down_normal_off", { "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", }, - groups = {handy=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston=1, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_normal_off", @@ -589,8 +646,15 @@ minetest.register_node("mesecons_pistons:piston_down_normal_off", { action_on = piston_on, rules = piston_down_rules, }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_AXIS then + minetest.set_node(pos, {name="mesecons_pistons:piston_normal_off"}) + return true + end + return false + end, }) -- onstate @@ -604,13 +668,12 @@ minetest.register_node("mesecons_pistons:piston_down_normal_on", { "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", }, - groups = {handy=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston=1, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_normal_off", - after_dig_node = piston_remove_pusher, + after_destruct = piston_remove_pusher, node_box = piston_down_on_box, selection_box = piston_down_on_box, mesecons_piston = pistonspec_normal_down, @@ -619,8 +682,9 @@ minetest.register_node("mesecons_pistons:piston_down_normal_on", { action_off = piston_off, rules = piston_down_rules, }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = false, }) -- pusher @@ -635,15 +699,18 @@ minetest.register_node("mesecons_pistons:piston_down_pusher_normal", { "mesecons_piston_pusher_top.png", }, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", + groups = { piston_pusher = 1 }, is_ground_content = false, + after_destruct = piston_remove_base, diggable = false, + drop = "", corresponding_piston = "mesecons_pistons:piston_down_normal_on", selection_box = piston_down_pusher_box, node_box = piston_down_pusher_box, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, + on_rotate = false, }) -- Sticky @@ -666,9 +733,8 @@ minetest.register_node("mesecons_pistons:piston_down_sticky_off", { "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", }, - groups = {handy=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston=2, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_sticky_off", @@ -678,8 +744,15 @@ minetest.register_node("mesecons_pistons:piston_down_sticky_off", { action_on = piston_on, rules = piston_down_rules, }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_AXIS then + minetest.set_node(pos, {name="mesecons_pistons:piston_sticky_off"}) + return true + end + return false + end, }) -- onstate @@ -693,13 +766,12 @@ minetest.register_node("mesecons_pistons:piston_down_sticky_on", { "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", }, - groups = {handy=1, not_in_creative_inventory = 1}, + groups = {handy=1, piston=1, not_in_creative_inventory = 1}, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_sticky_off", - after_dig_node = piston_remove_pusher, + after_destruct = piston_remove_pusher, node_box = piston_down_on_box, selection_box = piston_down_on_box, mesecons_piston = pistonspec_sticky_down, @@ -708,8 +780,9 @@ minetest.register_node("mesecons_pistons:piston_down_sticky_on", { action_off = piston_off, rules = piston_down_rules, }}, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + on_rotate = false, }) -- pusher @@ -724,15 +797,18 @@ minetest.register_node("mesecons_pistons:piston_down_pusher_sticky", { "mesecons_piston_pusher_top.png", }, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", + groups = { piston_pusher = 2 }, is_ground_content = false, + after_destruct = piston_remove_base, diggable = false, + drop = "", corresponding_piston = "mesecons_pistons:piston_down_sticky_on", selection_box = piston_down_pusher_box, node_box = piston_down_pusher_box, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, + on_rotate = false, }) @@ -759,14 +835,14 @@ local piston_pusher_up_down_get_stopper = function (node, dir, stack, stackid) return true end -mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal", piston_pusher_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky", piston_pusher_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal", piston_pusher_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky", piston_pusher_up_down_get_stopper) -- Register pistons as stoppers if they would be seperated from the stopper @@ -781,14 +857,14 @@ local piston_up_down_get_stopper = function (node, dir, stack, stackid) end local piston_get_stopper = function (node, dir, stack, stackid) - pistonspec = minetest.registered_nodes[node.name].mesecons_piston + local pistonspec = minetest.registered_nodes[node.name].mesecons_piston dir = piston_get_direction(pistonspec.dir, node) - local pusherpos = mesecon:addPosRule(stack[stackid].pos, dir) + local pusherpos = vector.add(stack[stackid].pos, dir) local pushernode = minetest.get_node(pusherpos) if minetest.registered_nodes[node.name].mesecons_piston.pusher == pushernode.name then for _, s in ipairs(stack) do - if mesecon:cmpPos(s.pos, pusherpos) -- pusher is also to be pushed + if vector.equals(s.pos, pusherpos) -- pusher is also to be pushed and s.node.param2 == node.param2 then return false end @@ -797,14 +873,14 @@ local piston_get_stopper = function (node, dir, stack, stackid) return true end -mesecon:register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_up_normal_on", piston_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_up_sticky_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_normal_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_sticky_on", piston_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_down_normal_on", piston_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_down_sticky_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_normal_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_sticky_on", piston_up_down_get_stopper) --craft recipes minetest.register_craft({ diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.de.tr b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.de.tr new file mode 100644 index 00000000..9719812b --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.de.tr @@ -0,0 +1,8 @@ +# textdomain: mesecons_pistons +This block can have one of 6 possible orientations.=Dieser Block kann eine von 6 möglichen Richtungen annehmen. +Piston=Kolben +A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.=Ein Kolben ist eine Redstonekomponente mit einem Schieber den Block oder die Blöcke vor ihm schieben wird, wenn er mit Redstoneenergie versorgt wird. Allerdings können nicht alle Blöcke können geschoben werden. +Sticky Piston=Klebriger Kolben +A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.=Ein klebriger Kolben ist eine Redstonekomponente mit einem klebrigen Schieber, der ein- und ausgefahren werden kann. Er fährt aus, wenn er mit Redstoneenergie versorgt wird. Wenn der Schieber ausgefahren wird, schiebt er den Block oder die Blöcke vor ihm. Wird er eingefahren, zieht er den Block vor ihm zu sich. Nicht alle Blöcke können geschoben oder gezogen werden. +Pushes block when powered by redstone power=Schiebt Block, wenn mit Redstoneenergie versorgt +Pushes or pulls block when powered by redstone power=Schiebt oder zieht Block, wenn mit Redstoneenergie versorgt diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.es.tr b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.es.tr new file mode 100644 index 00000000..113472ac --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.es.tr @@ -0,0 +1,6 @@ +# textdomain: mesecons_pistons +This block can have one of 6 possible orientations.=Este bloque puede tener una de las 6 orientaciones posibles. +Piston=Pistón +A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.=Un pistón es un componente de redstone con un empujador que empuja el bloque o bloques frente a él cuando se le suministra energía de redstone. Sin embargo, no todos los bloques se pueden empujar. +Sticky Piston=Pistón pegajoso +A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.=Un pistón pegajoso es un componente de redstone con un empujador pegajoso que se puede extender y retraer. Se extiende cuando se le suministra energía de redstone. Cuando el empujador se extiende, empuja el bloque o bloques frente a él. Cuando se retrae, tira hacia atrás el bloque único que está frente a él. Tenga en cuenta que no todos los bloques se pueden empujar o tirar. diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.fr.tr b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.fr.tr new file mode 100644 index 00000000..9046e2d6 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.fr.tr @@ -0,0 +1,8 @@ +# textdomain: mesecons_pistons +This block can have one of 6 possible orientations.=Ce bloc peut avoir l'une des 6 orientations possibles. +Piston=Piston +A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.=Un piston est un composant de redstone avec un poussoir qui pousse le ou les blocs devant lui lorsqu'il est alimenté en redstone. Cependant, tous les blocs ne peuvent pas être poussés. +Sticky Piston=Piston collant +A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.=Un piston collant est un composant de redstone avec un poussoir collant qui peut être étendu et rétracté. Il se prolonge lorsqu'il est alimenté en redstone. Lorsque le poussoir s'étend, il pousse le ou les blocs devant lui. Quand il se rétracte, il recule le bloc unique devant lui. Notez que tous les blocs ne peuvent pas être poussés ou tirés. +Pushes block when powered by redstone power=Pousse le bloc lorsqu'il est alimenté par la puissance Redstone +Pushes or pulls block when powered by redstone power=Pousse ou tire le bloc lorsqu'il est alimenté par une puissance redstone diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt new file mode 100644 index 00000000..6b54c584 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: mesecons_pistons +This block can have one of 6 possible orientations.= +Piston= +A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.= +Sticky Piston= +A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.= +Pushes block when powered by redstone power= +Pushes or pulls block when powered by redstone power= diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua index 86b15433..2e161ae4 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua @@ -1,3 +1,7 @@ +local S = minetest.get_translator("mesecons_pressureplates") + +local PRESSURE_PLATE_INTERVAL = 0.04 + local pp_box_off = { type = "fixed", fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, @@ -8,32 +12,59 @@ local pp_box_on = { fixed = { -7/16, -8/16, -7/16, 7/16, -7.5/16, 7/16 }, } -pp_on_timer = function (pos, elapsed) - local node = minetest.get_node(pos) - local ppspec = minetest.registered_nodes[node.name].pressureplate +local function pp_on_timer(pos, elapsed) + local node = minetest.get_node(pos) + local basename = minetest.registered_nodes[node.name].pressureplate_basename + local activated_by = minetest.registered_nodes[node.name].pressureplate_activated_by -- This is a workaround for a strange bug that occurs when the server is started -- For some reason the first time on_timer is called, the pos is wrong - if not ppspec then return end + if not basename then return end - local objs = minetest.get_objects_inside_radius(pos, 1) - local two_below = mesecon:addPosRule(pos, {x = 0, y = -2, z = 0}) + if activated_by == nil then + activated_by = { any = true } + end - if objs[1] == nil and node.name == ppspec.onstate then - minetest.add_node(pos, {name = ppspec.offstate}) - mesecon:receptor_off(pos) - -- force deactivation of mesecon two blocks below (hacky) - if not mesecon:connected_to_receptor(two_below) then - mesecon:turnoff(two_below) + local obj_does_activate = function(obj, activated_by) + if activated_by.any then + return true + elseif activated_by.mob and obj:get_luaentity() and obj:get_luaentity()._cmi_is_mob == true then + return true + elseif activated_by.player and obj:is_player() then + return true + else + return false end - elseif node.name == ppspec.offstate then + end + + local objs = minetest.get_objects_inside_radius(pos, 1) + + if node.name == basename .. "_on" then + local disable + if #objs == 0 then + disable = true + elseif not activated_by.any then + disable = true + for k, obj in pairs(objs) do + if obj_does_activate(obj, activated_by) then + disable = false + break + end + end + end + if disable then + minetest.set_node(pos, {name = basename .. "_off"}) + mesecon.receptor_off(pos, mesecon.rules.pplate) + end + elseif node.name == basename .. "_off" then for k, obj in pairs(objs) do - local objpos = obj:getpos() - if objpos.y > pos.y-1 and objpos.y < pos.y then - minetest.add_node(pos, {name=ppspec.onstate}) - mesecon:receptor_on(pos) - -- force activation of mesecon two blocks below (hacky) - mesecon:turnon(two_below) + local objpos = obj:get_pos() + if obj_does_activate(obj, activated_by) then + if objpos.y > pos.y-1 and objpos.y < pos.y then + minetest.set_node(pos, {name = basename .. "_on"}) + mesecon.receptor_on(pos, mesecon.rules.pplate) + break + end end end end @@ -41,119 +72,133 @@ pp_on_timer = function (pos, elapsed) end -- Register a Pressure Plate --- offstate: name of the pressure plate when inactive --- onstate: name of the pressure plate when active +-- basename: base name of the pressure plate -- description: description displayed in the player's inventory --- tiles_off: textures of the pressure plate when inactive --- tiles_on: textures of the pressure plate when active --- image: inventory and wield image of the pressure plate +-- textures_off:textures of the pressure plate when inactive +-- textures_on: textures of the pressure plate when active +-- image_w: wield image of the pressure plate +-- image_i: inventory image of the pressure plate -- recipe: crafting recipe of the pressure plate -- sounds: sound table (like in minetest.register_node) -- plusgroups: group memberships (attached_node=1 and not_in_creative_inventory=1 are already used) +-- activated_by: optinal table with elements denoting by which entities this pressure plate is triggered +-- Possible table fields: +-- * player=true: Player +-- * mob=true: Mob +-- By default, is triggered by all entities +-- longdesc: Customized long description for the in-game help (if omitted, a dummy text is used) -function mesecon:register_pressure_plate(offstate, onstate, description, texture_off, texture_on, recipe, sounds, plusgroups) - local ppspec = { - offstate = offstate, - onstate = onstate - } - +function mesecon.register_pressure_plate(basename, description, textures_off, textures_on, image_w, image_i, recipe, sounds, plusgroups, activated_by, longdesc) local groups_off = table.copy(plusgroups) groups_off.attached_node = 1 groups_off.dig_by_piston = 1 - - minetest.register_node(offstate, { - drawtype = "nodebox", - tiles = {texture_off}, - wield_image = texture_off, - wield_scale = { x=1, y=1, z=0.5 }, - paramtype = "light", - sunlight_propagates = true, - selection_box = pp_box_off, - node_box = pp_box_off, - groups = groups_off, - is_ground_content = false, - description = description, - _doc_items_longdesc = "A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.", - pressureplate = ppspec, - on_timer = pp_on_timer, - sounds = sounds, - mesecons = {receptor = { - state = mesecon.state.off - }}, - on_construct = function(pos) - minetest.get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL) - end, - _mcl_blast_resistance = 2.5, - _mcl_hardness = 0.5, - }) - + groups_off.pressure_plate = 1 local groups_on = table.copy(groups_off) groups_on.not_in_creative_inventory = 1 + groups_on.pressure_plate = 2 + if not longdesc then + longdesc = S("A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.") + end + local tt = S("Provides redstone power when pushed") + if not activated_by then + tt = tt .. "\n" .. S("Pushable by players, mobs and objects") + elseif activated_by.mob and activated_by.player then + tt = tt .. "\n" .. S("Pushable by players and mobs") + elseif activated_by.mob then + tt = tt .. "\n" .. S("Pushable by mobs") + elseif activated_by.player then + tt = tt .. "\n" .. S("Pushable by players") + end - minetest.register_node(onstate, { + mesecon.register_node(basename, { drawtype = "nodebox", - tiles = {texture_on}, - wield_image = texture_on, - wield_scale = { x=1, y=1, z=0.25 }, + inventory_image = image_i, + wield_image = image_w, paramtype = "light", - sunlight_propagates = true, - selection_box = pp_box_on, - node_box = pp_box_on, - groups = groups_on, - is_ground_content = false, - drop = offstate, - pressureplate = ppspec, + walkable = false, + description = description, on_timer = pp_on_timer, - sounds = sounds, - mesecons = {receptor = { - state = mesecon.state.on - }}, on_construct = function(pos) minetest.get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL) end, - after_dig_node = function(pos) - local two_below = mesecon:addPosRule(pos, {x = 0, y = -2, z = 0}) - if not mesecon:connected_to_receptor(two_below) then - mesecon:turnoff(two_below) - end - end, - _mcl_blast_resistance = 2.5, + sounds = sounds, + is_ground_content = false, + pressureplate_basename = basename, + pressureplate_activated_by = activated_by, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + },{ + node_box = pp_box_off, + selection_box = pp_box_off, + groups = groups_off, + tiles = textures_off, + + mesecons = {receptor = { state = mesecon.state.off, rules = mesecon.rules.pplate }}, + _doc_items_longdesc = longdesc, + _tt_help = tt, + },{ + node_box = pp_box_on, + selection_box = pp_box_on, + groups = groups_on, + tiles = textures_on, + description = "", + + mesecons = {receptor = { state = mesecon.state.on, rules = mesecon.rules.pplate }}, + _doc_items_create_entry = false, }) minetest.register_craft({ - output = offstate, + output = basename .. "_off", recipe = recipe, }) if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", offstate, "nodes", onstate) + doc.add_entry_alias("nodes", basename .. "_off", "nodes", basename .. "_on") end end -mesecon:register_pressure_plate( - "mesecons_pressureplates:pressure_plate_wood_off", - "mesecons_pressureplates:pressure_plate_wood_on", - "Wooden Pressure Plate", - "default_wood.png", - "default_wood.png", - {{"group:wood", "group:wood"}}, - mcl_sounds.node_sound_wood_defaults(), - {axey=1, material_wood=1}) +local woods = { + { "wood", "mcl_core:wood", "default_wood.png", S("Oak Pressure Plate") }, + { "acaciawood", "mcl_core:acaciawood", "default_acacia_wood.png", S("Acacia Pressure Plate") }, + { "birchwood", "mcl_core:birchwood", "mcl_core_planks_birch.png", S("Birch Pressure Plate") }, + { "darkwood", "mcl_core:darkwood", "mcl_core_planks_big_oak.png", S("Dark Oak Pressure Plate" )}, + { "sprucewood", "mcl_core:sprucewood", "mcl_core_planks_spruce.png", S("Spruce Pressure Plate") }, + { "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Pressure Plate") }, +} -mesecon:register_pressure_plate( - "mesecons_pressureplates:pressure_plate_stone_off", - "mesecons_pressureplates:pressure_plate_stone_on", - "Stone Pressure Plate", - "default_stone.png", +for w=1, #woods do + mesecon.register_pressure_plate( + "mesecons_pressureplates:pressure_plate_"..woods[w][1], + woods[w][4], + {woods[w][3]}, + {woods[w][3]}, + woods[w][3], + nil, + {{woods[w][2], woods[w][2]}}, + mcl_sounds.node_sound_wood_defaults(), + {axey=1, material_wood=1}, + nil, + S("A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.")) + + minetest.register_craft({ + type = "fuel", + recipe = "mesecons_pressureplates:pressure_plate_"..woods[w][1].."_off", + burntime = 15 + }) + +end + +mesecon.register_pressure_plate( + "mesecons_pressureplates:pressure_plate_stone", + S("Stone Pressure Plate"), + {"default_stone.png"}, + {"default_stone.png"}, "default_stone.png", + nil, {{"mcl_core:stone", "mcl_core:stone"}}, mcl_sounds.node_sound_stone_defaults(), - {pickaxey=1, material_stone=1}) + {pickaxey=1, material_stone=1}, + { player = true, mob = true }, + S("A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.")) -minetest.register_craft({ - type = "fuel", - recipe = "mesecons_pressureplates:pressure_plate_wood_off", - burntime = 15 -}) diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr new file mode 100644 index 00000000..6e5e761e --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr @@ -0,0 +1,16 @@ +# textdomain: mesecons_pressureplates +A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.=Eine Druckplatte ist eine Redstonekomponente, die ihre benachbarten Blöcke mit Redstoneenergie versorgt, wenn sich jemand oder etwas auf ihr befindet. +Oak Pressure Plate=Eichendruckplatte +Acacia Pressure Plate=Akaziendruckplatte +Birch Pressure Plate=Birkendruckplatte +Dark Oak Pressure Plate=Schwarzeichendruckplatte +Spruce Pressure Plate=Fichtendruckplatte +Jungle Pressure Plate=Dschungeldruckplatte +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Eine Holzdruckplatte ist eine Redstonekomponente, die ihre benachbarten Blöcke mit Redstoneenergie versorgt, solange sich ein beliebiges bewegliches Objekt (wie Gegenstände, Spieler und Mobs) auf ihm befindet. +Stone Pressure Plate=Steindruckplatte +A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Eine Steindruckplatte ist eine Redstonekomponente, die ihre benachbarten Blöcke mit Redstoneenergie versorgt, solange sich ein Spieler oder Mob auf ihm befindet. Sie wird von nichts anderem ausgelöst. +Provides redstone power when pushed=Gibt Redstoneenergie aus, wenn gedrückt +Pushable by players, mobs and objects=Drückbar von Spielern, Mobs und Objekten +Pushable by players and mobs=Drückbar von Spielern und Mobs +Pushable by players=Drückbar von Spielern +Pushable by mobs=Drückbar von Mobs diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.es.tr b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.es.tr new file mode 100644 index 00000000..d30dfbfa --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.es.tr @@ -0,0 +1,11 @@ +# textdomain: mesecons_pressureplates +A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.=Una placa de presión es un componente de redstone que suministra a sus bloques circundantes energía de redstone mientras alguien o algo descansa sobre ella. +Oak Pressure Plate=Placa de presión de roble +Acacia Pressure Plate=Placa de presión de acacia +Birch Pressure Plate=Placa de presión de abedul +Dark Oak Pressure Plate=Placa de presión de roble oscuro +Spruce Pressure Plate=Placa de presión de abeto +Jungle Pressure Plate=Placa de presión de jungla +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Una placa de presión de madera es un componente de redstone que suministra a sus bloques circundantes energía de redstone mientras que cualquier objeto móvil (incluidos los objetos caídos, jugadores y mobs) descansa sobre él. +Stone Pressure Plate=Placa de presión de piedra +A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Una placa de presión de piedra es un componente de redstone que suministra a sus bloques circundantes poder de redstone mientras un jugador o una criatura se paran encima. No se desencadena por nada más. diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr new file mode 100644 index 00000000..ef145de5 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr @@ -0,0 +1,16 @@ +# textdomain: mesecons_pressureplates +A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.=Une plaque de pression est un composant de redstone qui alimente ses blocs environnants en puissance de redstone pendant que quelqu'un ou quelque chose repose dessus. +Oak Pressure Plate=Plaque de pression en Chêne +Acacia Pressure Plate=Plaque de pression en Acacia +Birch Pressure Plate=Plaque de pression en Bouleau +Dark Oak Pressure Plate=Plaque de pression en Chêne Noir +Spruce Pressure Plate=Plaque de pression en Sapin +Jungle Pressure Plate=Plaque de pression en Acajou +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Une plaque de pression en bois est un composant de redstone qui alimente ses blocs environnants en puissance de redstone tandis que tout objet mobile (y compris les objets lâchés, les joueurs et les mobs) repose dessus. +Stone Pressure Plate=Plaque de pression en pierre +A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Une plaque de pression en pierre est un composant de redstone qui alimente ses blocs environnants en puissance de redstone pendant qu'un joueur ou un mob se tient au-dessus. Il n'est déclenché par rien d'autre. +Provides redstone power when pushed=Fournit une puissance de redstone lorsqu'il est poussé +Pushable by players, mobs and objects=Poussable par les joueurs, les mobs et les objets +Pushable by players and mobs=Poussable par les joueurs et les mobs +Pushable by players=Poussable par les joueurs +Pushable by mobs=Poussable par les mobs diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt new file mode 100644 index 00000000..96eb3f92 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: mesecons_pressureplates +A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.= +Oak Pressure Plate= +Acacia Pressure Plate= +Birch Pressure Plate= +Dark Oak Pressure Plate= +Spruce Pressure Plate= +Jungle Pressure Plate= +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.= +Stone Pressure Plate= +A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.= +Provides redstone power when pushed= +Pushable by players, mobs and objects= +Pushable by players and mobs= +Pushable by players= +Pushable by mobs= diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index 1825d90e..b256d87e 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -1,6 +1,8 @@ -local boxes = { -8/16, -8/16, -8/16, 8/16, -2/16, 8/16 } -- Solar Pannel +local S = minetest.get_translator("mesecons_solarpanel") --- Solar Panel +local boxes = { -8/16, -8/16, -8/16, 8/16, -2/16, 8/16 } + +-- Daylight Sensor minetest.register_node("mesecons_solarpanel:solar_panel_on", { drawtype = "nodebox", tiles = { "jeija_solar_panel.png","jeija_solar_panel.png","jeija_solar_panel_side.png", @@ -8,7 +10,6 @@ minetest.register_node("mesecons_solarpanel:solar_panel_on", { wield_image = "jeija_solar_panel.png", wield_scale = { x=1, y=1, z=3 }, paramtype = "light", - sunlight_propagates = true, is_ground_content = false, selection_box = { type = "fixed", @@ -19,22 +20,26 @@ minetest.register_node("mesecons_solarpanel:solar_panel_on", { fixed = boxes }, drop = "mesecons_solarpanel:solar_panel_off", - description="Daylight Sensor", _doc_items_create_entry = false, - groups = {handy=1,axey=1, not_in_creative_inventory = 1, material_wood=1}, + groups = {handy=1,axey=1, not_in_creative_inventory = 1, material_wood=1, flammable=-1}, sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { - state = mesecon.state.on + state = mesecon.state.on, + rules = mesecon.rules.pplate, }}, on_rightclick = function(pos, node, clicker, pointed_thing) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end minetest.swap_node(pos, {name = "mesecons_solarpanel:solar_panel_inverted_off"}) - mesecon:receptor_off(pos) + mesecon.receptor_off(pos, mesecon.rules.pplate) end, - _mcl_blast_resistance = 1, + _mcl_blast_resistance = 0.2, _mcl_hardness = 0.2, }) --- Solar Panel minetest.register_node("mesecons_solarpanel:solar_panel_off", { drawtype = "nodebox", tiles = { "jeija_solar_panel.png","jeija_solar_panel.png","jeija_solar_panel_side.png", @@ -42,7 +47,6 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", { wield_image = "jeija_solar_panel.png", wield_scale = { x=1, y=1, z=3 }, paramtype = "light", - sunlight_propagates = true, is_ground_content = false, selection_box = { type = "fixed", @@ -53,18 +57,26 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", { fixed = boxes }, groups = {handy=1,axey=1, material_wood=1}, - description="Daylight Sensor", - _doc_items_longdesc = "Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.", - _doc_items_usagehelp = "Rightclick the daylight sensor to turn it into an inverted daylight sensor, which supplies redstone energy when it is in moonlight.", + description=S("Daylight Sensor"), + _tt_help = S("Provides redstone power when in sunlight") .. "\n" ..S("Can be inverted"), + _doc_items_longdesc = S("Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.").."\n".. + S("In inverted state, they provide redstone power when they are not in sunlight and no power otherwise."), + _doc_items_usagehelp = S("Use the daylight sensor to toggle its state."), sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { - state = mesecon.state.off + state = mesecon.state.off, + rules = mesecon.rules.pplate, }}, on_rightclick = function(pos, node, clicker, pointed_thing) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end minetest.swap_node(pos, {name = "mesecons_solarpanel:solar_panel_inverted_on"}) - mesecon:receptor_on(pos) + mesecon.receptor_on(pos, mesecon.rules.pplate) end, - _mcl_blast_resistance = 1, + _mcl_blast_resistance = 0.2, _mcl_hardness = 0.2, }) @@ -87,7 +99,7 @@ minetest.register_abm({ if light >= 12 and minetest.get_timeofday() > 0.2 and minetest.get_timeofday() < 0.8 then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_on", param2=node.param2}) - mesecon:receptor_on(pos) + mesecon.receptor_on(pos, mesecon.rules.pplate) end end, }) @@ -102,14 +114,13 @@ minetest.register_abm({ if light < 12 then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_off", param2=node.param2}) - mesecon:receptor_off(pos) + mesecon.receptor_off(pos, mesecon.rules.pplate) end end, }) ---- Solar panel inversed +--- Inverted Daylight Sensor --- Solar Panel minetest.register_node("mesecons_solarpanel:solar_panel_inverted_on", { drawtype = "nodebox", tiles = { "jeija_solar_panel_inverted.png","jeija_solar_panel_inverted.png","jeija_solar_panel_side.png", @@ -117,7 +128,6 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_on", { wield_image = "jeija_solar_panel_inverted.png", wield_scale = { x=1, y=1, z=3 }, paramtype = "light", - sunlight_propagates = true, is_ground_content = false, selection_box = { type = "fixed", @@ -129,21 +139,25 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_on", { }, drop = "mesecons_solarpanel:solar_panel_off", groups = {handy=1,axey=1, not_in_creative_inventory = 1, material_wood=1}, - description="Inverted Daylight Sensor", _doc_items_create_entry = false, sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { - state = mesecon.state.on + state = mesecon.state.on, + rules = mesecon.rules.pplate, }}, on_rightclick = function(pos, node, clicker, pointed_thing) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end minetest.swap_node(pos, {name = "mesecons_solarpanel:solar_panel_off"}) - mesecon:receptor_off(pos) + mesecon.receptor_off(pos, mesecon.rules.pplate) end, - _mcl_blast_resistance = 1, + _mcl_blast_resistance = 0.2, _mcl_hardness = 0.2, }) --- Solar Panel minetest.register_node("mesecons_solarpanel:solar_panel_inverted_off", { drawtype = "nodebox", tiles = { "jeija_solar_panel_inverted.png","jeija_solar_panel_inverted.png","jeija_solar_panel_side.png", @@ -151,7 +165,6 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_off", { wield_image = "jeija_solar_panel_inverted.png", wield_scale = { x=1, y=1, z=3 }, paramtype = "light", - sunlight_propagates = true, is_ground_content = false, selection_box = { type = "fixed", @@ -163,18 +176,23 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_off", { }, drop = "mesecons_solarpanel:solar_panel_off", groups = {handy=1,axey=1, not_in_creative_inventory=1, material_wood=1}, - description="Inverted Daylight Sensor", - _doc_items_longdesc = "An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor.", - _doc_items_usagehelp = "Rightclick the daylight sensor to turn it into a daylight sensor.", + description=S("Inverted Daylight Sensor"), + _doc_items_create_entry = false, sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { - state = mesecon.state.off + state = mesecon.state.off, + rules = mesecon.rules.pplate, }}, on_rightclick = function(pos, node, clicker, pointed_thing) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end minetest.swap_node(pos, {name = "mesecons_solarpanel:solar_panel_on"}) - mesecon:receptor_on(pos) + mesecon.receptor_on(pos, mesecon.rules.pplate) end, - _mcl_blast_resistance = 1, + _mcl_blast_resistance = 0.2, _mcl_hardness = 0.2, }) @@ -188,7 +206,7 @@ minetest.register_abm({ if light < 12 then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_inverted_on", param2=node.param2}) - mesecon:receptor_on(pos) + mesecon.receptor_on(pos, mesecon.rules.pplate) end end, }) @@ -203,7 +221,7 @@ minetest.register_abm({ if light >= 12 and minetest.get_timeofday() > 0.8 and minetest.get_timeofday() < 0.2 then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_inverted_off", param2=node.param2}) - mesecon:receptor_off(pos) + mesecon.receptor_off(pos, mesecon.rules.pplate) end end, }) @@ -216,5 +234,7 @@ minetest.register_craft({ if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_off", "nodes", "mesecons_solarpanel:solar_panel_on") - doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_inverted_off", "nodes", "mesecons_solarpanel:solar_panel_inverted_on") + doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_off", "nodes", "mesecons_solarpanel:solar_panel_inverted_off") + doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_off", "nodes", "mesecons_solarpanel:solar_panel_inverted_off") + doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_off", "nodes", "mesecons_solarpanel:solar_panel_inverted_on") end diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr new file mode 100644 index 00000000..c33fe949 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr @@ -0,0 +1,8 @@ +# textdomain: mesecons_solarpanel +Daylight Sensor=Tageslichtsensor +Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Tageslichtsensoren sind Redstonekomponenten, die Redstoneenergie liefern, wenn sie im Sonnenlicht stehen, sonst nicht. Sie können auch invertiert werden. +Inverted Daylight Sensor=Invertierter Tageslichtsensor +Use the daylight sensor to toggle its state.=Benutzen Sie den Tageslichtsensor, um seinen Zustand umzuschalten. +In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.=Im invertierten Zustand erzeugen sie Redstoneenergie, wenn sie sich nicht im Tageslicht befinden, ansonsten nicht. +Provides redstone power when in sunlight=Gibt Redstoneenergie aus, wenn im Sonnenlicht +Can be inverted=Kann invertiert werden diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.es.tr b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.es.tr new file mode 100644 index 00000000..986a16d8 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.es.tr @@ -0,0 +1,6 @@ +# textdomain: mesecons_solarpanel +Daylight Sensor=Sensor de luz solar +Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Los sensores de luz diurna son componentes de redstone que proporcionan energía de redstone cuando están bajo la luz solar y no tienen energía de otra manera. También se pueden invertir. +Inverted Daylight Sensor=Sensor de luz solar invertido +Use the daylight sensor to toggle its state.=Use el sensor de luz diurna para alternar su estado. +In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.=En estado invertido, proporcionan energía de redstone cuando no están bajo la luz solar y no tienen energía de otra manera. diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.fr.tr b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.fr.tr new file mode 100644 index 00000000..a0b7ad7b --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.fr.tr @@ -0,0 +1,8 @@ +# textdomain: mesecons_solarpanel +Daylight Sensor=Capteur de luminosité +Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Les capteurs de luminosité sont des composants de redstone qui fournissent une puissance de redstone lorsqu'ils sont en plein soleil et aucune autrement. Ils peuvent également être inversés. +Use the daylight sensor to toggle its state.=Utilisez le capteur de luminosité pour basculer son état. +Inverted Daylight Sensor=Capteur de luminosité inversé +In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.=En état inversé, ils fournissent une puissance de redstone lorsqu'ils ne sont pas en plein soleil et aucune puissance autrement. +Provides redstone power when in sunlight=Fournit une puissance de redstone en plein soleil +Can be inverted=Peut être inversé diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt new file mode 100644 index 00000000..84c3ce42 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: mesecons_solarpanel +Daylight Sensor= +Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.= +Use the daylight sensor to toggle its state.= +Inverted Daylight Sensor= +In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.= +Provides redstone power when in sunlight= +Can be inverted= diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/init.lua b/mods/ITEMS/REDSTONE/mesecons_torch/init.lua index f2b2136b..5e68306f 100644 --- a/mods/ITEMS/REDSTONE/mesecons_torch/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_torch/init.lua @@ -1,37 +1,113 @@ ---MESECON TORCHES +-- REDSTONE TORCH AND BLOCK OF REDSTONE + +local S = minetest.get_translator("mesecons_torch") + +local TORCH_COOLOFF = 120 -- Number of seconds it takes for a burned-out torch to reactivate local rotate_torch_rules = function (rules, param2) - if param2 == 5 then - return mesecon:rotate_rules_right(rules) + if param2 == 1 then + return rules + elseif param2 == 5 then + return mesecon.rotate_rules_right(rules) elseif param2 == 2 then - return mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) --180 degrees + return mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) --180 degrees elseif param2 == 4 then - return mesecon:rotate_rules_left(rules) - elseif param2 == 1 then - return mesecon:rotate_rules_down(rules) + return mesecon.rotate_rules_left(rules) elseif param2 == 0 then - return mesecon:rotate_rules_up(rules) + return rules else return rules end end local torch_get_output_rules = function(node) - local rules = { - {x = 1, y = 0, z = 0}, - {x = 0, y = 0, z = 1}, - {x = 0, y = 0, z =-1}, - {x = 0, y = 1, z = 0}, - {x = 0, y =-1, z = 0}} - - return rotate_torch_rules(rules, node.param2) + if node.param2 == 1 then + return { + { x = -1, y = 0, z = 0 }, + { x = 1, y = 0, z = 0 }, + { x = 0, y = 1, z = 0, spread = true }, + { x = 0, y = 0, z = -1 }, + { x = 0, y = 0, z = 1 }, + } + else + return rotate_torch_rules({ + { x = 1, y = 0, z = 0 }, + { x = 0, y = -1, z = 0 }, + { x = 0, y = 1, z = 0, spread = true }, + { x = 0, y = 1, z = 0 }, + { x = 0, y = 0, z = -1 }, + { x = 0, y = 0, z = 1 }, + }, node.param2) + end end local torch_get_input_rules = function(node) - local rules = {{x = -2, y = 0, z = 0}, - {x = -1, y = 1, z = 0}} + if node.param2 == 1 then + return {{x = 0, y = -1, z = 0 }} + else + return rotate_torch_rules({{ x = -1, y = 0, z = 0 }}, node.param2) + end +end - return rotate_torch_rules(rules, node.param2) +local torch_overheated = function(pos) + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.02, max_hear_distance = 6}, true) + minetest.add_particle({ + pos = {x=pos.x, y=pos.y+0.2, z=pos.z}, + velocity = {x = 0, y = 0.6, z = 0}, + expirationtime = 1.2, + size = 1.5, + texture = "tnt_smoke.png", + }) + local timer = minetest.get_node_timer(pos) + timer:start(TORCH_COOLOFF) +end + +local torch_action_on = function(pos, node) + local overheat + if node.name == "mesecons_torch:mesecon_torch_on" then + overheat = mesecon.do_overheat(pos) + if overheat then + minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_overheated", param2=node.param2}) + else + minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_off", param2=node.param2}) + end + mesecon.receptor_off(pos, torch_get_output_rules(node)) + elseif node.name == "mesecons_torch:mesecon_torch_on_wall" then + overheat = mesecon.do_overheat(pos) + if overheat then + minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_overheated_wall", param2=node.param2}) + else + minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_off_wall", param2=node.param2}) + end + mesecon.receptor_off(pos, torch_get_output_rules(node)) + end + if overheat then + torch_overheated(pos) + end +end + +local torch_action_off = function(pos, node) + local overheat + if node.name == "mesecons_torch:mesecon_torch_off" or node.name == "mesecons_torch:mesecon_torch_overheated" then + overheat = mesecon.do_overheat(pos) + if overheat then + minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_overheated", param2=node.param2}) + else + minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_on", param2=node.param2}) + mesecon.receptor_on(pos, torch_get_output_rules(node)) + end + elseif node.name == "mesecons_torch:mesecon_torch_off_wall" or node.name == "mesecons_torch:mesecon_torch_overheated_wall" then + overheat = mesecon.do_overheat(pos) + if overheat then + minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_overheated_wall", param2=node.param2}) + else + minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_on_wall", param2=node.param2}) + mesecon.receptor_on(pos, torch_get_output_rules(node)) + end + end + if overheat then + torch_overheated(pos) + end end minetest.register_craft({ @@ -41,49 +117,88 @@ minetest.register_craft({ {"mcl_core:stick"},} }) -mcl_torches.register_torch("mesecon_torch_off", "Redstone Torch (off)", +mcl_torches.register_torch("mesecon_torch_off", S("Redstone Torch (off)"), nil, nil, "jeija_torches_off.png", "mcl_torches_torch_floor.obj", "mcl_torches_torch_wall.obj", {"jeija_torches_off.png"}, 0, - {dig_immediate=3, dig_by_water=1, not_in_creative_inventory=1}, + {dig_immediate=3, dig_by_water=1, redstone_torch=2, mesecon_ignore_opaque_dig=1, not_in_creative_inventory=1}, mcl_sounds.node_sound_wood_defaults(), { - mesecons = {receptor = { - state = mesecon.state.off, - rules = torch_get_output_rules - }}, + mesecons = { + receptor = { + state = mesecon.state.off, + rules = torch_get_output_rules, + }, + effector = { + state = mesecon.state.on, + rules = torch_get_input_rules, + action_off = torch_action_off, + }, + }, drop = "mesecons_torch:mesecon_torch_on", _doc_items_create_entry = false, } ) -mcl_torches.register_torch("mesecon_torch_on", "Redstone Torch", - "Redstone torches are redstone components which invert the signal of surrounding redstone components. An active component will become inactive, and an inactive component will become active. Redstone torches can be used as a quick and easy way to send a redstone to a redstone trail.", - [[Redstone torches can generally be placed at the side and on the top of full solid opaque blocks. The following exceptions apply: -• Glass, fence, wall, hopper: Can only be placed on top -• Upside-down slab/stair: Can only be placed on top -• Soul sand, monster spawner: Placement possible -• Glowstone and pistons: No placement possible]], +mcl_torches.register_torch("mesecon_torch_overheated", S("Redstone Torch (overheated)"), + nil, + nil, + "jeija_torches_off.png", + "mcl_torches_torch_floor.obj", "mcl_torches_torch_wall.obj", + {"jeija_torches_off.png"}, + 0, + {dig_immediate=3, dig_by_water=1, redstone_torch=2, mesecon_ignore_opaque_dig=1, not_in_creative_inventory=1}, + mcl_sounds.node_sound_wood_defaults(), + { + drop = "mesecons_torch:mesecon_torch_on", + _doc_items_create_entry = false, + on_timer = function(pos, elapsed) + if not mesecon.is_powered(pos) then + local node = minetest.get_node(pos) + torch_action_off(pos, node) + end + end, + } +) + + + +mcl_torches.register_torch("mesecon_torch_on", S("Redstone Torch"), + S("A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything."), + S("Redstone torches can be placed at the side and on the top of full solid opaque blocks."), "jeija_torches_on.png", "mcl_torches_torch_floor.obj", "mcl_torches_torch_wall.obj", {"jeija_torches_on.png"}, 7, - {dig_immediate=3, dig_by_water=1,}, + {dig_immediate=3, dig_by_water=1, redstone_torch=1, mesecon_ignore_opaque_dig=1}, mcl_sounds.node_sound_wood_defaults(), { - mesecons = {receptor = { - state = mesecon.state.on, - rules = torch_get_output_rules - }} + on_destruct = function(pos, oldnode) + local node = minetest.get_node(pos) + torch_action_on(pos, node) + end, + mesecons = { + receptor = { + state = mesecon.state.on, + rules = torch_get_output_rules + }, + effector = { + state = mesecon.state.off, + rules = torch_get_input_rules, + action_on = torch_action_on, + }, + }, + _tt_help = S("Provides redstone power when it's not powered itself"), } ) minetest.register_node("mesecons_torch:redstoneblock", { - description = "Block of Redstone", - _doc_items_longdesc = "A block of redstone permanently supplies redstone power to its surrounding blocks.", + description = S("Block of Redstone"), + _tt_help = S("Provides redstone power"), + _doc_items_longdesc = S("A block of redstone permanently supplies redstone power to its surrounding blocks."), tiles = {"redstone_redstone_block.png"}, stack_max = 64, groups = {pickaxey=1}, @@ -91,16 +206,9 @@ minetest.register_node("mesecons_torch:redstoneblock", { is_ground_content = false, mesecons = {receptor = { state = mesecon.state.on, - rules = { - {x = 1, y = 0, z = 0}, - {x = -1, y = 0, z = 0}, - {x = 0, y = 0, z = 1}, - {x = 0, y = 0, z =-1}, - {x = 0, y = 1, z = 0}, - {x = 0, y =-1, z = 0} - } + rules = mesecon.rules.alldirs, }}, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 5, }) @@ -120,38 +228,6 @@ minetest.register_craft({ } }) -minetest.register_abm({ - label = "Redstone torch inversion", - nodenames = {"mesecons_torch:mesecon_torch_off","mesecons_torch:mesecon_torch_off_wall","mesecons_torch:mesecon_torch_on","mesecons_torch:mesecon_torch_on_wall"}, - interval = 1, - chance = 1, - action = function(pos, node) - local is_powered = false - for _, rule in ipairs(torch_get_input_rules(node)) do - local src = mesecon:addPosRule(pos, rule) - if mesecon:is_power_on(src) then - is_powered = true - end - end - - if is_powered then - if node.name == "mesecons_torch:mesecon_torch_on" then - mesecon:swap_node(pos, "mesecons_torch:mesecon_torch_off") - mesecon:receptor_off(pos, torch_get_output_rules(node)) - elseif node.name == "mesecons_torch:mesecon_torch_on_wall" then - mesecon:swap_node(pos, "mesecons_torch:mesecon_torch_off_wall") - mesecon:receptor_off(pos, torch_get_output_rules(node)) - end - elseif node.name == "mesecons_torch:mesecon_torch_off" then - mesecon:swap_node(pos, "mesecons_torch:mesecon_torch_on") - mesecon:receptor_on(pos, torch_get_output_rules(node)) - elseif node.name == "mesecons_torch:mesecon_torch_off_wall" then - mesecon:swap_node(pos, "mesecons_torch:mesecon_torch_on_wall") - mesecon:receptor_on(pos, torch_get_output_rules(node)) - end - end -}) - if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mesecons_torch:mesecon_torch_on", "nodes", "mesecons_torch:mesecon_torch_off") doc.add_entry_alias("nodes", "mesecons_torch:mesecon_torch_on", "nodes", "mesecons_torch:mesecon_torch_off_wall") diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.de.tr b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.de.tr new file mode 100644 index 00000000..7f3f94c5 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.de.tr @@ -0,0 +1,10 @@ +# textdomain: mesecons_torch +Redstone Torch=Redstonefackel +Redstone Torch (off)=Redstonefackel (aus) +Redstone Torch (overheated)=Redstonefackel (überhitzt) +A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.=Eine Redstonefackel ist eine Redstonekomponente, die benutzt werden kann, um ein Redstonesignal zu invertieren. Sie versorgt die benachbarten Blöcke mit Redstoneenergie, ausgenommen den Block, an dem sie befestigt wurde. Eine Redstonefackel leuchtet normalerweise, aber sie kann auch ausgeschaltet werden, indem der Block, an dem sie befestigt ist, bestromt wird. Wenn sie aus ist, wird sie nichts mit Redstoneenergie versorgen. +Redstone torches can be placed at the side and on the top of full solid opaque blocks.=Redstonefackeln können an der Seite und auf der Oberseite der meisten undurchsichtigen ganzen Blöcke platziert werden. +Block of Redstone=Redstoneblock +A block of redstone permanently supplies redstone power to its surrounding blocks.=Ein Redstoneblock versorgt seine benachbarten Blöcke beständig mit Redstoneenergie. +Provides redstone power when it's not powered itself=Gibt Redstoneenergie aus, wenn es nicht selbst bestromt ist +Provides redstone power=Gibt Redstoneenergie aus diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.es.tr b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.es.tr new file mode 100644 index 00000000..b27fa1b5 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.es.tr @@ -0,0 +1,8 @@ +# textdomain: mesecons_torch +Redstone Torch=Antorcha de redstone +Redstone Torch (off)=Antorcha de redstone (Apagada) +Redstone Torch (overheated)=Antorcha de redstone (Sobrecalentada) +A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.=Una antorcha de redstone es un componente de redstone que se puede utilizar para invertir una señal de redstone. Suministra a sus bloques circundantes energía de redstone, excepto el bloque al que está unido. Una antorcha de redstone normalmente está encendida, pero también se puede apagar alimentando el bloque al que está conectado. Mientras está apagada, una antorcha de redstone no alimenta nada. +Redstone torches can be placed at the side and on the top of full solid opaque blocks.=Las antorchas Redstone se pueden colocar a un lado y en la parte superior de bloques opacos sólidos completos. +Block of Redstone=Bloque de redstone +A block of redstone permanently supplies redstone power to its surrounding blocks.=Un bloque de redstone suministra permanentemente energía de redstone a sus bloques circundantes. diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.fr.tr b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.fr.tr new file mode 100644 index 00000000..8c223d83 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.fr.tr @@ -0,0 +1,10 @@ +# textdomain: mesecons_torch +Redstone Torch=Torche de Redstone +Redstone Torch (off)=Torche de Redstone (inactive) +Redstone Torch (overheated)=Torche de Redstone (surchauffé) +A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.=Une torche redstone est un composant redstone qui peut être utilisé pour inverser un signal redstone. Il alimente ses blocs environnants en énergie redstone, à l'exception du bloc auquel il est attaché. Une torche Redstone est normalement allumée, mais elle peut également être éteinte en alimentant le bloc auquel elle est attachée. Tant qu'elle n'est pas allumée, une torche redstone n'alimente rien. +Redstone torches can be placed at the side and on the top of full solid opaque blocks.=Les torches Redstone peuvent être placées sur le côté et sur le dessus de blocs opaques solides. +Block of Redstone=Bloc de Redstone +A block of redstone permanently supplies redstone power to its surrounding blocks.=Un bloc de redstone fournit en permanence de l'énergie redstone à ses blocs environnants. +Provides redstone power when it's not powered itself=Fournit une puissance redstone lorsqu'il n'est pas alimenté lui-même +Provides redstone power=Fournit une puissance redstone diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt new file mode 100644 index 00000000..8cde3ad6 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: mesecons_torch +Redstone Torch= +Redstone Torch (off)= +Redstone Torch (overheated)= +A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.= +Redstone torches can be placed at the side and on the top of full solid opaque blocks.= +Block of Redstone= +A block of redstone permanently supplies redstone power to its surrounding blocks.= +Provides redstone power when it's not powered itself= +Provides redstone power= diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/README.txt b/mods/ITEMS/REDSTONE/mesecons_walllever/README.txt new file mode 100644 index 00000000..8744b564 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/README.txt @@ -0,0 +1,11 @@ +This mod adds levers. + +# Credits +## Mesh +Lever meshes created by Gerold55. + +## Code +Jeija and Wuzzy. + +## Textures +(See main README file of MineClone 2). diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua b/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua index b75c7b9d..053990ed 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua @@ -1,91 +1,166 @@ --- WALL LEVER --- Basically a switch that can be attached to a wall --- Powers the block 2 nodes behind (using a receiver) +local S = minetest.get_translator("mesecons_wallever") + +local lever_get_output_rules = mesecon.rules.buttonlike_get + +local on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_FACE then + if node.param2 == 10 then + node.param2 = 13 + minetest.swap_node(pos, node) + return true + elseif node.param2 == 13 then + node.param2 = 10 + minetest.swap_node(pos, node) + return true + elseif node.param2 == 8 then + node.param2 = 15 + minetest.swap_node(pos, node) + return true + elseif node.param2 == 15 then + node.param2 = 8 + minetest.swap_node(pos, node) + return true + end + end + -- TODO: Rotate axis + return false +end + +-- LEVER minetest.register_node("mesecons_walllever:wall_lever_off", { - drawtype = "nodebox", + drawtype = "mesh", tiles = { - "jeija_wall_lever_tb.png", - "jeija_wall_lever_bottom.png", - "jeija_wall_lever_sides.png", - "jeija_wall_lever_sides.png", - "jeija_wall_lever_back.png", - "jeija_wall_lever_off.png", + "jeija_wall_lever_lever_light_on.png", }, inventory_image = "jeija_wall_lever.png", wield_image = "jeija_wall_lever.png", paramtype = "light", paramtype2 = "facedir", + drawtype = "mesh", + mesh = "jeija_wall_lever_off.obj", sunlight_propagates = true, walkable = false, selection_box = { type = "fixed", - fixed = {{ -2/16, -3/16, 8/16, 2/16, 3/16, 4/16 }, - { -1/16, -8/16, 7/16, 1/16, 0/16, 5/16 }}, + fixed = { -3/16, -4/16, 2/16, 3/16, 4/16, 8/16 }, }, - node_box = { - type = "fixed", - fixed = {{ -2/16, -3/16, 8/16, 2/16, 3/16, 4/16 }, -- the base - { -1/16, -8/16, 7/16, 1/16, 0/16, 5/16 }} -- the lever itself. - }, - groups = {handy=1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1}, + groups = {handy=1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1, attached_node_facedir=1}, is_ground_content = false, - description="Lever", - _doc_items_longdesc = "A lever is a redstone component which can be flipped on and off. It supplies redstone power to the blocks behind while it is in the “on” state.", - _doc_items_usagehelp = "Right-click the lever to flip it on or off.", + description=S("Lever"), + _tt_help = S("Provides redstone power while it's turned on"), + _doc_items_longdesc = S("A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state."), + _doc_items_usagehelp = S("Use the lever to flip it on or off."), on_rightclick = function (pos, node) - mesecon:swap_node(pos, "mesecons_walllever:wall_lever_on") - mesecon:receptor_on(pos, mesecon.rules.buttonlike_get(node)) - minetest.sound_play("mesecons_lever", {pos=pos}) + minetest.swap_node(pos, {name="mesecons_walllever:wall_lever_on", param2=node.param2}) + mesecon.receptor_on(pos, lever_get_output_rules(node)) + minetest.sound_play("mesecons_lever", {pos=pos}, true) end, - sounds = mcl_sounds.node_sound_wood_defaults(), + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + -- no interaction possible with entities + return itemstack + end + + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + if not def then return end + local groups = def.groups + + -- Check special rightclick action of pointed node + if def and def.on_rightclick then + if not placer:get_player_control().sneak then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack, false + end + end + + -- If the pointed node is buildable, let's look at the node *behind* that node + if def.buildable_to then + local dir = vector.subtract(pointed_thing.above, pointed_thing.under) + local actual = vector.subtract(under, dir) + local actualnode = minetest.get_node(actual) + def = minetest.registered_nodes[actualnode.name] + groups = def.groups + end + + -- Only allow placement on full-cube solid opaque nodes + if (not groups) or (not groups.solid) or (not groups.opaque) or (def.node_box and def.node_box.type ~= "regular") then + return itemstack + end + + local above = pointed_thing.above + local dir = vector.subtract(under, above) + local tau = math.pi*2 + local wdir = minetest.dir_to_facedir(dir, true) + if dir.y ~= 0 then + local yaw = placer:get_look_horizontal() + if (yaw > tau/8 and yaw < (tau/8)*3) or (yaw < (tau/8)*7 and yaw > (tau/8)*5) then + if dir.y == -1 then + wdir = 13 + else + wdir = 15 + end + else + if dir.y == -1 then + wdir = 10 + else + wdir = 8 + end + end + end + + local idef = itemstack:get_definition() + local itemstack, success = minetest.item_place_node(itemstack, placer, pointed_thing, wdir) + + if success then + if idef.sounds and idef.sounds.place then + minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true) + end + end + return itemstack + end, + + sounds = mcl_sounds.node_sound_stone_defaults(), mesecons = {receptor = { - rules = mesecon.rules.buttonlike_get, + rules = lever_get_output_rules, state = mesecon.state.off }}, - _mcl_blast_resistance = 2.5, + on_rotate = on_rotate, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) minetest.register_node("mesecons_walllever:wall_lever_on", { - drawtype = "nodebox", + drawtype = "mesh", tiles = { - "jeija_wall_lever_top.png", - "jeija_wall_lever_tb.png", - "jeija_wall_lever_sides.png", - "jeija_wall_lever_sides.png", - "jeija_wall_lever_back.png", - "jeija_wall_lever_on.png", + "jeija_wall_lever_lever_light_on.png", }, - inventory_image = "jeija_wall_lever.png", paramtype = "light", paramtype2 = "facedir", + mesh = "jeija_wall_lever_on.obj", sunlight_propagates = true, walkable = false, selection_box = { type = "fixed", - fixed = {{ -2/16, -3/16, 8/16, 2/16, 3/16, 4/16 }, - { -1/16, 0, 7/16, 1/16, 8/16, 5/16 }}, + fixed = { -3/16, -4/16, 2/16, 3/16, 4/16, 8/16 }, }, - node_box = { - type = "fixed", - fixed = {{ -2/16, -3/16, 8/16, 2/16, 3/16, 4/16 }, -- the base - { -1/16, 0/16, 7/16, 1/16, 8/16, 5/16 }} -- the lever itself. - }, - groups = {handy=1, not_in_creative_inventory = 1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1}, + groups = {handy=1, not_in_creative_inventory = 1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1, attached_node_facedir=1}, is_ground_content = false, drop = '"mesecons_walllever:wall_lever_off" 1', - description="Lever", _doc_items_create_entry = false, on_rightclick = function (pos, node) - mesecon:swap_node(pos, "mesecons_walllever:wall_lever_off") - mesecon:receptor_off(pos, mesecon.rules.buttonlike_get(node)) - minetest.sound_play("mesecons_lever", {pos=pos}) + minetest.swap_node(pos, {name="mesecons_walllever:wall_lever_off", param2=node.param2}) + mesecon.receptor_off(pos, lever_get_output_rules(node)) + minetest.sound_play("mesecons_lever", {pos=pos}, true) end, - sounds = mcl_sounds.node_sound_wood_defaults(), + sounds = mcl_sounds.node_sound_stone_defaults(), mesecons = {receptor = { - rules = mesecon.rules.buttonlike_get, + rules = lever_get_output_rules, state = mesecon.state.on }}, - _mcl_blast_resistance = 2.5, + on_rotate = on_rotate, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr new file mode 100644 index 00000000..27a3bb55 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_wallever +Lever=Hebel +A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Ein Hebel ist eine Redstonekomponente, die ein- und ausgeschaltet werden kann. Er versorgt seine benachbarten Blöcke mit Redstoneenergie, solange er sich im eingeschalteten Zustand befindet. +Use the lever to flip it on or off.=Benutzen Sie den Hebel, um ihn ein- oder auszuschalten. +Provides redstone power while it's turned on=Gibt Redstoneenergie aus, während er eingeschaltet ist diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.es.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.es.tr new file mode 100644 index 00000000..e0e55298 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.es.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_wallever +Lever=Palanca +A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=EUna palanca es un componente de redstone que se puede activar y desactivar. Suministra energía redstone a bloques adyacentes mientras está en el estado "encendido". +Use the lever to flip it on or off.=Use la palanca para encenderlo o apagarlo. diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.fr.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.fr.tr new file mode 100644 index 00000000..3d5d23c8 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_wallever +Lever=Levier +A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Un levier est un composant de redstone qui peut être activé et désactivé. Il fournit de l'énergie redstone aux blocs adjacents pendant qu'il est à l'état "activé". +Use the lever to flip it on or off.=Utilisez le levier pour l'activer ou le désactiver. +Provides redstone power while it's turned on=Fournit une puissance de redstone lorsqu'il est activé diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt new file mode 100644 index 00000000..0187e6d2 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mesecons_wallever +Lever= +A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.= +Use the lever to flip it on or off.= +Provides redstone power while it's turned on= diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/models/jeija_wall_lever_lever_light_on.png b/mods/ITEMS/REDSTONE/mesecons_walllever/models/jeija_wall_lever_lever_light_on.png new file mode 100644 index 00000000..9f8af946 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mesecons_walllever/models/jeija_wall_lever_lever_light_on.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/models/jeija_wall_lever_off.obj b/mods/ITEMS/REDSTONE/mesecons_walllever/models/jeija_wall_lever_off.obj new file mode 100644 index 00000000..c5044de1 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/models/jeija_wall_lever_off.obj @@ -0,0 +1,88 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +mtllib jeija_wall_lever_off.mtl +o nodebox1.009 +v -0.070437 0.138562 0.459573 +v -0.070383 0.058650 0.407149 +v -0.070618 0.289563 0.117785 +v -0.070672 0.369475 0.170211 +v 0.054549 0.139792 0.459559 +v 0.054604 0.059883 0.407135 +v 0.054369 0.290797 0.117772 +v 0.054313 0.370707 0.170196 +vt 0.062500 0.562500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.562500 +vt 0.187500 0.562500 +vt 0.250000 0.562500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.250000 0.562500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.187500 0.562500 +vt 0.625000 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.937500 +vt 0.625000 0.937500 +vn -1.0000 -0.0008 0.0002 +vn 1.0000 0.0008 -0.0002 +vn -0.0076 0.7816 0.6237 +vn 0.0076 -0.7816 -0.6237 +vn -0.0055 0.5485 -0.8361 +usemtl none.009 +s off +f 1/1/1 4/2/1 3/3/1 2/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 1/9/3 5/10/3 8/11/3 4/12/3 +f 2/13/4 3/14/4 7/15/4 6/16/4 +f 4/17/5 8/18/5 7/19/5 3/20/5 +o nodebox1.008 +v -0.170183 0.248882 0.492124 +v -0.161792 -0.249536 0.496140 +v -0.161781 -0.250523 0.373114 +v -0.170172 0.247894 0.369098 +v 0.161753 0.245254 0.492135 +v 0.170145 -0.253163 0.496151 +v 0.170155 -0.254151 0.373125 +v 0.161764 0.244266 0.369109 +vt 0.500000 0.203100 +vt 0.500000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.203100 +vt 0.500000 0.203100 +vt 0.000000 0.203100 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 0.000000 0.203100 +vt 0.000100 0.000100 +vt 0.500000 0.000000 +vt 0.500000 0.203100 +vt 0.000000 0.203100 +vt 0.000000 -0.000000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.500000 +vt -0.000000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 -0.000000 +vn -0.9999 -0.0168 0.0000 +vn 0.9999 0.0168 -0.0000 +vn 0.0109 0.9999 -0.0080 +vn -0.0109 -0.9999 0.0080 +vn 0.0001 0.0081 1.0000 +vn -0.0001 -0.0081 -1.0000 +usemtl none.008 +s off +f 9/21/6 12/22/6 11/23/6 10/24/6 +f 13/25/7 14/26/7 15/27/7 16/28/7 +f 9/29/8 13/25/8 16/28/8 12/30/8 +f 10/31/9 11/32/9 15/33/9 14/34/9 +f 9/35/10 10/36/10 14/37/10 13/38/10 +f 12/39/11 16/40/11 15/41/11 11/23/11 diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/models/jeija_wall_lever_on.obj b/mods/ITEMS/REDSTONE/mesecons_walllever/models/jeija_wall_lever_on.obj new file mode 100644 index 00000000..5de8075b --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/models/jeija_wall_lever_on.obj @@ -0,0 +1,88 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +mtllib jeija_wall_lever_on.mtl +o nodebox1.011 +v -0.170183 0.248540 0.492297 +v -0.161792 -0.249880 0.495967 +v -0.161781 -0.250782 0.372940 +v -0.170172 0.247638 0.369270 +v 0.161753 0.244912 0.492305 +v 0.170145 -0.253508 0.495975 +v 0.170155 -0.254410 0.372949 +v 0.161764 0.244010 0.369279 +vt 0.500000 0.203100 +vt 0.500000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.203100 +vt 0.500000 0.203100 +vt 0.000000 0.203100 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 0.000000 0.203100 +vt 0.000100 0.000100 +vt 0.500000 0.000000 +vt 0.500000 0.203100 +vt 0.000000 0.203100 +vt 0.000000 -0.000000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.500000 +vt -0.000000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 -0.000000 +vn -0.9999 -0.0168 0.0000 +vn 0.9999 0.0168 -0.0000 +vn 0.0109 0.9999 -0.0073 +vn -0.0109 -0.9999 0.0073 +vn 0.0001 0.0074 1.0000 +vn -0.0001 -0.0074 -1.0000 +usemtl none.011 +s off +f 1/1/1 4/2/1 3/3/1 2/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 1/9/3 5/5/3 8/8/3 4/10/3 +f 2/11/4 3/12/4 7/13/4 6/14/4 +f 1/15/5 2/16/5 6/17/5 5/18/5 +f 4/19/6 8/20/6 7/21/6 3/3/6 +o nodebox1.010 +v 0.070437 -0.138656 0.459545 +v 0.070383 -0.058733 0.407137 +v -0.054604 -0.059966 0.407123 +v -0.054549 -0.139886 0.459530 +v 0.070618 -0.289587 0.117726 +v 0.070672 -0.369510 0.170135 +v -0.054369 -0.290821 0.117712 +v -0.054313 -0.370742 0.170120 +vt 0.062500 0.562500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.562500 +vt 0.187500 0.562500 +vt 0.250000 0.562500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.250000 0.562500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.187500 0.562500 +vt 0.625000 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.937500 +vt 0.625000 0.937500 +vn 1.0000 0.0008 0.0002 +vn -1.0000 -0.0008 -0.0002 +vn 0.0076 -0.7817 0.6236 +vn -0.0076 0.7817 -0.6236 +vn 0.0055 -0.5484 -0.8362 +usemtl none.010 +s off +f 9/22/7 14/23/7 13/24/7 10/25/7 +f 12/26/8 11/27/8 15/28/8 16/29/8 +f 9/30/9 12/31/9 16/32/9 14/33/9 +f 10/34/10 13/35/10 15/36/10 11/37/10 +f 14/38/11 16/39/11 15/40/11 13/41/11 diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/models/levier_off.x b/mods/ITEMS/REDSTONE/mesecons_walllever/models/levier_off.x deleted file mode 100644 index efac74af..00000000 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/models/levier_off.x +++ /dev/null @@ -1,244 +0,0 @@ -xof 0302txt 0064 -// File created by CINEMA 4D - -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - SWORD major; - SWORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - SWORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -template FrameTransformMatrix { - - Matrix4x4 frameMatrix; -} - -template Frame { - <3D82AB46-62DA-11cf-AB39-0020AF71E433> - [...] -} - -Header { - 1; - 0; - 1; -} - - - -Mesh CINEMA4D_Mesh { - 16; - // Lever1 - -4.481;-4.311;-6.25;, - -44.655;43.567;-6.25;, - 5.095;3.724;-6.25;, - -35.079;51.602;-6.25;, - 5.095;3.724;6.25;, - -35.079;51.602;6.25;, - -4.481;-4.311;6.25;, - -44.655;43.567;6.25;, - // Lever_Hold - -25.0;-9.375;-18.75;, - -25.0;9.375;-18.75;, - 25.0;-9.375;-18.75;, - 25.0;9.375;-18.75;, - 25.0;-9.375;18.75;, - 25.0;9.375;18.75;, - -25.0;-9.375;18.75;, - -25.0;9.375;18.75;; - - 12; - // Lever1 - 4;0,1,3,2;, - 4;2,3,5,4;, - 4;4,5,7,6;, - 4;6,7,1,0;, - 4;1,7,5,3;, - 4;6,0,2,4;, - // Lever_Hold - 4;8,9,11,10;, - 4;10,11,13,12;, - 4;12,13,15,14;, - 4;14,15,9,8;, - 4;9,15,13,11;, - 4;14,8,10,12;; - - MeshNormals { - 16; - // Lever1 - 0.088;-0.161;-0.036;, - -0.144;0.115;-0.036;, - 0.144;-0.115;-0.036;, - -0.088;0.161;-0.036;, - 0.144;-0.115;0.036;, - -0.088;0.161;0.036;, - 0.088;-0.161;0.036;, - -0.144;0.115;0.036;, - // Lever_Hold - -0.144;-0.054;-0.108;, - -0.144;0.054;-0.108;, - 0.144;-0.054;-0.108;, - 0.144;0.054;-0.108;, - 0.144;-0.054;0.108;, - 0.144;0.054;0.108;, - -0.144;-0.054;0.108;, - -0.144;0.054;0.108;; - - 12; - // Lever1 - 4;0,1,3,2;, - 4;2,3,5,4;, - 4;4,5,7,6;, - 4;6,7,1,0;, - 4;1,7,5,3;, - 4;6,0,2,4;, - // Lever_Hold - 4;8,9,11,10;, - 4;10,11,13,12;, - 4;12,13,15,14;, - 4;14,15,9,8;, - 4;9,15,13,11;, - 4;14,8,10,12;; - - } - MeshTextureCoords { - 16; - // Lever1 - 0.027;0.399;, - 0.027;0.437;, - 0.035;0.399;, - 0.035;0.437;, - 0.035;0.437;, - 0.035;0.399;, - 0.027;0.437;, - 0.027;0.399;, - // Lever_Hold - 0.0;0.063;, - 0.0;0.086;, - 0.031;0.063;, - 0.031;0.086;, - 0.031;0.086;, - 0.031;0.063;, - 0.0;0.086;, - 0.0;0.063;; - } -} \ No newline at end of file diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/models/levier_on.x b/mods/ITEMS/REDSTONE/mesecons_walllever/models/levier_on.x deleted file mode 100644 index cda53766..00000000 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/models/levier_on.x +++ /dev/null @@ -1,274 +0,0 @@ -xof 0302txt 0064 -// File created by CINEMA 4D - -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - SWORD major; - SWORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - SWORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -template FrameTransformMatrix { - - Matrix4x4 frameMatrix; -} - -template Frame { - <3D82AB46-62DA-11cf-AB39-0020AF71E433> - [...] -} - -Header { - 1; - 0; - 1; -} - - - -Mesh CINEMA4D_Mesh { - 16; - // Lever1 - 4.968;-3.861;6.175;, - 44.767;43.898;-0.249;, - -4.623;4.154;6.346;, - 35.177;51.913;-0.078;, - -5.577;3.277;-6.087;, - 34.222;51.036;-12.511;, - 4.014;-4.738;-6.258;, - 43.813;43.021;-12.682;, - // Lever_Hold - -25.0;-9.375;-18.75;, - -25.0;9.375;-18.75;, - 25.0;-9.375;-18.75;, - 25.0;9.375;-18.75;, - 25.0;-9.375;18.75;, - 25.0;9.375;18.75;, - -25.0;-9.375;18.75;, - -25.0;9.375;18.75;; - - 12; - // Lever1 - 4;0,1,3,2;, - 4;2,3,5,4;, - 4;4,5,7,6;, - 4;6,7,1,0;, - 4;1,7,5,3;, - 4;6,0,2,4;, - // Lever_Hold - 4;8,9,11,10;, - 4;10,11,13,12;, - 4;12,13,15,14;, - 4;14,15,9,8;, - 4;9,15,13,11;, - 4;14,8,10,12;; - - MeshNormals { - 16; - // Lever1 - -0.084;-0.158;0.054;, - 0.145;0.117;0.017;, - -0.14;-0.112;0.055;, - 0.09;0.164;0.018;, - -0.145;-0.117;-0.017;, - 0.084;0.158;-0.054;, - -0.09;-0.164;-0.018;, - 0.14;0.112;-0.055;, - // Lever_Hold - -0.144;-0.054;-0.108;, - -0.144;0.054;-0.108;, - 0.144;-0.054;-0.108;, - 0.144;0.054;-0.108;, - 0.144;-0.054;0.108;, - 0.144;0.054;0.108;, - -0.144;-0.054;0.108;, - -0.144;0.054;0.108;; - - 12; - // Lever1 - 4;0,1,3,2;, - 4;2,3,5,4;, - 4;4,5,7,6;, - 4;6,7,1,0;, - 4;1,7,5,3;, - 4;6,0,2,4;, - // Lever_Hold - 4;8,9,11,10;, - 4;10,11,13,12;, - 4;12,13,15,14;, - 4;14,15,9,8;, - 4;9,15,13,11;, - 4;14,8,10,12;; - - } - MeshTextureCoords { - 16; - // Lever1 - 0.027;0.399;, - 0.027;0.437;, - 0.035;0.399;, - 0.035;0.437;, - 0.035;0.437;, - 0.035;0.399;, - 0.027;0.437;, - 0.027;0.399;, - // Lever_Hold - 0.0;0.063;, - 0.0;0.086;, - 0.031;0.063;, - 0.031;0.086;, - 0.031;0.086;, - 0.031;0.063;, - 0.0;0.086;, - 0.0;0.063;; - } - MeshMaterialList { - 2; - 12; - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - - Material C4DMAT_NONE { - 1.0;1.0;1.0;1.0;; - 1.0; - 0.0;0.0;0.0;; - 0.0;0.0;0.0;; - } - Material C4DMAT_Terrain { - 1.0;1.0;1.0;1.0;; - 1.0; - 0.0;0.0;0.0;; - 0.0;0.0;0.0;; - } - - } -} \ No newline at end of file diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever.png b/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever.png index 34e4626e..5774607c 100644 Binary files a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever.png and b/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever.png differ diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_back.png b/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_back.png deleted file mode 100644 index 4776893c..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_back.png and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_bottom.png b/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_bottom.png deleted file mode 100644 index 52fc6f1b..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_bottom.png and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_off.png b/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_off.png deleted file mode 100644 index 6723c208..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_off.png and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_on.png b/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_on.png deleted file mode 100644 index 6a3b496c..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_on.png and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_sides.png b/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_sides.png deleted file mode 100644 index 7dbc6695..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_sides.png and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_tb.png b/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_tb.png deleted file mode 100644 index a646cf53..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_tb.png and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_top.png b/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_top.png deleted file mode 100644 index 025cd618..00000000 Binary files a/mods/ITEMS/REDSTONE/mesecons_walllever/textures/jeija_wall_lever_top.png and /dev/null differ diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/depends.txt b/mods/ITEMS/REDSTONE/mesecons_wires/depends.txt new file mode 100644 index 00000000..4fdbda79 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_wires/depends.txt @@ -0,0 +1,2 @@ +mesecons +doc? diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua new file mode 100644 index 00000000..75acd3ce --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua @@ -0,0 +1,299 @@ +-- naming scheme: wire:(xp)(zp)(xm)(zm)(xpyp)(zpyp)(xmyp)(zmyp)_on/off +-- where x= x direction, z= z direction, y= y direction, p = +1, m = -1, e.g. xpym = {x=1, y=-1, z=0} +-- The (xp)/(zpyp)/.. statements shall be replaced by either 0 or 1 +-- Where 0 means the wire has no visual connection to that direction and +-- 1 means that the wire visually connects to that other node. + +local S = minetest.get_translator("mesecons_wires") + +-- ####################### +-- ## Update wire looks ## +-- ####################### + +local wire_rules = +{{x=-1, y= 0, z= 0, spread=true}, + {x= 1, y= 0, z= 0, spread=true}, + {x= 0, y=-1, z= 0, spread=true}, + {x= 0, y= 1, z= 0, spread=true}, + {x= 0, y= 0, z=-1, spread=true}, + {x= 0, y= 0, z= 1, spread=true}, + + {x= 1, y= 1, z= 0}, + {x= 1, y=-1, z= 0}, + {x=-1, y= 1, z= 0}, + {x=-1, y=-1, z= 0}, + {x= 0, y= 1, z= 1}, + {x= 0, y=-1, z= 1}, + {x= 0, y= 1, z=-1}, + {x= 0, y=-1, z=-1}} + +-- self_pos = pos of any mesecon node, from_pos = pos of conductor to getconnect for +local wire_getconnect = function (from_pos, self_pos) + local node = minetest.get_node(self_pos) + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].mesecons then + -- rules of node to possibly connect to + local rules = {} + if (minetest.registered_nodes[node.name].mesecon_wire) then + rules = wire_rules + else + rules = mesecon.get_any_rules(node) + end + + for _, r in ipairs(mesecon.flattenrules(rules)) do + if (vector.equals(vector.add(self_pos, r), from_pos)) then + return true + end + end + end + return false +end + +-- Update this node +local wire_updateconnect = function (pos) + local connections = {} + + for _, r in ipairs(wire_rules) do + if wire_getconnect(pos, vector.add(pos, r)) then + table.insert(connections, r) + end + end + + local nid = {} + for _, vec in ipairs(connections) do + -- flat component + if vec.x == 1 then nid[0] = "1" end + if vec.z == 1 then nid[1] = "1" end + if vec.x == -1 then nid[2] = "1" end + if vec.z == -1 then nid[3] = "1" end + + -- slopy component + if vec.y == 1 then + if vec.x == 1 then nid[4] = "1" end + if vec.z == 1 then nid[5] = "1" end + if vec.x == -1 then nid[6] = "1" end + if vec.z == -1 then nid[7] = "1" end + end + end + + local nodeid = (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0") + ..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0") + + local state_suffix = string.find(minetest.get_node(pos).name, "_off") and "_off" or "_on" + minetest.set_node(pos, {name = "mesecons:wire_"..nodeid..state_suffix}) +end + +local update_on_place_dig = function (pos, node) + -- Update placed node (get_node again as it may have been dug) + local nn = minetest.get_node(pos) + if (minetest.registered_nodes[nn.name]) + and (minetest.registered_nodes[nn.name].mesecon_wire) then + wire_updateconnect(pos) + end + + -- Update nodes around it + local rules + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].mesecon_wire then + rules = wire_rules + else + rules = mesecon.get_any_rules(node) + end + if (not rules) then return end + + for _, r in ipairs(mesecon.flattenrules(rules)) do + local np = vector.add(pos, r) + if minetest.registered_nodes[minetest.get_node(np).name] + and minetest.registered_nodes[minetest.get_node(np).name].mesecon_wire then + wire_updateconnect(np) + end + end +end + +mesecon.register_autoconnect_hook("wire", update_on_place_dig) + +-- ############################ +-- ## Wire node registration ## +-- ############################ +-- Nodeboxes: +local box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/64, 1/16} +local box_bump1 = { -2/16, -8/16, -2/16, 2/16, -.5+1/64, 2/16 } + +local nbox_nid = +{ + [0] = {1/16, -.5, -1/16, 8/16, -.5+1/64, 1/16}, -- x positive + [1] = {-1/16, -.5, 1/16, 1/16, -.5+1/64, 8/16}, -- z positive + [2] = {-8/16, -.5, -1/16, -1/16, -.5+1/64, 1/16}, -- x negative + [3] = {-1/16, -.5, -8/16, 1/16, -.5+1/64, -1/16}, -- z negative + + [4] = {.5-1/16, -.5+1/16, -1/16, .5, .4999+1/64, 1/16}, -- x positive up + [5] = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/64, .5}, -- z positive up + [6] = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/64, 1/16}, -- x negative up + [7] = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/64, -.5+1/16} -- z negative up +} + +local selectionbox = +{ + type = "fixed", + fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5} +} + +-- go to the next nodeid (ex.: 01000011 --> 01000100) +local nid_inc = function() end +nid_inc = function (nid) + local i = 0 + while nid[i-1] ~= 1 do + nid[i] = (nid[i] ~= 1) and 1 or 0 + i = i + 1 + end + + -- BUT: Skip impossible nodeids: + if ((nid[0] == 0 and nid[4] == 1) or (nid[1] == 0 and nid[5] == 1) + or (nid[2] == 0 and nid[6] == 1) or (nid[3] == 0 and nid[7] == 1)) then + return nid_inc(nid) + end + + return i <= 8 +end + +local function register_wires() + local nid = {} + while true do + -- Create group specifiction and nodeid string (see note above for details) + local nodeid = (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0") + ..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0") + + -- Calculate nodebox + local nodebox = {type = "fixed", fixed={box_center}} + for i=0,7 do + if nid[i] == 1 then + table.insert(nodebox.fixed, nbox_nid[i]) + end + end + + -- Add bump to nodebox if curved + if (nid[0] == 1 and nid[1] == 1) or (nid[1] == 1 and nid[2] == 1) + or (nid[2] == 1 and nid[3] == 1) or (nid[3] == 1 and nid[0] == 1) then + table.insert(nodebox.fixed, box_bump1) + end + + -- If nothing to connect to, still make a nodebox of a straight wire + if nodeid == "00000000" then + nodebox.fixed = {-8/16, -.5, -1/16, 8/16, -.5+1/16, 1/16} + end + + local meseconspec_off = { conductor = { + rules = wire_rules, + state = mesecon.state.off, + onstate = "mesecons:wire_"..nodeid.."_on" + }} + + local meseconspec_on = { conductor = { + rules = wire_rules, + state = mesecon.state.on, + offstate = "mesecons:wire_"..nodeid.."_off" + }} + + local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1, + not_in_creative_inventory = 1, attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1} + local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1, + attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1, craftitem = 1} + if nodeid ~= "00000000" then + groups_off["not_in_creative_inventory"] = 1 + end + + -- Wire textures + local ratio_off = 128 + local ratio_on = 192 + local crossing_off = "(redstone_redstone_dust_dot.png^redstone_redstone_dust_line0.png^(redstone_redstone_dust_line1.png^[transformR90))^[colorize:#FF0000:"..ratio_off + local crossing_on = "(redstone_redstone_dust_dot.png^redstone_redstone_dust_line0.png^(redstone_redstone_dust_line1.png^[transformR90))^[colorize:#FF0000:"..ratio_on + local straight0_off = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_off + local straight0_on = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_on + local straight1_off = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_off + local straight1_on = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_on + local dot_off = "redstone_redstone_dust_dot.png^[colorize:#FF0000:"..ratio_off + local dot_on = "redstone_redstone_dust_dot.png^[colorize:#FF0000:"..ratio_on + + local tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off } + local tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on } + + local wirehelp, tt, longdesc, usagehelp, img, desc_off, desc_on + if nodeid == "00000000" then + -- Non-connected redstone wire + nodebox.fixed = {-8/16, -.5, -8/16, 8/16, -.5+1/64, 8/16} + -- “Dot” texture + tiles_off = { dot_off, dot_off, "blank.png", "blank.png", "blank.png", "blank.png" } + tiles_on = { dot_on, dot_on, "blank.png", "blank.png", "blank.png", "blank.png" } + + tt = S("Transmits redstone power, powers mechanisms") + longdesc = S("Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.").."\n".. +S("A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.").."\n".. +S("Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.") + usagehelp = S("Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills.").."\n\n".. + +S("Read the help entries on the other redstone components to learn how redstone components interact.") + img = "redstone_redstone_dust.png" + desc_off = S("Redstone") + desc_on = S("Powered Redstone Spot (@1)", nodeid) + else + -- Connected redstone wire + table.insert(nodebox, box_center) + tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off, } + tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on, } + wirehelp = false + desc_off = S("Redstone Trail (@1)", nodeid) + desc_on = S("Powered Redstone Trail (@1)", nodeid) + end + + mesecon.register_node(":mesecons:wire_"..nodeid, { + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + selection_box = selectionbox, + node_box = nodebox, + walkable = false, + drop = "mesecons:wire_00000000_off", + sounds = mcl_sounds.node_sound_defaults(), + is_ground_content = false, + mesecon_wire = true + },{ + description = desc_off, + inventory_image = img, + wield_image = img, + _tt_help = tt, + _doc_items_create_entry = wirehelp, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + tiles = tiles_off, + mesecons = meseconspec_off, + groups = groups_off, + },{ + description = desc_on, + _doc_items_create_entry = false, + tiles = tiles_on, + mesecons = meseconspec_on, + groups = groups_on + }) + + -- Add Help entry aliases for e.g. making it identifiable by the lookup tool [doc_identifier] + if minetest.get_modpath("doc") then + if nodeid ~= "00000000" then + doc.add_entry_alias("nodes", "mesecons:wire_00000000_off", "nodes", "mesecons:wire_"..nodeid.."_off") + end + doc.add_entry_alias("nodes", "mesecons:wire_00000000_off", "nodes", "mesecons:wire_"..nodeid.."_on") + end + + if (nid_inc(nid) == false) then return end + end +end +register_wires() + +minetest.register_alias("mesecons:redstone", "mesecons:wire_00000000_off") + +minetest.register_craft({ + type = "cooking", + output = "mesecons:redstone", + recipe = "mcl_core:stone_with_redstone", + cooktime = 10, +}) + diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.de.tr b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.de.tr new file mode 100644 index 00000000..d6d82e8e --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.de.tr @@ -0,0 +1,11 @@ +# textdomain: mesecons_wires +Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.=Redstone ist ein vielseitiges leitendes Mineral, der Redstoneenergie überträgt. Es kann auf dem Boden in Form einer Spur platziert werden. +A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.=Eine Redstonespur kann einen von zwei Zuständen annehmen: Bestromt und unbestromt. Eine bestromte Redstonespur wird benachbarte Redstonekomponenten bestromen (und somit aktivieren). +Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.=Redstoneenergie kann von verschiedenen Redstonekomponenten erhalten werden, wie zum Beispiel einem Redstoneblock oder einem Knopf. Redstoneenergie wird benutzt, um verschiedene Mechanismen zu aktivieren, wie Redstonelampen oder Kolben. +Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills.=Platzieren Sie Redstone auf dem Boden, um eine Redstonespur auszulegen. Die Spuren werden sich automatisch miteinander verbinden und sie können auch über Hügel gehen. +Read the help entries on the other redstone components to learn how redstone components interact.=Lesen Sie die Hilfeeinträge über andere Redstonekomponenten, um zu erfahren, wie sie interagieren. +Redstone=Redstone +Powered Redstone Spot (@1)=Bestromter Redstoneklecks (@1) +Redstone Trail (@1)=Redstonespur (@1) +Powered Redstone Trail (@1)=Bestromte Redstonespur (@1) +Transmits redstone power, powers mechanisms=Überträgt Redstoneenergie, bestromt Mechanismen diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.es.tr b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.es.tr new file mode 100644 index 00000000..beac8451 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.es.tr @@ -0,0 +1,10 @@ +# textdomain: mesecons_wires +Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.=Redstone es un mineral conductor versátil que transmite el poder de redstone. Se puede colocar en el suelo como un sendero. +A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.=Un sendero de redstone puede estar en dos estados: alimentado o no alimentado. Un rastro de redstone alimentado alimentará (y por lo tanto activará) los componentes adyacentes de redstone. +Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.=El poder de Redstone se puede recibir de varios componentes de redstone, como un bloque de redstone o un botón. El poder de Redstone se utiliza para activar numerosos mecanismos, como las lámparas de redstone o los pistones. +Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills.=Coloque redstone en el suelo para construir un sendero de redstone. Los senderos se conectarán entre sí de forma automática y también pueden pasar por colinas. +Read the help entries on the other redstone components to learn how redstone components interact.=Lea las entradas de ayuda en los otros componentes de redstone para aprender cómo interactúan los componentes de redstone. +Redstone=Redstone +Powered Redstone Spot (@1)=Punto de Redstone accionado (@1) +Redstone Trail (@1)=Sendero de Redstone (@1) +Powered Redstone Trail (@1)=Sendero de Redstone con motorizado (@1) diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.fr.tr b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.fr.tr new file mode 100644 index 00000000..66a4230f --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.fr.tr @@ -0,0 +1,11 @@ +# textdomain: mesecons_wires +Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.=Redstone est un minéral conducteur polyvalent qui transmet la puissance de redstone. Il peut être placé au sol comme un sentier. +A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.=Un sentier de redstone peut être dans deux états: alimenté ou non alimenté. Un sentier Redstone alimenté alimentera (et activera donc) les composants Redstone adjacents. +Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.=L'alimentation Redstone peut être reçue de divers composants Redstone, tels qu'un bloc de Redstone ou un bouton. La puissance Redstone est utilisée pour activer de nombreux mécanismes, tels que les lampes ou les pistons Redstone. +Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.=Placez du redstone sur le sol pour construire un sentier de redstone. Les sentiers se connecteront automatiquement et pourront également traverser des collines. Un moyen facile d'alimenter une piste de redstone est de placer une torche de redstone. +Read the help entries on the other redstone components to learn how redstone components interact.=Lisez les entrées d'aide sur les autres composants Redstone pour savoir comment les composants Redstone interagissent. +Redstone=Redstone +Powered Redstone Spot (@1)=Spot Redstone alimenté (@1) +Redstone Trail (@1)=Sentier Redstone (@1) +Powered Redstone Trail (@1)=Sentier Redstone alimenté (@1) +Transmits redstone power, powers mechanisms=Transmet la puissance redstone, alimente les mécanismes diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_wires/locale/template.txt new file mode 100644 index 00000000..91e6bdee --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_wires/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: mesecons_wires +Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.= +A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.= +Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.= +Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.= +Read the help entries on the other redstone components to learn how redstone components interact.= +Redstone= +Powered Redstone Spot (@1)= +Redstone Trail (@1)= +Powered Redstone Trail (@1)= +Transmits redstone power, powers mechanisms= diff --git a/mods/ITEMS/REDSTONE/mesecons/textures/redstone_redstone_dust.png b/mods/ITEMS/REDSTONE/mesecons_wires/textures/redstone_redstone_dust.png similarity index 100% rename from mods/ITEMS/REDSTONE/mesecons/textures/redstone_redstone_dust.png rename to mods/ITEMS/REDSTONE/mesecons_wires/textures/redstone_redstone_dust.png diff --git a/mods/ITEMS/REDSTONE/mesecons/textures/redstone_redstone_dust_dot.png b/mods/ITEMS/REDSTONE/mesecons_wires/textures/redstone_redstone_dust_dot.png similarity index 100% rename from mods/ITEMS/REDSTONE/mesecons/textures/redstone_redstone_dust_dot.png rename to mods/ITEMS/REDSTONE/mesecons_wires/textures/redstone_redstone_dust_dot.png diff --git a/mods/ITEMS/REDSTONE/mesecons/textures/redstone_redstone_dust_line0.png b/mods/ITEMS/REDSTONE/mesecons_wires/textures/redstone_redstone_dust_line0.png similarity index 100% rename from mods/ITEMS/REDSTONE/mesecons/textures/redstone_redstone_dust_line0.png rename to mods/ITEMS/REDSTONE/mesecons_wires/textures/redstone_redstone_dust_line0.png diff --git a/mods/ITEMS/REDSTONE/mesecons/textures/redstone_redstone_dust_line1.png b/mods/ITEMS/REDSTONE/mesecons_wires/textures/redstone_redstone_dust_line1.png similarity index 100% rename from mods/ITEMS/REDSTONE/mesecons/textures/redstone_redstone_dust_line1.png rename to mods/ITEMS/REDSTONE/mesecons_wires/textures/redstone_redstone_dust_line1.png diff --git a/mods/ITEMS/REDSTONE/modpack.conf b/mods/ITEMS/REDSTONE/modpack.conf new file mode 100644 index 00000000..245aa906 --- /dev/null +++ b/mods/ITEMS/REDSTONE/modpack.conf @@ -0,0 +1,2 @@ +name = REDSTONE +description = Redstone modpack, adds redstone and various interactive mechanims to build complex electronic machinery diff --git a/mods/ITEMS/REDSTONE/modpack.txt b/mods/ITEMS/REDSTONE/modpack.txt deleted file mode 100644 index 33d91f57..00000000 --- a/mods/ITEMS/REDSTONE/modpack.txt +++ /dev/null @@ -1 +0,0 @@ -The presence of this file indicates that the current folder is a modpack. \ No newline at end of file diff --git a/mods/ITEMS/gemalde/init.lua b/mods/ITEMS/gemalde/init.lua deleted file mode 100644 index 88bb9e14..00000000 --- a/mods/ITEMS/gemalde/init.lua +++ /dev/null @@ -1,98 +0,0 @@ --- Count the number of pictures. -local function get_picture(number) - local filename = minetest.get_modpath("gemalde").."/textures/gemalde_"..number..".png" - local file = io.open(filename, "r") - if file ~= nil then io.close(file) return true else return false end -end - -local N = 1 - -while get_picture(N) == true do - N = N + 1 -end - -N = N - 1 - --- register for each picture -for n=1, N do - -local groups = {dig_immediate=3, picture=1, not_in_creative_inventory=1, dig_by_piston=1} -if n == 1 then - groups = {dig_immediate=3, picture=1, deco_block=1, dig_by_piston=1} -end - -local desc, doc, longdesc, usagehelp -if n == 1 then - desc = "Painting" - doc = true - longdesc = "Paintings are decorations which can be placed on walls and cover a space of 3×3 blocks." - usagehelp = "Rightclick the painting to change it." -else - desc = "Painting ("..n..")" - doc = false -end - --- inivisible node -minetest.register_node("gemalde:node_"..n.."", { - description = desc, - _doc_items_create_entry = doc, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, - drawtype = "signlike", - tiles = {"gemalde_"..n..".png","gemalde_bg.png"}, - visual_scale = 3.0, - inventory_image = "gemalde_node.png", - is_ground_content = false, - wield_image = "gemalde_node.png", - paramtype = "light", - paramtype2 = "wallmounted", - sunlight_propagates = true, - walkable = false, - selection_box = { - type = "wallmounted", - wall_side = { -0.5, -1.5, -1.5, -0.4, 1.5, 1.5 }, - }, - drop = "gemalde:node_1", - groups = groups, - - on_rightclick = function(pos, node, clicker) - - local length = string.len (node.name) - local number = string.sub (node.name, 14, length) - - -- TODO. Reducing currently not working, because sneaking prevents right click. - local keys=clicker:get_player_control() - if keys["sneak"]==false then - if number == tostring(N) then - number = 1 - else - number = number + 1 - end - else - if number == 1 then - number = N - 1 - else - number = number - 1 - end - end - - node.name = "gemalde:node_"..number.."" - minetest.set_node(pos, node) - end, - --- TODO. --- on_place = minetest.rotate_node -}) - -end - --- initial craft -minetest.register_craft({ - output = 'gemalde:node_1', - recipe = { - {'mcl_core:stick', 'mcl_core:stick', 'mcl_core:stick'}, - {'mcl_core:stick', 'group:wool', 'mcl_core:stick'}, - {'mcl_core:stick', 'mcl_core:stick', 'mcl_core:stick'}, - } -}) - diff --git a/mods/ITEMS/gemalde/textures/gemalde_1.png b/mods/ITEMS/gemalde/textures/gemalde_1.png deleted file mode 100644 index 1d52b05d..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_1.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_10.png b/mods/ITEMS/gemalde/textures/gemalde_10.png deleted file mode 100644 index f7af57b4..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_10.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_11.png b/mods/ITEMS/gemalde/textures/gemalde_11.png deleted file mode 100644 index 2c844b97..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_11.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_12.png b/mods/ITEMS/gemalde/textures/gemalde_12.png deleted file mode 100644 index 3982e210..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_12.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_13.png b/mods/ITEMS/gemalde/textures/gemalde_13.png deleted file mode 100644 index 95788476..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_13.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_14.png b/mods/ITEMS/gemalde/textures/gemalde_14.png deleted file mode 100644 index 170a162a..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_14.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_15.png b/mods/ITEMS/gemalde/textures/gemalde_15.png deleted file mode 100644 index 9857a2ce..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_15.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_16.png b/mods/ITEMS/gemalde/textures/gemalde_16.png deleted file mode 100644 index 21cf53f2..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_16.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_17.png b/mods/ITEMS/gemalde/textures/gemalde_17.png deleted file mode 100644 index 2c5b12a9..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_17.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_18.png b/mods/ITEMS/gemalde/textures/gemalde_18.png deleted file mode 100644 index 001310d8..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_18.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_19.png b/mods/ITEMS/gemalde/textures/gemalde_19.png deleted file mode 100644 index 74685336..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_19.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_2.png b/mods/ITEMS/gemalde/textures/gemalde_2.png deleted file mode 100644 index 08f0ce2a..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_2.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_20.png b/mods/ITEMS/gemalde/textures/gemalde_20.png deleted file mode 100644 index d49e39fc..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_20.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_21.png b/mods/ITEMS/gemalde/textures/gemalde_21.png deleted file mode 100644 index 474ddfb0..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_21.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_22.png b/mods/ITEMS/gemalde/textures/gemalde_22.png deleted file mode 100644 index 338ad012..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_22.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_23.png b/mods/ITEMS/gemalde/textures/gemalde_23.png deleted file mode 100644 index c37e409a..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_23.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_24.png b/mods/ITEMS/gemalde/textures/gemalde_24.png deleted file mode 100644 index 86b15dc0..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_24.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_25.png b/mods/ITEMS/gemalde/textures/gemalde_25.png deleted file mode 100644 index 3520181a..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_25.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_26.png b/mods/ITEMS/gemalde/textures/gemalde_26.png deleted file mode 100644 index f89f2ec9..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_26.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_3.png b/mods/ITEMS/gemalde/textures/gemalde_3.png deleted file mode 100644 index 9a7d0633..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_3.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_4.png b/mods/ITEMS/gemalde/textures/gemalde_4.png deleted file mode 100644 index 84bc0660..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_4.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_5.png b/mods/ITEMS/gemalde/textures/gemalde_5.png deleted file mode 100644 index c7ce5775..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_5.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_6.png b/mods/ITEMS/gemalde/textures/gemalde_6.png deleted file mode 100644 index 0fd6cb9e..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_6.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_7.png b/mods/ITEMS/gemalde/textures/gemalde_7.png deleted file mode 100644 index 4684ecc9..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_7.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_8.png b/mods/ITEMS/gemalde/textures/gemalde_8.png deleted file mode 100644 index 9410b522..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_8.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_9.png b/mods/ITEMS/gemalde/textures/gemalde_9.png deleted file mode 100644 index fe47e653..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_9.png and /dev/null differ diff --git a/mods/ITEMS/gemalde/textures/gemalde_bg.png b/mods/ITEMS/gemalde/textures/gemalde_bg.png deleted file mode 100644 index f388903f..00000000 Binary files a/mods/ITEMS/gemalde/textures/gemalde_bg.png and /dev/null differ diff --git a/mods/ITEMS/itemframes/init.lua b/mods/ITEMS/itemframes/init.lua deleted file mode 100644 index 24774963..00000000 --- a/mods/ITEMS/itemframes/init.lua +++ /dev/null @@ -1,148 +0,0 @@ -local tmp = {} - -minetest.register_entity("itemframes:item",{ - hp_max = 1, - visual="wielditem", - visual_size={x=0.3,y=0.3}, - collisionbox = {0,0,0,0,0,0}, - physical=false, - textures={"air"}, - on_activate = function(self, staticdata) - if tmp.nodename ~= nil and tmp.texture ~= nil then - self.nodename = tmp.nodename - tmp.nodename = nil - self.texture = tmp.texture - tmp.texture = nil - else - if staticdata ~= nil and staticdata ~= "" then - local data = staticdata:split(';') - if data and data[1] and data[2] then - self.nodename = data[1] - self.texture = data[2] - end - end - end - if self.texture ~= nil then - self.object:set_properties({textures={self.texture}}) - end - end, - get_staticdata = function(self) - if self.nodename ~= nil and self.texture ~= nil then - return self.nodename .. ';' .. self.texture - end - return "" - end, -}) - - -local facedir = {} -facedir[0] = {x=0,y=0,z=1} -facedir[1] = {x=1,y=0,z=0} -facedir[2] = {x=0,y=0,z=-1} -facedir[3] = {x=-1,y=0,z=0} - -local remove_item = function(pos, node) - local objs = nil - if node.name == "itemframes:frame" then - objs = minetest.get_objects_inside_radius(pos, .5) - end - if objs then - for _, obj in ipairs(objs) do - if obj and obj:get_luaentity() and obj:get_luaentity().name == "itemframes:item" then - obj:remove() - end - end - end -end - -local update_item = function(pos, node) - remove_item(pos, node) - local meta = minetest.get_meta(pos) - if meta:get_string("item") ~= "" then - if node.name == "itemframes:frame" then - local posad = facedir[node.param2] - pos.x = pos.x + posad.x*6.5/16 - pos.y = pos.y + posad.y*6.5/16 - pos.z = pos.z + posad.z*6.5/16 - end - tmp.nodename = node.name - tmp.texture = ItemStack(meta:get_string("item")):get_name() - local e = minetest.add_entity(pos,"itemframes:item") - if node.name == "itemframes:frame" then - local yaw = math.pi*2 - node.param2 * math.pi/2 - e:setyaw(yaw) - end - end -end - -local drop_item = function(pos, node, meta) - if meta:get_string("item") ~= "" then - if node.name == "itemframes:frame" and not minetest.settings:get_bool("creative_mode") then - local item = ItemStack(minetest.deserialize(meta:get_string("itemdata"))) - minetest.add_item(pos, item) - end - meta:set_string("item","") - meta:set_string("itemdata","") - end - remove_item(pos, node) -end - -minetest.register_node("itemframes:frame",{ - description = "Item Frame", - _doc_items_longdesc = "Item frames are decorative blocks in which items can be placed.", - _doc_items_usagehelp = "Hold any item in your hand and right-click the item frame to place the item into the frame. Rightclick the item frame again to retrieve the item.", - drawtype = "mesh", - is_ground_content = false, - mesh = "itemframes_itemframe1facedir.obj", - selection_box = { type = "fixed", fixed = {-6/16, -6/16, 7/16, 6/16, 6/16, 0.5} }, - collision_box = { type = "fixed", fixed = {-6/16, -6/16, 7/16, 6/16, 6/16, 0.5} }, - tiles = {"itemframe_background.png", "itemframe_background.png", "itemframe_background.png", "itemframe_background.png", "default_wood.png", "itemframe_background.png"}, - inventory_image = "itemframes_frame.png", - wield_image = "itemframes_frame.png", - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - groups = { dig_immediate=3,deco_block=1,dig_by_piston=1}, - sounds = mcl_sounds.node_sound_defaults(), - after_place_node = function(pos, placer, itemstack) - local meta = minetest.get_meta(pos) - meta:set_string("owner",placer:get_player_name()) - meta:set_string("infotext","Item frame (owned by "..placer:get_player_name()..")") - end, - on_rightclick = function(pos, node, clicker, itemstack) - if not itemstack then return end - local meta = minetest.get_meta(pos) - if clicker:get_player_name() == meta:get_string("owner") then - drop_item(pos, node, meta) - -- item holds the itemstring - meta:set_string("item", itemstack:get_name()) - local itemdata = minetest.serialize(itemstack:to_table()) - -- itemdata holds the serialized itemstack in table form - meta:set_string("itemdata", itemdata) - update_item(pos,node) - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end - end - return itemstack - end, - on_destruct = function(pos) - local meta = minetest.get_meta(pos) - local node = minetest.get_node(pos) - drop_item(pos, node, meta) - end, - can_dig = function(pos,player) - - local meta = minetest.get_meta(pos) - return player:get_player_name() == meta:get_string("owner") - end, -}) - -minetest.register_craft({ - output = 'itemframes:frame', - recipe = { - {'mcl_core:stick', 'mcl_core:stick', 'mcl_core:stick'}, - {'mcl_core:stick', 'mcl_mobitems:leather', 'mcl_core:stick'}, - {'mcl_core:stick', 'mcl_core:stick', 'mcl_core:stick'}, - } -}) diff --git a/mods/ITEMS/itemframes/textures/itemframe_background.png b/mods/ITEMS/itemframes/textures/itemframe_background.png deleted file mode 100644 index d48cf26c..00000000 Binary files a/mods/ITEMS/itemframes/textures/itemframe_background.png and /dev/null differ diff --git a/mods/ITEMS/itemframes/textures/itemframes_frame.png b/mods/ITEMS/itemframes/textures/itemframes_frame.png deleted file mode 100644 index 27474991..00000000 Binary files a/mods/ITEMS/itemframes/textures/itemframes_frame.png and /dev/null differ diff --git a/mods/ITEMS/mcl_anvils/depends.txt b/mods/ITEMS/mcl_anvils/depends.txt index e2d61eb3..98a3e017 100644 --- a/mods/ITEMS/mcl_anvils/depends.txt +++ b/mods/ITEMS/mcl_anvils/depends.txt @@ -1,4 +1,5 @@ +mcl_init +mcl_formspec mcl_sounds -mcl_core -mcl_hunger -mcl_death_messages +mcl_core? +screwdriver? diff --git a/mods/ITEMS/mcl_anvils/falling_anvil.lua b/mods/ITEMS/mcl_anvils/falling_anvil.lua deleted file mode 100644 index 5a315779..00000000 --- a/mods/ITEMS/mcl_anvils/falling_anvil.lua +++ /dev/null @@ -1,66 +0,0 @@ --- Hurt players hit by an anvil - -local falling_node = minetest.registered_entities["__builtin:falling_node"] -local on_step_old = falling_node.on_step -local on_step_add = function(self, dtime) - if minetest.get_item_group(self.node.name, "anvil") == 0 then - return - end - local kill - local pos = self.object:getpos() - if not self._startpos then - self._startpos = pos - end - local objs = minetest.get_objects_inside_radius(pos, 1) - for _,v in ipairs(objs) do - local hp = v:get_hp() - if v:is_player() and hp ~= 0 then - if not self.hit_players then - self.hit_players = {} - end - local name = v:get_player_name() - local hit = false - for _,v in ipairs(self.hit_players) do - if name == v then - hit = true - end - end - if not hit then - table.insert(self.hit_players, name) - local way = self._startpos.y - pos.y - local damage = (way - 1) * 2 - damage = math.min(40, math.max(0, damage)) - if damage >= 1 then - hp = hp - damage - if hp < 0 then - hp = 0 - end - if v:is_player() then - mcl_death_messages.player_damage(v, string.format("%s was smashed by a falling anvil.", v:get_player_name())) - mcl_hunger.exhaust(v:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end - v:set_hp(hp) - if hp == 0 then - kill = true - end - end - end - end - end - if kill then - local pos = self.object:getpos() - local pos = {x = pos.x, y = pos.y + 0.3, z = pos.z} - if minetest.registered_nodes[self.node.name] then - minetest.add_node(pos, self.node) - end - self.object:remove() - core.check_for_falling(pos) - end -end -local on_step_table = {on_step_old, on_step_add} -local on_step_new = table.copy(on_step_table) -falling_node.on_step = function(self, dtime) - for _,v in ipairs(on_step_new) do - v(self, dtime) - end -end diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index f97555ca..bfeed83f 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -1,5 +1,265 @@ +local S = minetest.get_translator("mcl_anvils") + +local MAX_NAME_LENGTH = 30 +local MAX_WEAR = 65535 +local SAME_TOOL_REPAIR_BOOST = math.ceil(MAX_WEAR * 0.12) -- 12% +local MATERIAL_TOOL_REPAIR_BOOST = { + math.ceil(MAX_WEAR * 0.25), -- 25% + math.ceil(MAX_WEAR * 0.5), -- 50% + math.ceil(MAX_WEAR * 0.75), -- 75% + MAX_WEAR, -- 100% +} +local NAME_COLOR = "#FFFF4C" + +local function get_anvil_formspec(set_name) + if not set_name then + set_name = "" + end + return "size[9,8.75]".. + "background[-0.19,-0.25;9.41,9.49;mcl_anvils_inventory.png]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "list[context;input;1,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(1,2.5,1,1).. + "list[context;input;4,2.5;1,1;1]".. + mcl_formspec.get_itemslot_bg(4,2.5,1,1).. + "list[context;output;8,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(8,2.5,1,1).. + "label[3,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Repair and Name"))).."]".. + "field[3.25,1;4,1;name;;"..minetest.formspec_escape(set_name).."]".. + "field_close_on_enter[name;false]".. + "button[7,0.7;2,1;name_button;"..minetest.formspec_escape(S("Set Name")).."]".. + "listring[context;output]".. + "listring[current_player;main]".. + "listring[context;input]".. + "listring[current_player;main]" +end + +-- Given a tool and material stack, returns how many items of the material stack +-- needs to be used up to repair the tool. +local function get_consumed_materials(tool, material) + local wear = tool:get_wear() + if wear == 0 then + return 0 + end + local health = (MAX_WEAR - wear) + local matsize = material:get_count() + local materials_used = 0 + for m=1, math.min(4, matsize) do + materials_used = materials_used + 1 + if (wear - MATERIAL_TOOL_REPAIR_BOOST[m]) <= 0 then + break + end + end + return materials_used +end + +-- Given 2 input stacks, tells you which is the tool and which is the material. +-- Returns ("tool", input1, input2) if input1 is tool and input2 is material. +-- Returns ("material", input2, input1) if input1 is material and input2 is tool. +-- Returns nil otherwise. +local function distinguish_tool_and_material(input1, input2) + local def1 = input1:get_definition() + local def2 = input2:get_definition() + if def1.type == "tool" and def1._repair_material then + return "tool", input1, input2 + elseif def2.type == "tool" and def2._repair_material then + return "material", input2, input1 + else + return nil + end +end + +-- Update the inventory slots of an anvil node. +-- meta: Metadata of anvil node +local function update_anvil_slots(meta) + local inv = meta:get_inventory() + local new_name = meta:get_string("set_name") + local input1, input2, output + input1 = inv:get_stack("input", 1) + input2 = inv:get_stack("input", 2) + output = inv:get_stack("output", 1) + local new_output, name_item + local just_rename = false + + -- Both input slots occupied + if (not input1:is_empty() and not input2:is_empty()) then + -- Repair, if tool + local def1 = input1:get_definition() + local def2 = input2:get_definition() + + -- Repair calculation helper. + -- Adds the “inverse” values of wear1 and wear2. + -- Then adds a boost health value directly. + -- Returns the resulting (capped) wear. + local function calculate_repair(wear1, wear2, boost) + local new_health = (MAX_WEAR - wear1) + (MAX_WEAR - wear2) + if boost then + new_health = new_health + boost + end + return math.max(0, math.min(MAX_WEAR, MAX_WEAR - new_health)) + end + + -- Same tool twice + if input1:get_name() == input2:get_name() and def1.type == "tool" and (input1:get_wear() > 0 or input2:get_wear() > 0) then + -- Add tool health together plus a small bonus + -- TODO: Combine tool enchantments + local new_wear = calculate_repair(input1:get_wear(), input2:get_wear(), SAME_TOOL_REPAIR_BOOST) + input1:set_wear(new_wear) + name_item = input1 + new_output = name_item + -- Tool + repair item + else + -- Any tool can have a repair item. This may be defined in the tool's item definition + -- as an itemstring in the field `_repair_material`. Only if this field is set, the + -- tool can be repaired with a material item. + -- Example: Iron Pickaxe + Iron Ingot. `_repair_material = mcl_core:iron_ingot` + + -- Big repair bonus + -- TODO: Combine tool enchantments + local distinguished, tool, material = distinguish_tool_and_material(input1, input2) + if distinguished then + local tooldef = tool:get_definition() + local has_correct_material = false + if string.sub(tooldef._repair_material, 1, 6) == "group:" then + has_correct_material = minetest.get_item_group(material:get_name(), string.sub(tooldef._repair_material, 7)) ~= 0 + elseif material:get_name() == tooldef._repair_material then + has_correct_material = true + end + if has_correct_material and tool:get_wear() > 0 then + local materials_used = get_consumed_materials(tool, material) + local new_wear = calculate_repair(tool:get_wear(), MAX_WEAR, MATERIAL_TOOL_REPAIR_BOOST[materials_used]) + tool:set_wear(new_wear) + name_item = tool + new_output = name_item + else + new_output = "" + end + else + new_output = "" + end + end + -- Exactly 1 input slot occupied + elseif (not input1:is_empty() and input2:is_empty()) or (input1:is_empty() and not input2:is_empty()) then + -- Just rename item + if input1:is_empty() then + name_item = input2 + else + name_item = input1 + end + just_rename = true + else + new_output = "" + end + + -- Rename handling + if name_item then + -- No renaming allowed with group no_rename=1 + if minetest.get_item_group(name_item:get_name(), "no_rename") == 1 then + new_output = "" + else + if new_name == nil then + new_name = "" + end + local meta = name_item:get_meta() + local old_name = meta:get_string("name") + -- Limit name length + new_name = string.sub(new_name, 1, MAX_NAME_LENGTH) + -- Don't rename if names are identical + if new_name ~= old_name then + -- Rename item + if new_name == "" then + -- Empty name + if name_item:get_definition()._mcl_generate_description then + -- _mcl_generate_description(itemstack): If defined, set custom item description of itemstack. + name_item:get_definition()._mcl_generate_description(name_item) + else + -- Otherwise, just clear description + meta:set_string("description", "") + end + else + -- Custom name set. Colorize it! + -- This makes the name visually different from unnamed items + meta:set_string("description", minetest.colorize(NAME_COLOR, new_name)) + end + -- Save the raw name internally, too + meta:set_string("name", new_name) + new_output = name_item + elseif just_rename then + new_output = "" + end + end + end + + -- Set the new output slot + if new_output ~= nil then + inv:set_stack("output", 1, new_output) + end +end + +-- Drop input items of anvil at pos with metadata meta +local function drop_anvil_items(pos, meta) + local inv = meta:get_inventory() + for i=1, inv:get_size("input") do + local stack = inv:get_stack("input", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end +end + +-- Damage the anvil by 1 level. +-- Destroy anvil when at highest damage level. +-- Returns true if anvil was destroyed. +local function damage_anvil(pos) + local node = minetest.get_node(pos) + local new + if node.name == "mcl_anvils:anvil" then + minetest.swap_node(pos, {name="mcl_anvils:anvil_damage_1", param2=node.param2}) + minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dig, {pos=pos, max_hear_distance=16}, true) + return false + elseif node.name == "mcl_anvils:anvil_damage_1" then + minetest.swap_node(pos, {name="mcl_anvils:anvil_damage_2", param2=node.param2}) + minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dig, {pos=pos, max_hear_distance=16}, true) + return false + elseif node.name == "mcl_anvils:anvil_damage_2" then + -- Destroy anvil + local meta = minetest.get_meta(pos) + drop_anvil_items(pos, meta) + minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dug, {pos=pos, max_hear_distance=16}, true) + minetest.remove_node(pos) + minetest.check_single_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) + return true + end +end + +-- Roll a virtual dice and damage anvil at a low chance. +local function damage_anvil_by_using(pos) + local r = math.random(1, 100) + -- 12% chance + if r <= 12 then + return damage_anvil(pos) + else + return false + end +end + +local function damage_anvil_by_falling(pos, distance) + local chance + local r = math.random(1, 100) + if distance > 1 then + if r <= (5*distance) then + damage_anvil(pos) + end + end +end + local anvildef = { - groups = {pickaxey=1, falling_node=1, deco_block=1, anvil=1}, + groups = {pickaxey=1, falling_node=1, falling_node_damage=1, crush_after_fall=1, deco_block=1, anvil=1}, tiles = {"mcl_anvils_anvil_top_damaged_0.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"}, paramtype = "light", sunlight_propagates = true, @@ -9,28 +269,205 @@ local anvildef = { node_box = { type = "fixed", fixed = { - {-6/16, -8/16, -5/16, 6/16, -6/16, 5/16}, - {-5/16, -6/16, -3/16, 5/16, 0, 3/16}, - {-7/16, -2/16, -4/16, 7/16, 4/16, 4/16} + {-8/16, 2/16, -5/16, 8/16, 8/16, 5/16}, -- top + {-5/16, -4/16, -2/16, 5/16, 5/16, 2/16}, -- middle + {-8/16, -8/16, -5/16, 8/16, -4/16, 5/16}, -- base } }, sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6000, + _mcl_blast_resistance = 1200, _mcl_hardness = 5, + _mcl_after_falling = damage_anvil_by_falling, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + drop_anvil_items(pos, meta) + meta:from_table(meta2:to_table()) + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + elseif listname == "output" then + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + elseif to_list == "output" then + return 0 + elseif from_list == "output" and to_list == "input" then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:get_stack(to_list, to_index):is_empty() then + return count + else + return 0 + end + else + return count + end + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + update_anvil_slots(meta) + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if from_list == "output" and to_list == "input" then + local inv = meta:get_inventory() + for i=1, inv:get_size("input") do + if i ~= to_index then + local istack = inv:get_stack("input", i) + istack:set_count(math.max(0, istack:get_count() - count)) + inv:set_stack("input", i, istack) + end + end + end + update_anvil_slots(meta) + + if from_list == "output" then + local destroyed = damage_anvil_by_using(pos) + -- Close formspec if anvil was destroyed + if destroyed then + --[[ Closing the formspec w/ emptyformname is discouraged. But this is justified + because node formspecs seem to only have an empty formname in MT 0.4.16. + Also, sice this is on_metadata_inventory_take, we KNOW which formspec has + been opened by the player. So this should be safe nonetheless. + TODO: Update this line when node formspecs get proper identifiers in Minetest. ]] + minetest.close_formspec(player:get_player_name(), "") + end + end + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if listname == "output" then + local inv = meta:get_inventory() + local input1 = inv:get_stack("input", 1) + local input2 = inv:get_stack("input", 2) + -- Both slots occupied? + if not input1:is_empty() and not input2:is_empty() then + -- Take as many items as needed + local distinguished, tool, material = distinguish_tool_and_material(input1, input2) + if distinguished then + -- Tool + material: Take tool and as many materials as needed + local materials_used = get_consumed_materials(tool, material) + material:set_count(material:get_count() - materials_used) + tool:take_item() + if distinguished == "tool" then + input1, input2 = tool, material + else + input1, input2 = material, tool + end + inv:set_stack("input", 1, input1) + inv:set_stack("input", 2, input2) + else + -- Else take 1 item from each stack + input1:take_item() + input2:take_item() + inv:set_stack("input", 1, input1) + inv:set_stack("input", 2, input2) + end + else + -- Otherwise: Rename mode. Remove the same amount of items from input + -- as has been taken from output + if not input1:is_empty() then + input1:set_count(math.max(0, input1:get_count() - stack:get_count())) + inv:set_stack("input", 1, input1) + end + if not input2:is_empty() then + input2:set_count(math.max(0, input2:get_count() - stack:get_count())) + inv:set_stack("input", 2, input2) + end + end + local destroyed = damage_anvil_by_using(pos) + -- Close formspec if anvil was destroyed + if destroyed then + -- See above for justification. + minetest.close_formspec(player:get_player_name(), "") + end + elseif listname == "input" then + update_anvil_slots(meta) + end + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 2) + inv:set_size("output", 1) + local form = get_anvil_formspec() + meta:set_string("formspec", form) + end, + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + if fields.name_button or fields.name then + local set_name + if fields.name == nil then + set_name = "" + else + set_name = fields.name + end + local meta = minetest.get_meta(pos) + -- Limit name length + set_name = string.sub(set_name, 1, MAX_NAME_LENGTH) + meta:set_string("set_name", set_name) + update_anvil_slots(meta) + meta:set_string("formspec", get_anvil_formspec(set_name)) + end + end, } +if minetest.get_modpath("screwdriver") then + anvildef.on_rotate = screwdriver.rotate_simple +end local anvildef0 = table.copy(anvildef) -anvildef0.description = "Anvil" +anvildef0.description = S("Anvil") +anvildef0._doc_items_longdesc = +S("The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!") +anvildef0._doc_items_usagehelp = +S("To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.").."\n".. +S("To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.").."\n".. +S("There are two possibilities to repair tools (and armor):").."\n".. +S("• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.").."\n".. +S("• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.").."\n".. +S("Armor counts as a tool. It is possible to repair and rename a tool in a single step.").."\n\n".. +S("The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.") +anvildef0._tt_help = S("Repair and rename items") local anvildef1 = table.copy(anvildef) -anvildef1.description = "Slightly Damaged Anvil" +anvildef1.description = S("Slightly Damaged Anvil") +anvildef1._doc_items_create_entry = false anvildef1.groups.not_in_creative_inventory = 1 +anvildef1.groups.anvil = 2 anvildef1._doc_items_create_entry = false anvildef1.tiles = {"mcl_anvils_anvil_top_damaged_1.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"} local anvildef2 = table.copy(anvildef) -anvildef2.description = "Very Damaged Anvil" +anvildef2.description = S("Very Damaged Anvil") +anvildef2._doc_items_create_entry = false anvildef2.groups.not_in_creative_inventory = 1 +anvildef2.groups.anvil = 3 anvildef2._doc_items_create_entry = false anvildef2.tiles = {"mcl_anvils_anvil_top_damaged_2.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"} @@ -38,13 +475,31 @@ minetest.register_node("mcl_anvils:anvil", anvildef0) minetest.register_node("mcl_anvils:anvil_damage_1", anvildef1) minetest.register_node("mcl_anvils:anvil_damage_2", anvildef2) -minetest.register_craft({ - output = "mcl_anvils:anvil", - recipe = { - { "mcl_core:ironblock", "mcl_core:ironblock", "mcl_core:ironblock" }, - { "", "mcl_core:iron_ingot", "" }, - { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot" }, - } -}) +if minetest.get_modpath("mcl_core") then + minetest.register_craft({ + output = "mcl_anvils:anvil", + recipe = { + { "mcl_core:ironblock", "mcl_core:ironblock", "mcl_core:ironblock" }, + { "", "mcl_core:iron_ingot", "" }, + { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot" }, + } + }) +end -dofile(minetest.get_modpath(minetest.get_current_modname()).."/falling_anvil.lua") +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_anvils:anvil", "nodes", "mcl_anvils:anvil_damage_1") + doc.add_entry_alias("nodes", "mcl_anvils:anvil", "nodes", "mcl_anvils:anvil_damage_2") +end + +-- Legacy +minetest.register_lbm({ + label = "Update anvil formspecs (0.60.0", + name = "mcl_anvils:update_formspec_0_60_0", + nodenames = { "group:anvil" }, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + local set_name = meta:get_string("set_name") + meta:set_string("formspec", get_anvil_formspec(set_name)) + end, +}) diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.de.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.de.tr new file mode 100644 index 00000000..9e7d8833 --- /dev/null +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.de.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_anvils +Set Name=Name setzen +Repair and Name=Reparieren und benennen +Inventory=Inventar +Anvil=Amboss +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=Der Amboss ermöglicht es, Werkzeuge und Rüstung zu reparieren und Gegenstände zu benennen. Er hat jedoch eine begrenzte Lebensdauer. Lassen Sie ihn nicht auf Ihren Kopf fallen, das könnte ziemlich schmerzhaft sein! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Um einen Amboss zu benutzen, rechtsklicken Sie auf ihn. Ein Amboss hat 2 Eingabeplätze (links) und einen Ausgabeplatz (rechts). +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Um Gegenstände umzubenennen, platzieren Sie einen Gegenstand in einen der Eingangsplätze und lassen Sie den anderen frei. Geben Sie einen Namen ein und drücken Sie die Eingabetaste oder „Name setzen”, dann nehmen Sie den umbenannten Gegenstand an sich. +There are two possibilities to repair tools (and armor):=Es gibt zwei Möglichkeiten, Werkzeuge (und Rüstung) zu reparieren: +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Werkzeug + Werkzeug: Platzieren sie zwei gleiche Werkzeuge in die Eingangsplätze. Der Zustand des reparierten Werkzeugs ist die Summe des Zustands beider Eingangswerkzeuge, plus einem Bonus von 12%. +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Werkzeug + Material: Einige Werkzeuge können auch repariert werden, indem man sie mit einem Gegenstand, aus dem sie gemacht worden sind, kombiniert. Zum Beispiel können Eisenspitzhacken mit Eisenbarren repariert werden. Dadurch wird das Werkzeug um 25% repariert. +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=Rüstung zählt als Werkzeug. Es ist möglich, ein Werkzeug in einem Arbeitsschritt zu reparieren und zu benennen. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=Der Amboss hat begrenze Lebensdauer und 3 Schadensstufen: Kein Schaden, leicht beschädigt, und stark beschädigt. Jedes mal, wenn Sie etwas reparieren oder umbenennen, gibt es eine 12%-ige Chance, dass der Amboss Schaden nimmt. Ambosse können auch beschädigt werden, wenn sie um mehr als 1 Block fallen. Wenn ein sehr beschädigter Amboss erneut beschädigt wird, wird er zerstört. +Slightly Damaged Anvil=Leicht beschädigter Amboss +Very Damaged Anvil=Stark beschädigter Amboss +Repair and rename items=Für die Reparatur und Umbenennung von Gegenständen diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.es.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.es.tr new file mode 100644 index 00000000..7212b92b --- /dev/null +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.es.tr @@ -0,0 +1,15 @@ +# textdomain: mcl_anvils +Set Name=Establece un nombre +Repair and Name=Reparar y nombrar +Inventory=Inventario +Anvil=Yunque +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=El yunque le permite reparar herramientas y armaduras, y dar nombres a los elementos. Sin embargo, tiene una durabilidad limitada. No lo dejes caer sobre tu cabeza, ¡podría ser bastante doloroso! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Para usar un yunque, haga clic derecho sobre él. Un yunque tiene 2 ranuras de entrada (a la izquierda) y una ranura de salida. +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Para cambiar el nombre de los elementos, coloque una pila de elementos en una de las ranuras de elementos mientras mantiene vacía la otra ranura de entrada. Escriba un nombre, presione enter o "Establecer nombre", luego obtenga el elemento renombrado en la ranura de salida. +There are two possibilities to repair tools (and armor):=Hay dos posibilidades para reparar herramientas (y armaduras): +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Herramienta + Herramienta: Coloque dos herramientas del mismo tipo en las ranuras de entrada. La "salud" de la herramienta reparada es la suma de la "salud" de ambas herramientas, con un bono del 12%. +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Herramienta + Material: Algunas herramientas también pueden repararse combinándolas con un elemento del que está hecho. Por ejemplo, los picos de hierro pueden repararse con lingotes de hierro. Esto repara la herramienta en un 25%. +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=La armadura cuenta como una herramienta. Es posible reparar y cambiar el nombre de una herramienta en un solo paso. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=El yunque tiene una durabilidad limitada y 3 niveles de daño: sin daños, ligeramente dañado y muy dañado. Cada vez que reparas o cambias el nombre de algo, hay un 12% de posibilidades de que el yunque se dañe. Los yunques también tienen la posibilidad de dañarse cuando caen en más de 1 bloque. Si un yunque muy dañado se daña nuevamente, se destruye. +Slightly Damaged Anvil=Yunque dañado +Very Damaged Anvil=Yunque muy dañado diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.fr.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.fr.tr new file mode 100644 index 00000000..1f03de8e --- /dev/null +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.fr.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_anvils +Set Name=Définir le Nom +Repair and Name=Réparation et Nomme +Inventory=Inventaire +Anvil=Enclume +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=L'enclume vous permet de réparer des outils et des armures, et de donner des noms à des objets. Il a cependant une durabilité limitée. Ne la laissez pas tomber sur la tête, cela pourrait être assez douloureux! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Pour utiliser une enclume, faites un clic droit dessus. Une enclume a 2 emplacements d'entrée (à gauche) et un emplacement de sortie. +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Pour renommer des objets, placez une pile d'objets dans l'un des emplacements d'objets tout en laissant l'autre emplacement d'entrée vide. Tapez un nom, appuyez sur Entrée ou sur «Définir le nom», puis prenez l'élément renommé dans l'emplacement de sortie. +There are two possibilities to repair tools (and armor):=Il existe deux possibilités pour réparer les outils (et les armures): +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Outil + Outil: Placez deux outils du même type dans les emplacements d'entrée. La "santé" de l'outil réparé est la somme de la "santé" des deux outils d'entrée, plus un bonus de 12%. +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Outil + Matériel: Certains outils peuvent également être réparés en les combinant avec un élément dont il est fait. Par exemple, les pioches de fer peuvent être réparées avec des lingots de fer. Cela répare l'outil de 25%. +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=L'armure compte comme un outil. Il est possible de réparer et de renommer un outil en une seule étape. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=L'enclume a une durabilité limitée et 3 niveaux de dommages: en bon état, légèrement endommagé et très endommagé. Chaque fois que vous réparez ou renommez quelque chose, il y a 12% de chances que l'enclume soit endommagée. Les enclumes ont également une chance d'être endommagées lorsqu'elles tombent de plus d'un bloc. Si une enclume très endommagée est à nouveau endommagée, elle est détruite. +Slightly Damaged Anvil=Enclume Légèrement Endommagée +Very Damaged Anvil=Enclume Très Endommagée +Repair and rename items=Réparer et renommer des objets diff --git a/mods/ITEMS/mcl_anvils/locale/template.txt b/mods/ITEMS/mcl_anvils/locale/template.txt new file mode 100644 index 00000000..ebc741c0 --- /dev/null +++ b/mods/ITEMS/mcl_anvils/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: mcl_anvils +Set Name= +Repair and Name= +Inventory= +Anvil= +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!= +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.= +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.= +There are two possibilities to repair tools (and armor):= +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.= +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.= +Armor counts as a tool. It is possible to repair and rename a tool in a single step.= +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.= +Slightly Damaged Anvil= +Very Damaged Anvil= +Repair and rename items= diff --git a/mods/ITEMS/mcl_anvils/textures/mcl_anvils_inventory.png b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_inventory.png new file mode 100644 index 00000000..7be42962 Binary files /dev/null and b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_inventory.png differ diff --git a/mods/ITEMS/mcl_armor/README.txt b/mods/ITEMS/mcl_armor/README.txt new file mode 100644 index 00000000..5e68b574 --- /dev/null +++ b/mods/ITEMS/mcl_armor/README.txt @@ -0,0 +1,30 @@ +[mod] Visible Player Armor [mcl_armor] +====================================== + +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 some forms of damage. + +Armor takes damage when a player is hurt. + +This mod is based on 3D Armor mod by stu. + +Media credits +------------- +* mcl_armor_equip_diamond.ogg +* mcl_armor_unequip_diamond.ogg +Licensed CC0, by Freesound.org user juryduty. +Source: + +* mcl_armor_equip_iron.ogg +* mcl_armor_unequip_iron.ogg +Licensed CC0, by Freesound.org user mtchanary. +Source: + +* mcl_armor_equip_generic.ogg +* mcl_armor_unequip_generic.ogg +Licensed (CC BY-SA 3.0) by Mito551 + +All other sounds licensed CC0 by OpenGameArt.org user artisticdude. +Source: + +Other media files: See MineClone 2 license. diff --git a/mods/ITEMS/mcl_armor/alias.lua b/mods/ITEMS/mcl_armor/alias.lua new file mode 100644 index 00000000..19c2424d --- /dev/null +++ b/mods/ITEMS/mcl_armor/alias.lua @@ -0,0 +1,23 @@ +minetest.register_alias("3d_armor:helmet_leather", "mcl_armor:helmet_leather") +minetest.register_alias("3d_armor:helmet_iron", "mcl_armor:helmet_iron") +minetest.register_alias("3d_armor:helmet_chain", "mcl_armor:helmet_chain") +minetest.register_alias("3d_armor:helmet_gold", "mcl_armor:helmet_gold") +minetest.register_alias("3d_armor:helmet_diamond", "mcl_armor:helmet_diamond") + +minetest.register_alias("3d_armor:chestplate_leather", "mcl_armor:chestplate_leather") +minetest.register_alias("3d_armor:chestplate_iron", "mcl_armor:chestplate_iron") +minetest.register_alias("3d_armor:chestplate_chain", "mcl_armor:chestplate_chain") +minetest.register_alias("3d_armor:chestplate_gold", "mcl_armor:chestplate_gold") +minetest.register_alias("3d_armor:chestplate_diamond", "mcl_armor:chestplate_diamond") + +minetest.register_alias("3d_armor:leggings_leather", "mcl_armor:leggings_leather") +minetest.register_alias("3d_armor:leggings_iron", "mcl_armor:leggings_iron") +minetest.register_alias("3d_armor:leggings_chain", "mcl_armor:leggings_chain") +minetest.register_alias("3d_armor:leggings_gold", "mcl_armor:leggings_gold") +minetest.register_alias("3d_armor:leggings_diamond", "mcl_armor:leggings_diamond") + +minetest.register_alias("3d_armor:boots_leather", "mcl_armor:boots_leather") +minetest.register_alias("3d_armor:boots_iron", "mcl_armor:boots_iron") +minetest.register_alias("3d_armor:boots_chain", "mcl_armor:boots_chain") +minetest.register_alias("3d_armor:boots_gold", "mcl_armor:boots_gold") +minetest.register_alias("3d_armor:boots_diamond", "mcl_armor:boots_diamond") diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua b/mods/ITEMS/mcl_armor/armor.lua similarity index 57% rename from mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua rename to mods/ITEMS/mcl_armor/armor.lua index b7658205..7edd77c2 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua +++ b/mods/ITEMS/mcl_armor/armor.lua @@ -1,55 +1,10 @@ -ARMOR_INIT_DELAY = 1 -ARMOR_INIT_TIMES = 1 -ARMOR_BONES_DELAY = 1 -ARMOR_UPDATE_TIME = 1 -ARMOR_DROP = minetest.get_modpath("bones") ~= nil -ARMOR_DESTROY = false -ARMOR_LEVEL_MULTIPLIER = 1 -ARMOR_HEAL_MULTIPLIER = 1 -ARMOR_RADIATION_MULTIPLIER = 1 -ARMOR_MATERIALS = { - wood = "group:wood", - cactus = "mcl_core:cactus", - iron = "mcl_core:iron_ingot", - bronze = "mcl_core:bronze_ingot", - diamond = "mcl_core:diamond", - gold = "mcl_core:gold_ingot", - mithril = "moreores:mithril_ingot", - crystal = "ethereal:crystal_ingot", -} -ARMOR_FIRE_PROTECT = minetest.get_modpath("ethereal") ~= nil -ARMOR_FIRE_NODES = { - {"mcl_core:lava_source", 5, 8}, - {"mcl_core:lava_flowing", 5, 8}, - {"fire:basic_flame", 3, 4}, - {"fire:permanent_flame", 3, 4}, - {"ethereal:crystal_spike", 2, 1}, - {"ethereal:fire_flower", 2, 1}, - {"mcl_torches:torch", 1, 1}, -} +local ARMOR_INIT_DELAY = 1 +local ARMOR_INIT_TIMES = 1 +local ARMOR_BONES_DELAY = 1 local skin_mod = nil local modpath = minetest.get_modpath(minetest.get_current_modname()) -local worldpath = minetest.get_worldpath() -local input = io.open(modpath.."/armor.conf", "r") -if input then - dofile(modpath.."/armor.conf") - input:close() - input = nil -end -input = io.open(worldpath.."/armor.conf", "r") -if input then - dofile(worldpath.."/armor.conf") - input:close() - input = nil -end -if not minetest.get_modpath("moreores") then - ARMOR_MATERIALS.mithril = nil -end -if not minetest.get_modpath("ethereal") then - ARMOR_MATERIALS.crystal = nil -end armor = { timer = 0, @@ -63,10 +18,11 @@ armor = { .."listring[current_player;craft]", textures = {}, default_skin = "character", - version = "0.4.6", } -if minetest.get_modpath("skins") then +if minetest.get_modpath("mcl_skins") then + skin_mod = "mcl_skins" +elseif minetest.get_modpath("skins") then skin_mod = "skins" elseif minetest.get_modpath("simple_skins") then skin_mod = "simple_skins" @@ -76,8 +32,63 @@ elseif minetest.get_modpath("wardrobe") then skin_mod = "wardrobe" end +function armor.on_armor_use(itemstack, user, pointed_thing) + if not user or user:is_player() == false then + return itemstack + end + + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" then + local node = minetest.get_node(pointed_thing.under) + 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 + end + + local name, player_inv, armor_inv = armor:get_valid_player(user, "[on_armor_use]") + if not name then + return itemstack + end + + local def = itemstack:get_definition() + local slot + if def.groups and def.groups.armor_head then + slot = 2 + elseif def.groups and def.groups.armor_torso then + slot = 3 + elseif def.groups and def.groups.armor_legs then + slot = 4 + elseif def.groups and def.groups.armor_feet then + slot = 5 + end + + if slot then + local itemstack_single = ItemStack(itemstack) + itemstack_single:set_count(1) + local itemstack_slot = armor_inv:get_stack("armor", slot) + if itemstack_slot:is_empty() then + armor_inv:set_stack("armor", slot, itemstack_single) + player_inv:set_stack("armor", slot, itemstack_single) + armor:set_player_armor(user) + armor:update_inventory(user) + armor:play_equip_sound(itemstack_single, user) + itemstack:take_item() + elseif itemstack:get_count() <= 1 then + armor_inv:set_stack("armor", slot, itemstack_single) + player_inv:set_stack("armor", slot, itemstack_single) + armor:set_player_armor(user) + armor:update_inventory(user) + armor:play_equip_sound(itemstack_single, user) + itemstack = ItemStack(itemstack_slot) + end + end + + return itemstack +end + armor.def = { - state = 0, count = 0, } @@ -100,13 +111,9 @@ armor.set_player_armor = function(self, player) if not name then return end - local armor_texture = "3d_armor_trans.png" + local armor_texture = "blank.png" local armor_level = 0 - local armor_heal = 0 - local armor_fire = 0 - local armor_water = 0 - local armor_radiation = 0 - local state = 0 + local mcl_armor_points = 0 local items = 0 local elements = {} local textures = {} @@ -119,6 +126,9 @@ armor.set_player_armor = function(self, player) for i=1, 6 do local stack = player_inv:get_stack("armor", i) local item = stack:get_name() + if minetest.registered_aliases[item] then + item = minetest.registered_aliases[item] + end if stack:get_count() == 1 then local def = stack:get_definition() for k, v in pairs(elements) do @@ -129,12 +139,8 @@ armor.set_player_armor = function(self, player) table.insert(textures, texture..".png") preview = preview.."^"..texture.."_preview.png" armor_level = armor_level + level - state = state + stack:get_wear() items = items + 1 - armor_heal = armor_heal + (def.groups["armor_heal"] or 0) - armor_fire = armor_fire + (def.groups["armor_fire"] or 0) - armor_water = armor_water + (def.groups["armor_water"] or 0) - armor_radiation = armor_radiation + (def.groups["armor_radiation"] or 0) + mcl_armor_points = mcl_armor_points + (def.groups["mcl_armor_points"] or 0) for kk,vv in ipairs(self.physics) do local o_value = def.groups["physics_"..vv] if o_value then @@ -161,32 +167,26 @@ armor.set_player_armor = function(self, player) if material.type and material.count == #self.elements then armor_level = armor_level * 1.1 end - armor_level = armor_level * ARMOR_LEVEL_MULTIPLIER - armor_heal = armor_heal * ARMOR_HEAL_MULTIPLIER - armor_radiation = armor_radiation * ARMOR_RADIATION_MULTIPLIER if #textures > 0 then armor_texture = table.concat(textures, "^") end - local armor_groups = {fleshy=100} + local armor_groups = player:get_armor_groups() + armor_groups.fleshy = 100 + armor_groups.level = nil if armor_level > 0 then armor_groups.level = math.floor(armor_level / 20) armor_groups.fleshy = 100 - armor_level - armor_groups.radiation = 100 - armor_radiation end player:set_armor_groups(armor_groups) -- Physics override intentionally removed because of possible conflicts self.textures[name].armor = armor_texture self.textures[name].preview = preview - self.def[name].state = state self.def[name].count = items self.def[name].level = armor_level - self.def[name].heal = armor_heal + self.def[name].heal = mcl_armor_points self.def[name].jump = physics_o.jump self.def[name].speed = physics_o.speed self.def[name].gravity = physics_o.gravity - self.def[name].fire = armor_fire - self.def[name].water = armor_water - self.def[name].radiation = armor_radiation self:update_player_visuals(player) end @@ -195,9 +195,56 @@ armor.update_armor = function(self, player) -- Other mods can hook on to this function, see hud mod for example end +armor.get_armor_points = function(self, player) + local name, player_inv, armor_inv = armor:get_valid_player(player, "[get_armor_points]") + if not name then + return nil + end + local pts = 0 + for i=1, 6 do + local stack = player_inv:get_stack("armor", i) + if stack:get_count() > 0 then + local p = minetest.get_item_group(stack:get_name(), "mcl_armor_points") + if p then + pts = pts + p + end + end + end + return pts +end + +-- Returns a change factor for a mob's view_range for the given player +-- or nil, if there's no change. Certain armors (like mob heads) can +-- affect the view range of mobs. +armor.get_mob_view_range_factor = function(self, player, mob) + local name, player_inv, armor_inv = armor:get_valid_player(player, "[get_mob_view_range_factor]") + if not name then + return + end + local factor + for i=1, 6 do + local stack = player_inv:get_stack("armor", i) + if stack:get_count() > 0 then + local def = stack:get_definition() + if def._mcl_armor_mob_range_mob == mob then + if not factor then + factor = def._mcl_armor_mob_range_factor + elseif factor == 0 then + return 0 + else + factor = factor * def._mcl_armor_mob_range_factor + end + end + end + end + return factor +end + armor.get_player_skin = function(self, name) local skin = nil - if skin_mod == "skins" or skin_mod == "simple_skins" then + if skin_mod == "mcl_skins" then + skin = mcl_skins.skins[name] + elseif skin_mod == "skins" or skin_mod == "simple_skins" then skin = skins.skins[name] elseif skin_mod == "u_skins" then skin = u_skins.u_skins[name] @@ -215,19 +262,17 @@ end armor.get_armor_formspec = function(self, name) if not armor.textures[name] then - minetest.log("error", "3d_armor: Player texture["..name.."] is nil [get_armor_formspec]") + minetest.log("error", "mcl_armor: Player texture["..name.."] is nil [get_armor_formspec]") return "" end if not armor.def[name] then - minetest.log("error", "3d_armor: Armor def["..name.."] is nil [get_armor_formspec]") + minetest.log("error", "mcl_armor: Armor def["..name.."] is nil [get_armor_formspec]") return "" end local formspec = armor.formspec.."list[detached:"..name.."_armor;armor;0,1;2,3;]" formspec = formspec:gsub("armor_preview", armor.textures[name].preview) formspec = formspec:gsub("armor_level", armor.def[name].level) - formspec = formspec:gsub("armor_heal", armor.def[name].heal) - formspec = formspec:gsub("armor_fire", armor.def[name].fire) - formspec = formspec:gsub("armor_radiation", armor.def[name].radiation) + formspec = formspec:gsub("mcl_armor_points", armor.def[name].heal) return formspec end @@ -237,38 +282,58 @@ end armor.get_valid_player = function(self, player, msg) msg = msg or "" if not player then - minetest.log("error", "3d_armor: Player reference is nil "..msg) + minetest.log("error", "mcl_armor: Player reference is nil "..msg) return end local name = player:get_player_name() if not name then - minetest.log("error", "3d_armor: Player name is nil "..msg) + minetest.log("error", "mcl_armor: Player name is nil "..msg) return end - local pos = player:getpos() + local pos = player:get_pos() local player_inv = player:get_inventory() local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) if not pos then - minetest.log("error", "3d_armor: Player position is nil "..msg) + minetest.log("error", "mcl_armor: Player position is nil "..msg) return elseif not player_inv then - minetest.log("error", "3d_armor: Player inventory is nil "..msg) + minetest.log("error", "mcl_armor: Player inventory is nil "..msg) return elseif not armor_inv then - minetest.log("error", "3d_armor: Detached armor inventory is nil "..msg) + minetest.log("error", "mcl_armor: Detached armor inventory is nil "..msg) return end return name, player_inv, armor_inv, pos end +armor.play_equip_sound = function(self, stack, player, pos, unequip) + local def = stack:get_definition() + local estr = "equip" + if unequip then + estr = "unequip" + end + local snd = def.sounds and def.sounds["_mcl_armor_"..estr] + if not snd then + -- Fallback sound + snd = { name = "mcl_armor_"..estr.."_generic" } + end + if snd then + local dist = 8 + if pos then + dist = 16 + end + minetest.sound_play(snd, {object=player, pos=pos, gain=0.5, max_hear_distance=dist}, true) + end +end + -- Register Player Model -mcl_player.player_register_model("3d_armor_character.b3d", { +mcl_player.player_register_model("mcl_armor_character.b3d", { animation_speed = 30, textures = { armor.default_skin..".png", - "3d_armor_trans.png", - "3d_armor_trans.png", + "blank.png", + "blank.png", }, animations = { stand = {x=0, y=79}, @@ -292,17 +357,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end for field, _ in pairs(fields) do if string.find(field, "skins_set") then - minetest.after(0, function(player) + minetest.after(0, function(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end local skin = armor:get_player_skin(name) armor.textures[name].skin = skin..".png" armor:set_player_armor(player) - end, player) + end, player:get_player_name()) end end end) minetest.register_on_joinplayer(function(player) - mcl_player.player_set_model(player, "3d_armor_character.b3d") + mcl_player.player_set_model(player, "mcl_armor_character.b3d") local name = player:get_player_name() local player_inv = player:get_inventory() local armor_inv = minetest.create_detached_inventory(name.."_armor", { @@ -310,11 +379,13 @@ minetest.register_on_joinplayer(function(player) player:get_inventory():set_stack(listname, index, stack) armor:set_player_armor(player) armor:update_inventory(player) + armor:play_equip_sound(stack, player) end, on_take = function(inv, listname, index, stack, player) player:get_inventory():set_stack(listname, index, nil) armor:set_player_armor(player) armor:update_inventory(player) + armor:play_equip_sound(stack, player, nil, true) end, on_move = function(inv, from_list, from_index, to_list, to_index, count, player) local plaver_inv = player:get_inventory() @@ -323,6 +394,7 @@ minetest.register_on_joinplayer(function(player) player_inv:set_stack(from_list, from_index, nil) armor:set_player_armor(player) armor:update_inventory(player) + armor:play_equip_sound(stack, player) end, allow_put = function(inv, listname, index, stack, player) local iname = stack:get_name() @@ -359,24 +431,25 @@ minetest.register_on_joinplayer(function(player) armor_inv:set_stack("armor", i, stack) end armor.def[name] = { - state = 0, count = 0, level = 0, heal = 0, jump = 1, speed = 1, gravity = 1, - fire = 0, - water = 0, - radiation = 0, } armor.textures[name] = { skin = armor.default_skin..".png", - armor = "3d_armor_trans.png", - wielditem = "3d_armor_trans.png", + armor = "blank.png", + wielditem = "blank.png", preview = armor.default_skin.."_preview.png", } - if skin_mod == "skins" then + if skin_mod == "mcl_skins" then + local skin = mcl_skins.skins[name] + if skin then + armor.textures[name].skin = skin..".png" + end + elseif skin_mod == "skins" then local skin = skins.skins[name] if skin and skins.get_type(skin) == skins.type.MODEL then armor.textures[name].skin = skin..".png" @@ -406,158 +479,67 @@ minetest.register_on_joinplayer(function(player) end end for i=1, ARMOR_INIT_TIMES do - minetest.after(ARMOR_INIT_DELAY * i, function(player) + minetest.after(ARMOR_INIT_DELAY * i, function(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end armor:set_player_armor(player) - end, player) + end, player:get_player_name()) end end) -if ARMOR_DROP == true or ARMOR_DESTROY == true then - armor.drop_armor = function(pos, stack) - local obj = minetest.add_item(pos, stack) - if obj then - obj:setvelocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)}) - end - end - minetest.register_on_dieplayer(function(player) - local name, player_inv, armor_inv, pos = armor:get_valid_player(player, "[on_dieplayer]") - if not name then - return - end - local drop = {} - for i=1, player_inv:get_size("armor") do - local stack = armor_inv:get_stack("armor", i) - if stack:get_count() > 0 then - table.insert(drop, stack) - armor_inv:set_stack("armor", i, nil) - player_inv:set_stack("armor", i, nil) - end - end - armor:set_player_armor(player) - if ARMOR_DESTROY == false then - minetest.after(ARMOR_BONES_DELAY, function() - local node = minetest.get_node(vector.round(pos)) - if node then - if node.name ~= "bones:bones" then - pos.y = pos.y+1 - node = minetest.get_node(vector.round(pos)) - if node.name ~= "bones:bones" then - minetest.log("warning", "Failed to add armor to bones node.") - return - end - end - local meta = minetest.get_meta(vector.round(pos)) - local owner = meta:get_string("owner") - local inv = meta:get_inventory() - for _,stack in ipairs(drop) do - if name == owner and 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) -end - -minetest.register_on_player_hpchange(function(player, hp_change) +minetest.register_on_player_hpchange(function(player, hp_change, reason) local name, player_inv, armor_inv = armor:get_valid_player(player, "[on_hpchange]") if name and hp_change < 0 then - -- used for insta kill tools/commands like /kill (doesnt damage armor) - if hp_change < -100 then + -- Armor doesn't protect from set_hp (commands like /kill), + -- falling and drowning damage. + if reason.type == "set_hp" or reason.type == "drown" or reason.type == "fall" then return hp_change end local heal_max = 0 - local state = 0 local items = 0 + local armor_damage = math.max(1, math.floor(math.abs(hp_change)/4)) + + local total_points = 0 + local total_toughness = 0 for i=1, 6 do local stack = player_inv:get_stack("armor", i) if stack:get_count() > 0 then - local use = stack:get_definition().groups["armor_use"] or 0 - local heal = stack:get_definition().groups["armor_heal"] or 0 + -- Damage armor + local use = stack:get_definition().groups["mcl_armor_uses"] or 0 + if use > 0 then + local wear = armor_damage * math.floor(65536/use) + stack:add_wear(wear) + end + local item = stack:get_name() - stack:add_wear(use) armor_inv:set_stack("armor", i, stack) player_inv:set_stack("armor", i, stack) - state = state + stack:get_wear() items = items + 1 if stack:get_count() == 0 then - local desc = minetest.registered_items[item].description - if desc then - minetest.chat_send_player(name, "Your "..desc.." got destroyed!") - end armor:set_player_armor(player) armor:update_inventory(player) end - heal_max = heal_max + heal + + local pts = stack:get_definition().groups["mcl_armor_points"] or 0 + local tough = stack:get_definition().groups["mcl_armor_toughness"] or 0 + total_points = total_points + pts + total_toughness = total_toughness + tough end end - armor.def[name].state = state + local damage = math.abs(hp_change) + + -- Damage calculation formula (from ) + damage = damage * (1 - math.min(20, math.max((total_points/5), total_points - damage / (2+(total_toughness/4)))) / 25) + damage = math.floor(damage+0.5) + + hp_change = -math.abs(damage) + armor.def[name].count = items - heal_max = heal_max * ARMOR_HEAL_MULTIPLIER - if heal_max > math.random(100) then - hp_change = 0 - end armor:update_armor(player) end return hp_change end, true) - --- Fire Protection and water breating, added by TenPlus1 - -if ARMOR_FIRE_PROTECT == true then - -- override hot nodes so they do not hurt player anywhere but mod - for _, row in pairs(ARMOR_FIRE_NODES) do - if minetest.registered_nodes[row[1]] then - minetest.override_item(row[1], {damage_per_second = 0}) - end - end -else - print ("[3d_armor] Fire Nodes disabled") -end - -minetest.register_globalstep(function(dtime) - armor.timer = armor.timer + dtime - if armor.timer < ARMOR_UPDATE_TIME then - return - end - for _,player in pairs(minetest.get_connected_players()) do - local name = player:get_player_name() - local pos = player:getpos() - local hp = player:get_hp() - -- water breathing - if name and armor.def[name].water > 0 then - if player:get_breath() < 10 then - player:set_breath(10) - end - end - -- fire protection - if ARMOR_FIRE_PROTECT == true - and name and pos and hp then - pos.y = pos.y + 1.4 -- head level - local node_head = minetest.get_node(pos).name - pos.y = pos.y - 1.2 -- feet level - local node_feet = minetest.get_node(pos).name - -- is player inside a hot node? - for _, row in pairs(ARMOR_FIRE_NODES) do - -- check fire protection, if not enough then get hurt - if row[1] == node_head or row[1] == node_feet then - if hp > 0 and armor.def[name].fire < row[2] then - hp = hp - row[3] * ARMOR_UPDATE_TIME - player:set_hp(hp) - break - end - end - end - end - end - armor.timer = 0 -end) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/depends.txt b/mods/ITEMS/mcl_armor/depends.txt similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/depends.txt rename to mods/ITEMS/mcl_armor/depends.txt diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/description.txt b/mods/ITEMS/mcl_armor/description.txt similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/description.txt rename to mods/ITEMS/mcl_armor/description.txt diff --git a/mods/ITEMS/mcl_armor/init.lua b/mods/ITEMS/mcl_armor/init.lua new file mode 100644 index 00000000..1eb03d32 --- /dev/null +++ b/mods/ITEMS/mcl_armor/init.lua @@ -0,0 +1,392 @@ +local S = minetest.get_translator("mcl_armor") + +dofile(minetest.get_modpath(minetest.get_current_modname()).."/armor.lua") +dofile(minetest.get_modpath(minetest.get_current_modname()).."/alias.lua") + +-- Regisiter Head Armor + +local longdesc = S("This is a piece of equippable armor which reduces the amount of damage you receive.") +local usage = S("To equip it, put it on the corresponding armor slot in your inventory menu.") + +minetest.register_tool("mcl_armor:helmet_leather", { + description = S("Leather Cap"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_helmet_leather.png", + groups = {armor_head=1, mcl_armor_points=1, mcl_armor_uses=56}, + _repair_material = "mcl_mobitems:leather", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_leather", + _mcl_armor_unequip = "mcl_armor_unequip_leather", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:helmet_iron", { + description = S("Iron Helmet"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_helmet_iron.png", + groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166}, + _repair_material = "mcl_core:iron_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + _mcl_armor_unequip = "mcl_armor_unequip_iron", + }, + + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:helmet_gold", { + description = S("Golden Helmet"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_helmet_gold.png", + groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=78}, + _repair_material = "mcl_core:gold_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + _mcl_armor_unequip = "mcl_armor_unequip_iron", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:helmet_diamond",{ + description = S("Diamond Helmet"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_helmet_diamond.png", + groups = {armor_head=1, mcl_armor_points=3, mcl_armor_uses=364, mcl_armor_toughness=2}, + _repair_material = "mcl_core:diamond", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_diamond", + _mcl_armor_unequip = "mcl_armor_unequip_diamond", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:helmet_chain", { + description = S("Chain Helmet"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_helmet_chain.png", + groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166}, + _repair_material = "mcl_core:iron_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_chainmail", + _mcl_armor_unequip = "mcl_armor_unequip_chainmail", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +-- Regisiter Torso Armor + +minetest.register_tool("mcl_armor:chestplate_leather", { + description = S("Leather Tunic"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_chestplate_leather.png", + groups = {armor_torso=1, mcl_armor_points=3, mcl_armor_uses=81}, + _repair_material = "mcl_mobitems:leather", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_leather", + _mcl_armor_unequip = "mcl_armor_unequip_leather", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:chestplate_iron", { + description = S("Iron Chestplate"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_chestplate_iron.png", + groups = {armor_torso=1, mcl_armor_points=6, mcl_armor_uses=241}, + _repair_material = "mcl_core:iron_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + _mcl_armor_unequip = "mcl_armor_unequip_iron", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:chestplate_gold", { + description = S("Golden Chestplate"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_chestplate_gold.png", + groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=113}, + _repair_material = "mcl_core:gold_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + _mcl_armor_unequip = "mcl_armor_unequip_iron", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:chestplate_diamond",{ + description = S("Diamond Chestplate"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_chestplate_diamond.png", + groups = {armor_torso=1, mcl_armor_points=8, mcl_armor_uses=529, mcl_armor_toughness=2}, + _repair_material = "mcl_core:diamond", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_diamond", + _mcl_armor_unequip = "mcl_armor_unequip_diamond", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:chestplate_chain", { + description = S("Chain Chestplate"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_chestplate_chain.png", + groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=241}, + _repair_material = "mcl_core:iron_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_chainmail", + _mcl_armor_unequip = "mcl_armor_unequip_chainmail", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +-- Regisiter Leg Armor + +minetest.register_tool("mcl_armor:leggings_leather", { + description = S("Leather Pants"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_leggings_leather.png", + groups = {armor_legs=1, mcl_armor_points=2, mcl_armor_uses=76}, + _repair_material = "mcl_mobitems:leather", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_leather", + _mcl_armor_unequip = "mcl_armor_unequip_leather", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:leggings_iron", { + description = S("Iron Leggings"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_leggings_iron.png", + groups = {armor_legs=1, mcl_armor_points=5, mcl_armor_uses=226}, + _repair_material = "mcl_core:iron_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + _mcl_armor_unequip = "mcl_armor_unequip_iron", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:leggings_gold", { + description = S("Golden Leggings"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_leggings_gold.png", + groups = {armor_legs=1, mcl_armor_points=3, mcl_armor_uses=106}, + _repair_material = "mcl_core:gold_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + _mcl_armor_unequip = "mcl_armor_unequip_iron", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:leggings_diamond",{ + description = S("Diamond Leggings"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_leggings_diamond.png", + groups = {armor_legs=1, mcl_armor_points=6, mcl_armor_uses=496, mcl_armor_toughness=2}, + _repair_material = "mcl_core:diamond", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_diamond", + _mcl_armor_unequip = "mcl_armor_unequip_diamond", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:leggings_chain", { + description = S("Chain Leggings"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_leggings_chain.png", + groups = {armor_legs=1, mcl_armor_points=4, mcl_armor_uses=226}, + _repair_material = "mcl_core:iron_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_chainmail", + _mcl_armor_unequip = "mcl_armor_unequip_chainmail", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) +-- Regisiter Boots + +minetest.register_tool("mcl_armor:boots_leather", { + description = S("Leather Boots"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_boots_leather.png", + groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=66}, + _repair_material = "mcl_mobitems:leather", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_leather", + _mcl_armor_unequip = "mcl_armor_unequip_leather", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:boots_iron", { + description = S("Iron Boots"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_boots_iron.png", + groups = {armor_feet=1, mcl_armor_points=2, mcl_armor_uses=196}, + _repair_material = "mcl_core:iron_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + _mcl_armor_unequip = "mcl_armor_unequip_iron", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:boots_gold", { + description = S("Golden Boots"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_boots_gold.png", + groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=92}, + _repair_material = "mcl_core:gold_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_iron", + _mcl_armor_unequip = "mcl_armor_unequip_iron", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:boots_diamond",{ + description = S("Diamond Boots"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_boots_diamond.png", + groups = {armor_feet=1, mcl_armor_points=3, mcl_armor_uses=430, mcl_armor_toughness=2}, + _repair_material = "mcl_core:diamond", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_diamond", + _mcl_armor_unequip = "mcl_armor_unequip_diamond", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +minetest.register_tool("mcl_armor:boots_chain", { + description = S("Chain Boots"), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usage, + inventory_image = "mcl_armor_inv_boots_chain.png", + groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=196}, + _repair_material = "mcl_core:iron_ingot", + sounds = { + _mcl_armor_equip = "mcl_armor_equip_chainmail", + _mcl_armor_unequip = "mcl_armor_unequip_chainmail", + }, + on_place = armor.on_armor_use, + on_secondary_use = armor.on_armor_use, +}) + +-- Register Craft Recipies + +local craft_ingreds = { + leather = { "mcl_mobitems:leather" }, + iron = { "mcl_core:iron_ingot", "mcl_core:iron_nugget" }, + gold = { "mcl_core:gold_ingot", "mcl_core:gold_nugget" }, + diamond = { "mcl_core:diamond" }, + chain = { nil, "mcl_core:iron_nugget"} , +} + +for k, v in pairs(craft_ingreds) do + -- material + local m = v[1] + -- cooking result + local c = v[2] + if m ~= nil then + minetest.register_craft({ + output = "mcl_armor:helmet_"..k, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "mcl_armor:chestplate_"..k, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "mcl_armor:leggings_"..k, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "mcl_armor:boots_"..k, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) + end + if c ~= nil then + minetest.register_craft({ + type = "cooking", + output = c, + recipe = "mcl_armor:helmet_"..k, + cooktime = 10, + }) + minetest.register_craft({ + type = "cooking", + output = c, + recipe = "mcl_armor:chestplate_"..k, + cooktime = 10, + }) + minetest.register_craft({ + type = "cooking", + output = c, + recipe = "mcl_armor:leggings_"..k, + cooktime = 10, + }) + minetest.register_craft({ + type = "cooking", + output = c, + recipe = "mcl_armor:boots_"..k, + cooktime = 10, + }) + end +end + diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.de.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.de.tr new file mode 100644 index 00000000..09da3a9c --- /dev/null +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.de.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_armor +This is a piece of equippable armor which reduces the amount of damage you receive.=Dies ist ein Teil einer tragbaren Rüstung, die die Menge an Schaden, den Sie erleiden, reduziert. +To equip it, put it on the corresponding armor slot in your inventory menu.=Um es zu tragen, legen Sie es in den passenden Rüstungsplatz in ihrem Inventarmenü. +Leather Cap=Lederkappe +Iron Helmet=Eisenhelm +Golden Helmet=Goldhelm +Diamond Helmet=Diamanthelm +Chain Helmet=Kettenhelm +Leather Tunic=Ledertunika +Iron Chestplate=Eisenbrustpanzer +Golden Chestplate=Goldbrustpanzer +Diamond Chestplate=Diamantbrustpanzer +Chain Chestplate=Kettenbrustpanzer +Leather Pants=Lederhose +Iron Leggings=Eisenbeinlinge +Golden Leggings=Goldbeinlinge +Diamond Leggings=Diamantbeinlinge +Chain Leggings=Kettenbeinlinge +Leather Boots=Lederstiefel +Iron Boots=Eisenstiefel +Golden Boots=Goldstiefel +Diamond Boots=Diamantstiefel +Chain Boots=Kettenstiefel diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.es.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.es.tr new file mode 100644 index 00000000..e770dff0 --- /dev/null +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.es.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_armor +This is a piece of equippable armor which reduces the amount of damage you receive.=Dies ist ein Teil einer tragbaren Rüstung, die die Menge an Schaden, den Sie erleiden, reduziert. +To equip it, put it on the corresponding armor slot in your inventory menu.=Um es zu tragen, legen Sie es in den passenden Rüstungsplatz in ihrem Inventarmenü. +Leather Cap=Sombrero de cuero +Iron Helmet=Casco de hierro +Golden Helmet=Casco de oro +Diamond Helmet=Casco de diamante +Chain Helmet=Casco de cota de mallas +Leather Tunic=Túnica de cuero +Iron Chestplate=Peto de hierro +Golden Chestplate=Peto de oro +Diamond Chestplate=Peto de diamante +Chain Chestplate=Peto de cota de mallas +Leather Pants=Pantalones de cuero +Iron Leggings=Grebas de hierro +Golden Leggings=Grebas de oro +Diamond Leggings=Grebas de diamante +Chain Leggings=Grebas de cota de mallas +Leather Boots=Botas de cuero +Iron Boots=Botas de hierro +Golden Boots=Botas de oro +Diamond Boots=Botas de diamante +Chain Boots=Botas de cota de mallas diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr new file mode 100644 index 00000000..6f55a73f --- /dev/null +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_armor +This is a piece of equippable armor which reduces the amount of damage you receive.=Il s'agit d'un morceau d'armure équipable qui réduit la quantité de dégâts que vous recevez. +To equip it, put it on the corresponding armor slot in your inventory menu.=Pour l'équiper, placez-le sur l'emplacement d'armure correspondant dans votre menu d'inventaire. +Leather Cap=Casquette en Cuir +Iron Helmet=Casque de Fer +Golden Helmet=Casque d'Or +Diamond Helmet=Casque de Diamant +Chain Helmet=Casque de Mailles +Leather Tunic=Tunique en Cuir +Iron Chestplate=Plastron de Fer +Golden Chestplate=Plastron d'Or +Diamond Chestplate=Plastron de Diamant +Chain Chestplate=Cotte de Mailles +Leather Pants=Pantalon de Cuir +Iron Leggings=Jambières de Fer +Golden Leggings=Jambières d'Or +Diamond Leggings=Jambières de Diamant +Chain Leggings=Jambières de Mailles +Leather Boots=Bottes de Cuir +Iron Boots=Bottes de Fer +Golden Boots=Bottes d'Or +Diamond Boots=Bottes de Diamant +Chain Boots=Bottes de Mailles diff --git a/mods/ITEMS/mcl_armor/locale/template.txt b/mods/ITEMS/mcl_armor/locale/template.txt new file mode 100644 index 00000000..8a95fca0 --- /dev/null +++ b/mods/ITEMS/mcl_armor/locale/template.txt @@ -0,0 +1,23 @@ +# textdomain: mcl_armor +This is a piece of equippable armor which reduces the amount of damage you receive.= +To equip it, put it on the corresponding armor slot in your inventory menu.= +Leather Cap= +Iron Helmet= +Golden Helmet= +Diamond Helmet= +Chain Helmet= +Leather Tunic= +Iron Chestplate= +Golden Chestplate= +Diamond Chestplate= +Chain Chestplate= +Leather Pants= +Iron Leggings= +Golden Leggings= +Diamond Leggings= +Chain Leggings= +Leather Boots= +Iron Boots= +Golden Boots= +Diamond Boots= +Chain Boots= diff --git a/mods/ITEMS/mcl_armor/models/mcl_armor_character.b3d b/mods/ITEMS/mcl_armor/models/mcl_armor_character.b3d new file mode 100644 index 00000000..c4d45b50 Binary files /dev/null and b/mods/ITEMS/mcl_armor/models/mcl_armor_character.b3d differ diff --git a/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend b/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend new file mode 100644 index 00000000..44f7e27d Binary files /dev/null and b/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_chainmail.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_chainmail.ogg new file mode 100644 index 00000000..3e98e0e0 Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_chainmail.ogg differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_diamond.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_diamond.ogg new file mode 100644 index 00000000..9fd655ab Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_diamond.ogg differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_generic.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_generic.ogg new file mode 100644 index 00000000..1d3b3de2 Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_generic.ogg differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_iron.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_iron.ogg new file mode 100644 index 00000000..7001c446 Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_iron.ogg differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_leather.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_leather.ogg new file mode 100644 index 00000000..378ec316 Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_equip_leather.ogg differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_chainmail.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_chainmail.ogg new file mode 100644 index 00000000..01692b5d Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_chainmail.ogg differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_diamond.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_diamond.ogg new file mode 100644 index 00000000..bdfdf803 Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_diamond.ogg differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_generic.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_generic.ogg new file mode 100644 index 00000000..c04975d4 Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_generic.ogg differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_iron.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_iron.ogg new file mode 100644 index 00000000..969ac030 Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_iron.ogg differ diff --git a/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_leather.ogg b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_leather.ogg new file mode 100644 index 00000000..e634b89d Binary files /dev/null and b/mods/ITEMS/mcl_armor/sounds/mcl_armor_unequip_leather.ogg differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_chain.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_chain.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_chain.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_chain.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_chain_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_chain_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_chain_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_chain_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_diamond.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_diamond.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_diamond.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_diamond.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_diamond_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_diamond_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_gold.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_gold.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_gold.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_gold.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_gold_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_gold_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_iron.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_iron.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_iron.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_iron.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_iron_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_iron_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_iron_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_iron_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_leather.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_leather.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_leather.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_leather.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_leather_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_leather_preview.png similarity index 54% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_leather_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_boots_leather_preview.png index d0457ce9..d527d426 100644 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_boots_leather_preview.png and b/mods/ITEMS/mcl_armor/textures/mcl_armor_boots_leather_preview.png differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_chain.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_chain.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_chain.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_chain.png diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_chain_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_chain_preview.png new file mode 100644 index 00000000..87ab8d6a Binary files /dev/null and b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_chain_preview.png differ diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_diamond.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_diamond.png new file mode 100644 index 00000000..51ece245 Binary files /dev/null and b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_diamond.png differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_diamond_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_diamond_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_gold.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_gold.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_gold_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_gold_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_iron.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_iron.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_iron.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_iron.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_iron_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_iron_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_iron_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_iron_preview.png diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_leather.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_leather.png new file mode 100644 index 00000000..6297859f Binary files /dev/null and b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_leather.png differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_leather_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_leather_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_leather_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_chestplate_leather_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_chain.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_chain.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_chain.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_chain.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_chain_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_chain_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_chain_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_chain_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_diamond.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_diamond.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_diamond_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_diamond_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_gold.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_gold.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_gold.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_gold.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_gold_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_gold_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_iron.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_iron.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_iron.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_iron.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_iron_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_iron_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_iron_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_iron_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_leather.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_leather.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_leather.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_leather.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_leather_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_leather_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_helmet_leather_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_helmet_leather_preview.png diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_chain.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_chain.png new file mode 100644 index 00000000..eaed6b6d Binary files /dev/null and b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_chain.png differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_diamond.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_diamond.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_gold.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_gold.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_iron.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_iron.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_iron.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_iron.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_leather.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_leather.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_leather.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_boots_leather.png diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_chain.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_chain.png new file mode 100644 index 00000000..d8229d8d Binary files /dev/null and b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_chain.png differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_diamond.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_diamond.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_gold.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_gold.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_iron.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_iron.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_iron.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_iron.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_leather.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_leather.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_leather.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_chestplate_leather.png diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_chain.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_chain.png new file mode 100644 index 00000000..92c1e4e0 Binary files /dev/null and b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_chain.png differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_diamond.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_diamond.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_gold.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_gold.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_iron.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_iron.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_iron.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_iron.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_leather.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_leather.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_leather.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_helmet_leather.png diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_chain.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_chain.png new file mode 100644 index 00000000..7648cda2 Binary files /dev/null and b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_chain.png differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_diamond.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_diamond.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_gold.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_gold.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_iron.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_iron.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_iron.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_iron.png diff --git a/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_leather.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_leather.png new file mode 100644 index 00000000..b35086a9 Binary files /dev/null and b/mods/ITEMS/mcl_armor/textures/mcl_armor_inv_leggings_leather.png differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_chain.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_chain.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_chain.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_chain.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_chain_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_chain_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_chain_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_chain_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_diamond.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_diamond.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_diamond_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_diamond_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_gold.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_gold.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_gold.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_gold.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_gold_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_gold_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_iron.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_iron.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_iron.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_iron.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_iron_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_iron_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_iron_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_iron_preview.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_leather.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_leather.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_leather.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_leather.png diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_leather_preview.png b/mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_leather_preview.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_leggings_leather_preview.png rename to mods/ITEMS/mcl_armor/textures/mcl_armor_leggings_leather_preview.png diff --git a/mods/ITEMS/mcl_armor_stand/LICENSE.txt b/mods/ITEMS/mcl_armor_stand/LICENSE.txt new file mode 100644 index 00000000..3ef95067 --- /dev/null +++ b/mods/ITEMS/mcl_armor_stand/LICENSE.txt @@ -0,0 +1,8 @@ +[mod] 3d Armor Stand [mcl_armor_stand] +====================================== + +License Source Code: LGPL v2.1 + +License Media: CC BY-SA 3.0 + +Source Code: Copyright (C) 2013 Stuart Jones - LGPL diff --git a/mods/ITEMS/mcl_armor_stand/README.txt b/mods/ITEMS/mcl_armor_stand/README.txt new file mode 100644 index 00000000..4ecbbba6 --- /dev/null +++ b/mods/ITEMS/mcl_armor_stand/README.txt @@ -0,0 +1,6 @@ +[mod] 3d Armor Stand [mcl_armor_stand] +====================================== + +Depends: mcl_armor + +Adds an armor stand for armor storage and display. diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/depends.txt b/mods/ITEMS/mcl_armor_stand/depends.txt similarity index 55% rename from mods/ITEMS/minetest-3d_armor/3d_armor_stand/depends.txt rename to mods/ITEMS/mcl_armor_stand/depends.txt index 6fec7760..02ce27d7 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/depends.txt +++ b/mods/ITEMS/mcl_armor_stand/depends.txt @@ -1,5 +1,5 @@ -3d_armor +mcl_armor mcl_core mcl_sounds mcl_stairs -doc_identifier? +screwdriver? diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/mcl_armor_stand/init.lua similarity index 64% rename from mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua rename to mods/ITEMS/mcl_armor_stand/init.lua index 68992138..88b46a34 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/mcl_armor_stand/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_armor_stand") + local elements = {"head", "torso", "legs", "feet"} local function get_stand_object(pos) @@ -6,7 +8,7 @@ local function get_stand_object(pos) for _, obj in pairs(objects) do local ent = obj:get_luaentity() if ent then - if ent.name == "3d_armor_stand:armor_entity" then + if ent.name == "mcl_armor_stand:armor_entity" then -- Remove duplicates if object then obj:remove() @@ -23,15 +25,15 @@ 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 + if not string.find(node.name, "mcl_armor_stand:") then object:remove() return end else - object = minetest.add_entity(pos, "3d_armor_stand:armor_entity") + object = minetest.add_entity(pos, "mcl_armor_stand:armor_entity") end if object then - local texture = "3d_armor_trans.png" + local texture = "blank.png" local textures = {} local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -41,6 +43,9 @@ local function update_entity(pos) local stack = inv:get_stack("armor_"..element, 1) if stack:get_count() == 1 then local item = stack:get_name() or "" + if minetest.registered_aliases[item] then + item = minetest.registered_aliases[item] + end local def = stack:get_definition() or {} local groups = def.groups or {} if groups["armor_"..element] then @@ -63,7 +68,7 @@ local function update_entity(pos) yaw = math.pi / 2 end end - object:setyaw(yaw) + object:set_yaw(yaw) object:set_properties({textures={texture}}) end end @@ -81,11 +86,12 @@ local drop_armor = function(pos) end end --- FIXME: The armor stand should be an entity -minetest.register_node("3d_armor_stand:armor_stand", { - description = "Armor Stand", - _doc_items_longdesc = "An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.", - _doc_items_usagehelp = "Hold an armor item in your hand and rightclick the armor stand to put it on the armor stand. To take a piece of armor from the armor stand, select your hand and rightclick the armor stand. You'll retrieve the first armor item from above.", +-- TODO: The armor stand should be an entity +minetest.register_node("mcl_armor_stand:armor_stand", { + description = S("Armor Stand"), + _tt_help = S("Displays pieces of armor"), + _doc_items_longdesc = S("An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand."), + _doc_items_usagehelp = S("Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand."), drawtype = "mesh", mesh = "3d_armor_stand.obj", inventory_image = "3d_armor_stand_item.png", @@ -100,8 +106,8 @@ minetest.register_node("3d_armor_stand:armor_stand", { type = "fixed", fixed = {-0.5,-0.5,-0.5, 0.5,1.4,0.5} }, - -- FIXME: This should be breakable by 2 quick punches - groups = {handy=1, deco_block=1}, + -- TODO: This should be breakable by 2 quick punches + groups = {handy=1, deco_block=1, dig_by_piston=1, attached_node=1}, _mcl_hardness = 2, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) @@ -115,6 +121,17 @@ minetest.register_node("3d_armor_stand:armor_stand", { on_destruct = drop_armor, -- Put piece of armor on armor stand, or take one away on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return itemstack + end + + local inv = minetest.get_inventory({type = "node", pos = pos}) + if not inv then + return itemstack + end + -- Check if player wields armor local name = itemstack:get_name() local list @@ -125,19 +142,18 @@ minetest.register_node("3d_armor_stand:armor_stand", { break end end - -- If player wields armor, put it on armor stand - local inv = minetest.get_inventory({type = "node", pos = pos}) local wielditem = clicker:get_wielded_item() - if not inv then return end if list then -- ... but only if the slot is free - local single_item = itemstack:get_name() + local single_item = ItemStack(itemstack) + single_item:set_count(1) if inv:is_empty(list) then inv:add_item(list, single_item) + armor:play_equip_sound(single_item, nil, pos) update_entity(pos) itemstack:take_item() - return itmstack + return itemstack end end @@ -159,19 +175,35 @@ minetest.register_node("3d_armor_stand:armor_stand", { taken = true end if taken then + armor:play_equip_sound(stand_armor, nil, pos, true) stand_armor:take_item() inv:set_stack("armor_" .. elements[e], 1, stand_armor) - update_entity(pos) end + update_entity(pos) return clicker:get_wielded_item() end end + update_entity(pos) return itemstack end, after_place_node = function(pos) - minetest.add_entity(pos, "3d_armor_stand:armor_entity") + minetest.add_entity(pos, "mcl_armor_stand:armor_entity") end, - allow_metadata_inventory_put = function(pos, listname, index, stack) + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end local def = stack:get_definition() or {} local groups = def.groups or {} if groups[listname] then @@ -179,7 +211,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { end return 0 end, - allow_metadata_inventory_move = function(pos) + allow_metadata_inventory_move = function() return 0 end, on_metadata_inventory_put = function(pos) @@ -200,19 +232,29 @@ minetest.register_node("3d_armor_stand:armor_stand", { update_entity(pos) end, pos) end, + on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_FACE then + node.param2 = (node.param2 + 1) % 4 + minetest.swap_node(pos, node) + update_entity(pos) + return true + end + return false + end, }) -minetest.register_entity("3d_armor_stand:armor_entity", { +minetest.register_entity("mcl_armor_stand:armor_entity", { physical = true, visual = "mesh", mesh = "3d_armor_entity.obj", visual_size = {x=1, y=1}, collisionbox = {-0.1,-0.4,-0.1, 0.1,1.3,0.1}, - textures = {"3d_armor_trans.png"}, + pointable = false, + textures = {"blank.png"}, pos = nil, timer = 0, on_activate = function(self) - local pos = self.object:getpos() + local pos = self.object:get_pos() self.object:set_armor_groups({immortal=1}) if pos then self.pos = vector.round(pos) @@ -226,7 +268,7 @@ minetest.register_entity("3d_armor_stand:armor_entity", { self.timer = self.timer + dtime if self.timer > 1 then self.timer = 0 - local pos = self.object:getpos() + local pos = self.object:get_pos() if pos then if vector.equals(vector.round(pos), self.pos) then return @@ -238,12 +280,19 @@ minetest.register_entity("3d_armor_stand:armor_entity", { end, }) -if minetest.get_modpath("doc_identifier") ~= nil then - doc.sub.identifier.register_object("3d_armor_stand:armor_entity", "nodes", "3d_armor_stand:armor_stand") -end +-- FIXME: Armor helper entity can get destroyed by /clearobjects +minetest.register_lbm({ + label = "Respawn armor stand entities", + name = "mcl_armor_stand:respawn_entities", + nodenames = {"mcl_armor_stand:armor_stand"}, + run_at_every_load = true, + action = function(pos, node) + update_entity(pos, node) + end, +}) minetest.register_craft({ - output = "3d_armor_stand:armor_stand", + output = "mcl_armor_stand:armor_stand", recipe = { {"mcl_core:stick", "mcl_core:stick", "mcl_core:stick"}, {"", "mcl_core:stick", ""}, @@ -251,3 +300,13 @@ minetest.register_craft({ } }) + +-- Legacy handling +minetest.register_alias("3d_armor_stand:armor_stand", "mcl_armor_stand:armor_stand") +minetest.register_entity(":3d_armor_stand:armor_entity", { + on_activate = function(self) + minetest.log("action", "[mcl_armor_stand] Removing legacy entity: 3d_armor_stand:armor_entity") + self.object:remove() + end, + static_save = false, +}) diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.de.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.de.tr new file mode 100644 index 00000000..e6f8fa91 --- /dev/null +++ b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_armor_stand +Armor Stand=Rüstungsständer +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Ein Rüstungsständer ist ein dekoratives Objekt, welches verschiedene Teile einer Rüstung präsentiert. Alles, was Spieler als Rüstung tragen kann, kann auch an einem Rüstungsständer platziert werden. +Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Platzieren Sie einfach einen Rüstungsgegenstand auf den Rüstungsständer. Um das oberte Rüstungsteil zu nehmen, wählen Sie Ihre Hand aus und benutzen Sie die Platzieren-Taste auf dem Rüstungsständer. +Displays pieces of armor=Stellt Rüstungsteile aus diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.es.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.es.tr new file mode 100644 index 00000000..8e33389a --- /dev/null +++ b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.es.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_armor_stand +Armor Stand=Soporte para armadura +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Un soporte para armadura es un objeto decorativo que puede mostrar diferentes piezas de armadura. Cualquier cosa que los jugadores puedan usar como armadura también se puede poner en un soporte para armadura. +Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Simplemente coloca un objeto de armadura en el soporte para armadura. Para tomar la pieza superior de armadura del soporte para armadura, seleccione su mano y use la tecla de posición en el soporte para armadura. diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr new file mode 100644 index 00000000..867b3f04 --- /dev/null +++ b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_armor_stand +Armor Stand=Support d'armure +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Un support d'armure est un objet décoratif qui peut afficher différentes pièces d'armure. Tout ce que les joueurs peuvent porter comme armure peut également être placé sur un support d'armure. +Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Placez simplement un objet d'armure sur le support d'armure. Pour prendre la pièce d'armure du support d'armure, sélectionnez votre main et utilisez la touche "Placer" sur le support d'armure. +Displays pieces of armor=Displays pieces of armor diff --git a/mods/ITEMS/mcl_armor_stand/locale/template.txt b/mods/ITEMS/mcl_armor_stand/locale/template.txt new file mode 100644 index 00000000..8d3f3cb8 --- /dev/null +++ b/mods/ITEMS/mcl_armor_stand/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_armor_stand +Armor Stand= +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.= +Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.= +Displays pieces of armor= diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/models/3d_armor_entity.obj b/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor_stand/models/3d_armor_entity.obj rename to mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/models/3d_armor_stand.obj b/mods/ITEMS/mcl_armor_stand/models/3d_armor_stand.obj similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor_stand/models/3d_armor_stand.obj rename to mods/ITEMS/mcl_armor_stand/models/3d_armor_stand.obj diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/textures/3d_armor_stand_item.png b/mods/ITEMS/mcl_armor_stand/textures/3d_armor_stand_item.png similarity index 100% rename from mods/ITEMS/minetest-3d_armor/3d_armor_stand/textures/3d_armor_stand_item.png rename to mods/ITEMS/mcl_armor_stand/textures/3d_armor_stand_item.png diff --git a/mods/ITEMS/mcl_banners/README.txt b/mods/ITEMS/mcl_banners/README.txt index 330f46d6..4de3ce43 100644 --- a/mods/ITEMS/mcl_banners/README.txt +++ b/mods/ITEMS/mcl_banners/README.txt @@ -1,6 +1,6 @@ License of code: WTFPL -License of textures: See README.me in top directory of MineClone 2. +License of textures: See README.md in top directory of MineClone 2. License of models: GPLv3 (https://www.gnu.org/licenses/gpl-3.0.html) Models author: 22i. diff --git a/mods/ITEMS/mcl_banners/depends.txt b/mods/ITEMS/mcl_banners/depends.txt index fea9f0e4..d7ac7105 100644 --- a/mods/ITEMS/mcl_banners/depends.txt +++ b/mods/ITEMS/mcl_banners/depends.txt @@ -3,3 +3,4 @@ mcl_core? mcl_wool? mcl_cauldrons? doc? +screwdriver? diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index ec78fa44..57adbed8 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -1,3 +1,6 @@ +local S = minetest.get_translator("mcl_banners") +local N = function(s) return s end + local node_sounds if minetest.get_modpath("mcl_sounds") then node_sounds = mcl_sounds.node_sound_wood_defaults() @@ -14,24 +17,29 @@ mcl_banners = {} mcl_banners.colors = { -- Format: -- [ID] = { banner description, wool, unified dyes color group, overlay color, dye, color name for emblazonings } - ["unicolor_white"] = {"white", "White Banner", "mcl_wool:white", "#FFFFFF", "mcl_dye:white", "White" }, - ["unicolor_darkgrey"] = {"grey", "Grey Banner", "mcl_wool:grey", "#303030", "mcl_dye:dark_grey", "Grey" }, - ["unicolor_grey"] = {"silver", "Light Grey Banner", "mcl_wool:silver", "#5B5B5B", "mcl_dye:grey", "Light Grey" }, - ["unicolor_black"] = {"black", "Black Banner", "mcl_wool:black", "#000000", "mcl_dye:black", "Black" }, - ["unicolor_red"] = {"red", "Red Banner", "mcl_wool:red", "#BC0000", "mcl_dye:red", "Red" }, - ["unicolor_yellow"] = {"yellow", "Yellow Banner", "mcl_wool:yellow", "#E6CD00", "mcl_dye:yellow", "Yellow" }, - ["unicolor_dark_green"] = {"green", "Green Banner", "mcl_wool:green", "#006000", "mcl_dye:dark_green", "Green" }, - ["unicolor_cyan"] = {"cyan", "Cyan Banner", "mcl_wool:cyan", "#00ACAC", "mcl_dye:cyan", "Cyan" }, - ["unicolor_blue"] = {"blue", "Blue Banner", "mcl_wool:blue", "#0000AC", "mcl_dye:blue", "Blue" }, - ["unicolor_red_violet"] = {"magenta", "Magenta Banner", "mcl_wool:magenta", "#AC007C", "mcl_dye:magenta", "Magenta"}, - ["unicolor_orange"] = {"orange", "Orange Banner", "mcl_wool:orange", "#E67300", "mcl_dye:orange", "Orange" }, - ["unicolor_violet"] = {"purple", "Purple Banner", "mcl_wool:purple", "#6400AC", "mcl_dye:violet", "Violet" }, - ["unicolor_brown"] = {"brown", "Brown Banner", "mcl_wool:brown", "#603000", "mcl_dye:brown", "Brown" }, - ["unicolor_pink"] = {"pink", "Pink Banner", "mcl_wool:pink", "#DE557C", "mcl_dye:pink", "Pink" }, - ["unicolor_lime"] = {"lime", "Lime Banner", "mcl_wool:lime", "#30AC00", "mcl_dye:green", "Lime" }, - ["unicolor_light_blue"] = {"light_blue", "Light Blue Banner", "mcl_wool:light_blue", "#4040CF", "mcl_dye:lightblue", "Light Blue" }, + ["unicolor_white"] = {"white", S("White Banner"), "mcl_wool:white", "#FFFFFF", "mcl_dye:white", N("White") }, + ["unicolor_darkgrey"] = {"grey", S("Grey Banner"), "mcl_wool:grey", "#303030", "mcl_dye:dark_grey", N("Grey") }, + ["unicolor_grey"] = {"silver", S("Light Grey Banner"), "mcl_wool:silver", "#5B5B5B", "mcl_dye:grey", N("Light Grey") }, + ["unicolor_black"] = {"black", S("Black Banner"), "mcl_wool:black", "#000000", "mcl_dye:black", N("Black") }, + ["unicolor_red"] = {"red", S("Red Banner"), "mcl_wool:red", "#BC0000", "mcl_dye:red", N("Red") }, + ["unicolor_yellow"] = {"yellow", S("Yellow Banner"), "mcl_wool:yellow", "#E6CD00", "mcl_dye:yellow", N("Yellow") }, + ["unicolor_dark_green"] = {"green", S("Green Banner"), "mcl_wool:green", "#006000", "mcl_dye:dark_green", N("Green") }, + ["unicolor_cyan"] = {"cyan", S("Cyan Banner"), "mcl_wool:cyan", "#00ACAC", "mcl_dye:cyan", N("Cyan") }, + ["unicolor_blue"] = {"blue", S("Blue Banner"), "mcl_wool:blue", "#0000AC", "mcl_dye:blue", N("Blue") }, + ["unicolor_red_violet"] = {"magenta", S("Magenta Banner"), "mcl_wool:magenta", "#AC007C", "mcl_dye:magenta", N("Magenta")}, + ["unicolor_orange"] = {"orange", S("Orange Banner"), "mcl_wool:orange", "#E67300", "mcl_dye:orange", N("Orange") }, + ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#6400AC", "mcl_dye:violet", N("Violet") }, + ["unicolor_brown"] = {"brown", S("Brown Banner"), "mcl_wool:brown", "#603000", "mcl_dye:brown", N("Brown") }, + ["unicolor_pink"] = {"pink", S("Pink Banner"), "mcl_wool:pink", "#DE557C", "mcl_dye:pink", N("Pink") }, + ["unicolor_lime"] = {"lime", S("Lime Banner"), "mcl_wool:lime", "#30AC00", "mcl_dye:green", N("Lime") }, + ["unicolor_light_blue"] = {"light_blue", S("Light Blue Banner"), "mcl_wool:light_blue", "#4040CF", "mcl_dye:lightblue", N("Light Blue") }, } +local colors_reverse = {} +for k,v in pairs(mcl_banners.colors) do + colors_reverse["mcl_banners:banner_item_"..v[1]] = k +end + -- Add pattern/emblazoning crafting recipes dofile(minetest.get_modpath("mcl_banners").."/patterncraft.lua") @@ -42,26 +50,55 @@ local layer_ratio = 255 local standing_banner_entity_offset = { x=0, y=-0.499, z=0 } local hanging_banner_entity_offset = { x=0, y=-1.7, z=0 } -local on_destruct_standing_banner = function(pos) - -- Find this node's banner entity and make it drop as an item - local checkpos = vector.add(pos, standing_banner_entity_offset) +local rotation_level_to_yaw = function(rotation_level) + return (rotation_level * (math.pi/8)) + math.pi +end + +local on_dig_banner = function(pos, node, digger) + -- Check protection + local name = digger:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + -- Drop item + local meta = minetest.get_meta(pos) + local item = meta:get_inventory():get_stack("banner", 1) + if not item:is_empty() then + minetest.handle_node_drops(pos, {item:to_string()}, digger) + else + minetest.handle_node_drops(pos, {"mcl_banners:banner_item_white"}, digger) + end + -- Remove node + minetest.remove_node(pos) +end + +local on_destruct_banner = function(pos, hanging) + local offset, nodename + if hanging then + offset = hanging_banner_entity_offset + nodename = "mcl_banners:hanging_banner" + else + offset = standing_banner_entity_offset + nodename = "mcl_banners:standing_banner" + end + -- Find this node's banner entity and remove it + local checkpos = vector.add(pos, offset) local objects = minetest.get_objects_inside_radius(checkpos, 0.5) for _, v in ipairs(objects) do - if v:get_entity_name() == "mcl_banners:standing_banner" then - v:get_luaentity():_drop() + local ent = v:get_luaentity() + if ent and ent.name == nodename then + v:remove() end end end +local on_destruct_standing_banner = function(pos) + return on_destruct_banner(pos, false) +end + local on_destruct_hanging_banner = function(pos) - -- Find this node's banner entity and make it drop as an item - local checkpos = vector.add(pos, hanging_banner_entity_offset) - local objects = minetest.get_objects_inside_radius(checkpos, 0.5) - for _, v in ipairs(objects) do - if v:get_entity_name() == "mcl_banners:hanging_banner" then - v:get_luaentity():_drop() - end - end + return on_destruct_banner(pos, true) end local make_banner_texture = function(base_color, layers) @@ -94,6 +131,62 @@ local make_banner_texture = function(base_color, layers) end end +local spawn_banner_entity = function(pos, hanging, itemstack) + local banner + if hanging then + banner = minetest.add_entity(pos, "mcl_banners:hanging_banner") + else + banner = minetest.add_entity(pos, "mcl_banners:standing_banner") + end + if banner == nil then + return banner + end + local imeta = itemstack:get_meta() + local layers_raw = imeta:get_string("layers") + local layers = minetest.deserialize(layers_raw) + local colorid = colors_reverse[itemstack:get_name()] + banner:get_luaentity():_set_textures(colorid, layers) + local mname = imeta:get_string("name") + if mname ~= nil and mname ~= "" then + banner:get_luaentity()._item_name = mname + banner:get_luaentity()._item_description = imeta:get_string("description") + end + + return banner +end + +local respawn_banner_entity = function(pos, node, force) + local hanging = node.name == "mcl_banners:hanging_banner" + local offset + if hanging then + offset = hanging_banner_entity_offset + else + offset = standing_banner_entity_offset + end + -- Check if a banner entity already exists + local bpos = vector.add(pos, offset) + local objects = minetest.get_objects_inside_radius(bpos, 0.5) + for _, v in ipairs(objects) do + local ent = v:get_luaentity() + if ent and (ent.name == "mcl_banners:standing_banner" or ent.name == "mcl_banners:hanging_banner") then + if force then + v:remove() + else + return + end + end + end + -- Spawn new entity + local meta = minetest.get_meta(pos) + local banner_item = meta:get_inventory():get_stack("banner", 1) + local banner_entity = spawn_banner_entity(bpos, hanging, banner_item) + + -- Set rotation + local rotation_level = meta:get_int("rotation_level") + local final_yaw = rotation_level_to_yaw(rotation_level) + banner_entity:set_yaw(final_yaw) +end + -- Banner nodes. -- These are an invisible nodes which are only used to destroy the banner entity. -- All the important banner information (such as color) is stored in the entity. @@ -102,27 +195,54 @@ end -- Standing banner node -- This one is also used for the help entry to avoid spamming the help with 16 entries. minetest.register_node("mcl_banners:standing_banner", { - _doc_items_entry_name = "Banner", + _doc_items_entry_name = S("Banner"), _doc_items_image = "mcl_banners_item_base.png^mcl_banners_item_overlay.png", - _doc_items_longdesc = "Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.", - _doc_items_usagehelp = "Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 6 layers on a banner that way. You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.", + _doc_items_longdesc = S("Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting."), + _doc_items_usagehelp = S("Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.").."\n".. +S("You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer."), walkable = false, is_ground_content = false, paramtype = "light", sunlight_propagates = true, - drawtype = "airlike", + drawtype = "nodebox", + -- Nodebox is drawn as fallback when the entity is missing, so that the + -- banner node is never truly invisible. + -- If the entity is drawn, the nodebox disappears within the real banner mesh. + node_box = { + type = "fixed", + fixed = { -1/32, -0.49, -1/32, 1/32, 1.49, 1/32 }, + }, + -- This texture is based on the banner base texture + tiles = { "mcl_banners_fallback_wood.png" }, + inventory_image = "mcl_banners_item_base.png", wield_image = "mcl_banners_item_base.png", - tiles = { "blank.png" }, + selection_box = {type = "fixed", fixed= {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} }, - groups = {axey=1,handy=1, attached_node = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1, }, + groups = {axey=1,handy=1, attached_node = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1, material_wood=1, dig_by_piston=1, flammable=-1 }, stack_max = 16, sounds = node_sounds, drop = "", -- Item drops are handled in entity code + on_dig = on_dig_banner, on_destruct = on_destruct_standing_banner, + on_punch = function(pos, node) + respawn_banner_entity(pos, node) + end, _mcl_hardness = 1, - _mcl_blast_resistance = 5, + _mcl_blast_resistance = 1, + on_rotate = function(pos, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + local meta = minetest.get_meta(pos) + local rot = meta:get_int("rotation_level") + rot = (rot - 1) % 16 + meta:set_int("rotation_level", rot) + respawn_banner_entity(pos, node, true) + return true + else + return false + end + end, }) -- Hanging banner node @@ -132,19 +252,52 @@ minetest.register_node("mcl_banners:hanging_banner", { paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, - drawtype = "airlike", + drawtype = "nodebox", inventory_image = "mcl_banners_item_base.png", wield_image = "mcl_banners_item_base.png", - tiles = { "blank.png" }, + tiles = { "mcl_banners_fallback_wood.png" }, + node_box = { + type = "wallmounted", + wall_side = { -0.49, 0.41, -0.49, -0.41, 0.49, 0.49 }, + wall_top = { -0.49, 0.41, -0.49, -0.41, 0.49, 0.49 }, + wall_bottom = { -0.49, -0.49, -0.49, -0.41, -0.41, 0.49 }, + }, selection_box = {type = "wallmounted", wall_side = {-0.5, -0.5, -0.5, -4/16, 0.5, 0.5} }, - groups = {axey=1,handy=1, attached_node = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1, }, + groups = {axey=1,handy=1, attached_node = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1, material_wood=1, flammable=-1 }, stack_max = 16, sounds = node_sounds, drop = "", -- Item drops are handled in entity code + on_dig = on_dig_banner, on_destruct = on_destruct_hanging_banner, + on_punch = function(pos, node) + respawn_banner_entity(pos, node) + end, _mcl_hardness = 1, - _mcl_blast_resistance = 5, + _mcl_blast_resistance = 1, + on_rotate = function(pos, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + local r = screwdriver.rotate.wallmounted(pos, node, mode) + node.param2 = r + minetest.swap_node(pos, node) + local meta = minetest.get_meta(pos) + local rot = 0 + if node.param2 == 2 then + rot = 12 + elseif node.param2 == 3 then + rot = 4 + elseif node.param2 == 4 then + rot = 0 + elseif node.param2 == 5 then + rot = 8 + end + meta:set_int("rotation_level", rot) + respawn_banner_entity(pos, node, true) + return true + else + return false + end + end, }) for colorid, colortab in pairs(mcl_banners.colors) do @@ -167,12 +320,13 @@ for colorid, colortab in pairs(mcl_banners.colors) do -- TODO: Combine the items into only 1 item. minetest.register_craftitem(itemstring, { description = desc, + _tt_help = S("Paintable decoration"), _doc_items_create_entry = false, inventory_image = inv, wield_image = inv, -- Banner group groups together the banner items, but not the nodes. -- Used for crafting. - groups = { banner = 1, deco_block = 1, }, + groups = { banner = 1, deco_block = 1, flammable = -1 }, stack_max = 16, on_place = function(itemstack, placer, pointed_thing) @@ -195,6 +349,12 @@ for colorid, colortab in pairs(mcl_banners.colors) do new_node = "mcl_cauldrons:cauldron_1" elseif node_under.name == "mcl_cauldrons:cauldron_1" then new_node = "mcl_cauldrons:cauldron" + elseif node_under.name == "mcl_cauldrons:cauldron_3r" then + new_node = "mcl_cauldrons:cauldron_2r" + elseif node_under.name == "mcl_cauldrons:cauldron_2r" then + new_node = "mcl_cauldrons:cauldron_1r" + elseif node_under.name == "mcl_cauldrons:cauldron_1r" then + new_node = "mcl_cauldrons:cauldron" end if new_node then local imeta = itemstack:get_meta() @@ -204,7 +364,11 @@ for colorid, colortab in pairs(mcl_banners.colors) do table.remove(layers) imeta:set_string("layers", minetest.serialize(layers)) local newdesc = mcl_banners.make_advanced_banner_description(itemstack:get_definition().description, layers) - imeta:set_string("description", newdesc) + local mname = imeta:get_string("name") + -- Don't change description if item has a name + if mname == "" then + imeta:set_string("description", newdesc) + end end -- Washing off reduces the water level by 1. @@ -212,7 +376,7 @@ for colorid, colortab in pairs(mcl_banners.colors) do minetest.set_node(pointed_thing.under, {name=new_node}) -- Play sound (from mcl_potions mod) - minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}) + minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}, true) return itemstack end @@ -235,51 +399,82 @@ for colorid, colortab in pairs(mcl_banners.colors) do end hanging = true end - local place_pos if minetest.registered_nodes[node_under.name].buildable_to then place_pos = under else place_pos = above end - if hanging then - place_pos = vector.add(place_pos, hanging_banner_entity_offset) - else - place_pos = vector.add(place_pos, standing_banner_entity_offset) + local bnode = minetest.get_node(place_pos) + if bnode.name ~= "mcl_banners:standing_banner" and bnode.name ~= "mcl_banners:hanging_banner" then + minetest.log("error", "[mcl_banners] The placed banner node is not what the mod expected!") + return itemstack end + local meta = minetest.get_meta(place_pos) + local inv = meta:get_inventory() + inv:set_size("banner", 1) + local store_stack = ItemStack(itemstack) + store_stack:set_count(1) + inv:set_stack("banner", 1, store_stack) - local banner + -- Spawn entity + local entity_place_pos if hanging then - banner = minetest.add_entity(place_pos, "mcl_banners:hanging_banner") + entity_place_pos = vector.add(place_pos, hanging_banner_entity_offset) else - banner = minetest.add_entity(place_pos, "mcl_banners:standing_banner") + entity_place_pos = vector.add(place_pos, standing_banner_entity_offset) end - local imeta = itemstack:get_meta() - local layers_raw = imeta:get_string("layers") - local layers = minetest.deserialize(layers_raw) - banner:get_luaentity():_set_textures(colorid, layers) - + local banner_entity = spawn_banner_entity(entity_place_pos, hanging, itemstack) -- Set rotation - local final_yaw + local final_yaw, rotation_level if hanging then local pdir = vector.direction(pointed_thing.under, pointed_thing.above) final_yaw = minetest.dir_to_yaw(pdir) + if pdir.x > 0 then + rotation_level = 4 + elseif pdir.z > 0 then + rotation_level = 8 + elseif pdir.x < 0 then + rotation_level = 12 + else + rotation_level = 0 + end else -- Determine the rotation based on player's yaw local yaw = placer:get_look_horizontal() -- Select one of 16 possible rotations (0-15) - local rotation_level = round((yaw / (math.pi*2)) * 16) - final_yaw = (rotation_level * (math.pi/8)) + math.pi + rotation_level = round((yaw / (math.pi*2)) * 16) + if rotation_level >= 16 then + rotation_level = 0 + end + final_yaw = rotation_level_to_yaw(rotation_level) + end + meta:set_int("rotation_level", rotation_level) + + if banner_entity ~= nil then + banner_entity:set_yaw(final_yaw) end - banner:set_yaw(final_yaw) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end - minetest.sound_play({name="default_place_node_hard", gain=1.0}, {pos = place_pos}) + minetest.sound_play({name="default_place_node_hard", gain=1.0}, {pos = place_pos}, true) return itemstack end, + + _mcl_generate_description = function(itemstack) + local meta = itemstack:get_meta() + local layers_raw = meta:get_string("layers") + if not layers_raw then + return nil + end + local layers = minetest.deserialize(layers_raw) + local desc = itemstack:get_definition().description + local newdesc = mcl_banners.make_advanced_banner_description(desc, layers) + meta:set_string("description", newdesc) + return newdesc + end, }) if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_wool") then @@ -296,10 +491,15 @@ for colorid, colortab in pairs(mcl_banners.colors) do if minetest.get_modpath("doc") then -- Add item to node alias doc.add_entry_alias("nodes", "mcl_banners:standing_banner", "craftitems", itemstring) - doc.add_entry_alias("nodes", "mcl_banners:hanging_banner", "craftitems", itemstring) end end +if minetest.get_modpath("doc") then + -- Add item to node alias + doc.add_entry_alias("nodes", "mcl_banners:standing_banner", "nodes", "mcl_banners:hanging_banner") +end + + -- Banner entities. local entity_standing = { physical = false, @@ -308,7 +508,7 @@ local entity_standing = { mesh = "amc_banner.b3d", visual_size = { x=2.499, y=2.499 }, textures = make_banner_texture(), - collisionbox = { 0, 0, 0, 0, 0, 0 }, + pointable = false, _base_color = nil, -- base color of banner _layers = nil, -- table of layers painted over the base color. @@ -317,7 +517,7 @@ local entity_standing = { -- pattern: name of pattern (see list above) get_staticdata = function(self) - local out = { _base_color = self._base_color, _layers = self._layers } + local out = { _base_color = self._base_color, _layers = self._layers, _name = self._name } return minetest.serialize(out) end, on_activate = function(self, staticdata) @@ -325,6 +525,7 @@ local entity_standing = { local inp = minetest.deserialize(staticdata) self._base_color = inp._base_color self._layers = inp._layers + self._name = inp._name self.object:set_properties({ textures = make_banner_texture(self._base_color, self._layers), }) @@ -334,25 +535,6 @@ local entity_standing = { self.object:set_armor_groups({immortal=1}) end, - -- This is a custom function which causes the banner to be dropped as item and destroys the entity. - _drop = function(self) - local pos = self.object:getpos() - pos.y = pos.y + 1 - - if not minetest.settings:get_bool("creative_mode") and self._base_color then - -- Spawn item - local banner = ItemStack("mcl_banners:banner_item_"..mcl_banners.colors[self._base_color][1]) - local meta = banner:get_meta() - meta:set_string("layers", minetest.serialize(self._layers)) - meta:set_string("description", mcl_banners.make_advanced_banner_description(banner:get_definition().description, self._layers)) - - minetest.add_item(pos, banner) - end - - -- Destroy entity - self.object:remove() - end, - -- Set the banner textures. This function can be used by external mods. -- Meaning of parameters: -- * self: Lua entity reference to entity. @@ -373,6 +555,17 @@ local entity_hanging = table.copy(entity_standing) entity_hanging.mesh = "amc_banner_hanging.b3d" minetest.register_entity("mcl_banners:hanging_banner", entity_hanging) +-- FIXME: Prevent entity destruction by /clearobjects +minetest.register_lbm({ + label = "Respawn banner entities", + name = "mcl_banners:respawn_entities", + run_at_every_load = true, + nodenames = {"mcl_banners:standing_banner", "mcl_banners:hanging_banner"}, + action = function(pos, node) + respawn_banner_entity(pos, node) + end, +}) + minetest.register_craft({ type = "fuel", recipe = "group:banner", diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr new file mode 100644 index 00000000..3bf65629 --- /dev/null +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr @@ -0,0 +1,77 @@ +# textdomain: mcl_banners +White Banner=Weißes Banner +White=weiß +Grey Banner=Graues Banner +Grey=grau +Light Grey Banner=Hellgraues Banner +Light Grey=hellgrau +Black Banner=Schwarzes Banner +Black=schwarz +Red Banner=Rotes Banner +Red=rot +Yellow Banner=Gelbes Banner +Yellow=gelb +Green Banner=Grünes Banner +Green=grün +Cyan Banner=Türkises Banner +Cyan=türkis +Blue Banner=Blaues Banner +Blue=blau +Magenta Banner=Magenta Banner +Magenta=magenta +Orange Banner=Orange Banner +Orange=orange +Purple Banner=Violettes Banner +Purple=violett +Brown Banner=Braunes Banner +Brown=braun +Pink Banner=Rosa Banner +Pink=rosa +Lime Banner=Lindgrünes Banner +Lime=lindgrün +Light Blue Banner=Hellblaues Banner +Light Blue=hellblau +Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Banner sind hohe farbige dekorative Blöcke. Sie können auf dem Boden und an Wände platziert werden. Banner können mit einer Vielzahl von Mustern mit Hilfe von Farbstoffen in der Fertigung bemalt werden. +Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Benutzen Sie die Fertigung, um ein Muster auf einem Banner zu malen. Bemalte Banner können erneut bemalt werden, um verschiedene Muster zu ergeben. Sie können bis zu 12 Schichten auf einen Banner malen. Wenn ein Banner einen Farbverlauf hat, sind nur 3 Schichten möglich. +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Sie können ein Muster eines Banners kopieren, indem Sie zwei Banner der selben Grundfarbe in das Fertigungsgitter platzieren: Das eine muss bemalt sein, das andere leer. Außerdem können Sie ein Banner an einem Kessel mit Wasser benutzen, um seine oberste Schicht abzuwaschen. +@1 Bordure=Bord (@1) +@1 Bricks=Ziegel (@1) +@1 Roundel=Kugel (@1) +@1 Creeper Charge=Creeper-Figur (@1) +@1 Saltire=Andreaskreuz (@1) +@1 Bordure Indented=Gewellter Bord (@1) +@1 Per Bend Inverted=Schräglinke umgekehrte Teilung (@1) +@1 Per Bend Sinister Inverted=Schrägrechte umgekehrte Teilung (@1) +@1 Per Bend=Schräglinke Teilung (@1) +@1 Per Bend Sinister=Schrägrechte Teilung (@1) +@1 Flower Charge=Blumenfigur (@1) +@1 Gradient=Farbverlauf (@1) +@1 Base Gradient=Fußfarbverlauf (@1) +@1 Per Fess Inverted=Umgekehrte Teilung (@1) +@1 Per Fess=Teilung (@1) +@1 Per Pale=Spaltung (@1) +@1 Per Pale Inverted=Umgekehrte Spaltung (@1) +@1 Thing Charge=Dingsfigur (@1) +@1 Lozenge=Raute (@1) +@1 Skull Charge=Totenkopffigur (@1) +@1 Paly=Pfähle (@1) +@1 Base Dexter Canton=Rechtes Untereck (@1) +@1 Base Sinister Canton=Linkes Untereck (@1) +@1 Chief Dexter Canton=Rechtes Obereck (@1) +@1 Chief Sinister Canton=Linkes Obereck (@1) +@1 Cross=Kreuz (@1) +@1 Base=Fuß (@1) +@1 Pale=Pfahl (@1) +@1 Bend Sinister=Schräglinksbalken (@1) +@1 Bend=Schrägbalken (@1) +@1 Pale Dexter=Rechte Flanke (@1) +@1 Fess=Balken (@1) +@1 Pale Sinister=Linke Flanke (@1) +@1 Chief=Haupt (@1) +@1 Chevron=Sparren (@1) +@1 Chevron Inverted=Gegensparren (@1) +@1 Base Indented=Gezackter Fuß (@1) +@1 Chief Indented=Gezacktes Haupt (@1) +And one additional layer=Und eine zusätzliche Schicht +And @1 additional layers=Und @1 zusätzliche Schichten +Paintable decoration=Bemalbare Dekoration diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.es.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.es.tr new file mode 100644 index 00000000..1368bc5a --- /dev/null +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.es.tr @@ -0,0 +1,76 @@ +# textdomain: mcl_banners +White Banner=Estandarte blanco +White=Blanco +Grey Banner=Estandarte gris +Grey=Gris +Light Grey Banner=Estandarte gris claro +Light Grey=Gris claro +Black Banner=Estandarte negro +Black=Negro +Red Banner=Estandarte roja +Red=Rojo +Yellow Banner=Estandarte amarilla +Yellow=Amarillo +Green Banner=Estandarte verde +Green=Verde +Cyan Banner=Estandarte cian +Cyan=Cian +Blue Banner=Estandarte azul +Blue=Azul +Magenta Banner=Estandarte magenta +Magenta=Magenta +Orange Banner=Estandarte naranja +Orange=Naranja +Purple Banner=Estandarte morada +Purple=Morado +Brown Banner=Estandarte marrón +Brown=Marrón +Pink Banner=Estandarte rosa +Pink=Rosa +Lime Banner=Estandarte verde lima +Lime=Verde lima +Light Blue Banner=Estandarte azul claro +Light Blue=Azul claro +Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Los estandartes son bloques decorativos altos y coloridos. Se pueden colocar en el suelo y en las paredes. Los estandartes se pueden estampar con una variedad de patrones usando mucho tinte en la elaboración. +Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Usa la elaboración para dibujar un patrón en la parte superior del estandarte. Los estandartes estampados pueden volver a estamparse para combinar varios patrones. Puede dibujar hasta 12 capas en un estandarte de esa manera. Si la pancarta incluye un degradado, solo son posibles 3 capas. +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Puede copiar el patrón de un estandarte colocando dos estandartes del mismo color en la cuadrícula de fabricación: una debe ser estampada, la otra debe estar limpia. Finalmente, puede usar un estandarte en un caldero con agua para lavar su capa superior. +@1 Bordure=Borde (@1) +@1 Bricks=Bloque (@1) +@1 Roundel=Medallón (@1) +@1 Creeper Charge=Carga de enredadera (@1) +@1 Saltire=Saltire (@1) +@1 Bordure Indented=Sangrado del borde (@1) +@1 Per Bend Inverted=Curva invertida (@1) +@1 Per Bend Sinister Inverted=Curva siniestra invertida (@1) +@1 Per Bend=Curva (@1) +@1 Per Bend Sinister=Curva siniestra (@1) +@1 Flower Charge=Carga de la flor (@1) +@1 Gradient=Farbverlauf (@1) +@1 Base Gradient=Zócalo Degradado (@1) +@1 Per Fess Inverted=División invertida (@1) +@1 Per Fess=División (@1) +@1 Per Pale=Palidez (@1) +@1 Per Pale Inverted=Palidez invertida (@1) +@1 Thing Charge=Carga de objeto (@1) +@1 Lozenge=Rombo (@1) +@1 Skull Charge=Carga de calabera (@1) +@1 Paly=Poster (@1) +@1 Base Dexter Canton=Zócalo inferior derecho (@1) +@1 Base Sinister Canton=Zócalo inferior izquierdo (@1) +@1 Chief Dexter Canton=Encabezado superior derecho (@1) +@1 Chief Sinister Canton=Encabezado superior izquierdo (@1) +@1 Cross=Cruce (@1) +@1 Base=Zócalo (@1) +@1 Pale=Palidez (@1) +@1 Bend Sinister=Curva siniestra (@1) +@1 Bend=Curva (@1) +@1 Pale Dexter=Palidez derecho (@1) +@1 Fess=División (@1) +@1 Pale Sinister=Palidez siniestra (@1) +@1 Chief=Encabezado (@1) +@1 Chevron=Viga (@1) +@1 Chevron Inverted=Viga invertida (@1) +@1 Base Indented=Zócalo sangrada (@1) +@1 Chief Indented=Sangrado del encabezado (@1) +And one additional layer=Y una capa adicional +And @1 additional layers=Y @1 capas adicionales diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr new file mode 100644 index 00000000..ee877272 --- /dev/null +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr @@ -0,0 +1,77 @@ +# textdomain: mcl_banners +White Banner=Bannière Blanche +White=Blanc +Grey Banner=Bannière Grise +Grey=Gris +Light Grey Banner=Bannière Gris Clair +Light Grey=Gris Clair +Black Banner=Bannière Noir +Black=Noir +Red Banner=Bannière Rouge +Red=Rouge +Yellow Banner=Bannière Jaune +Yellow=Jaune +Green Banner=Bannière Verte +Green=Vert +Cyan Banner=Bannière Cyan +Cyan=Cyan +Blue Banner=Bannière Bleue +Blue=Blue +Magenta Banner=Bannière Magenta +Magenta=Magenta +Orange Banner=Bannière Orange +Orange=Orange +Purple Banner=Bannière Violette +Violet=Violet +Brown Banner=Bannière Marron +Brown=Marron +Pink Banner=Bannière Rose +Pink=Rose +Lime Banner=Bannière Vert Clair +Lime=Vert Clair +Light Blue Banner=Bannière Bleue Clair +Light Blue=Bleu Clair +Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Les bannières sont de grands blocs décoratifs colorés. Ils peuvent être placés au sol et aux murs. Les bannières peuvent arborées une variété de motifs en utilisant beaucoup de colorant dans l'artisanat. +Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Utilisez l'artisanat pour dessiner un motif sur le dessus de la bannière. Les bannières blasonnées peuvent être à nouveau blasonnées pour combiner différents motifs. Vous pouvez dessiner jusqu'à 12 couches sur une bannière de cette façon. Si la bannière comprend un dégradé, seulement 3 couches sont possibles. +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Vous pouvez copier le motif d'une bannière en plaçant deux bannières de la même couleur dans la grille de fabrication: l'une doit être décorée, l'autre doit être propre. Enfin, vous pouvez utiliser une bannière sur un chaudron avec de l'eau pour laver sa couche la plus haute. +@1 Bordure=Bordure (@1) +@1 Bricks=Blocs (@1) +@1 Roundel=Cocarde (@1) +@1 Creeper Charge=Face de Creeper (@1) +@1 Saltire=Saltire (@1) +@1 Bordure Indented=Bordure en retrait (@1) +@1 Per Bend Inverted=Division inclinée inversé (@1) +@1 Per Bend Sinister Inverted=Division oblique inversé (@1) +@1 Per Bend=Division inclinée (@1) +@1 Per Bend Sinister=Division oblique (@1) +@1 Flower Charge=Figure Fleur (@1) +@1 Gradient=Dégradé (@1) +@1 Base Gradient=Dégradé de couleurs (@1) +@1 Per Fess Inverted=Division inverse (@1) +@1 Per Fess=Division (@1) +@1 Per Pale=Division (@1) +@1 Per Pale Inverted=Division inverse (@1) +@1 Thing Charge=Chose (@ 1) +@1 Lozenge=Rhombus (@1) +@1 Skull Charge=Figure de crâne (@1) +@1 Paly=Pieux (@1) +@1 Base Dexter Canton=Coin inférieur droit (@1) +@1 Base Sinister Canton=Coin inférieur gauche (@1) +@1 Chief Dexter Canton=Coin supérieur droit (@1) +@1 Chief Sinister Canton=Coin supérieur gauche (@1) +@1 Cross=Croix (@1) +@1 Base=Pieds (@1) +@1 Pale=Mise (@1) +@1 Bend Sinister=Barre gauche inclinée (@1) +@1 Bend=Barre inclinée (@1) +@1 Pale Dexter=Flanc droit (@1) +@1 Fess=Bar (@1) +@1 Pale Sinister=Flanc gauche (@1) +@1 Chief=Principal (@1) +@1 Chevron=Chevron (@1) +@1 Chevron Inverted=Contre-chevrons (@1) +@1 Base Indented=Pied dentelé (@1)t +@1 Chief Indented=Tête dentelée (@1) +And one additional layer=Et une couche supplémentaire +And @1 additional layer(s)=Et @1 couche(s) supplémentaire(s) +Paintable decoration=Décoration à peindre diff --git a/mods/ITEMS/mcl_banners/locale/template.txt b/mods/ITEMS/mcl_banners/locale/template.txt new file mode 100644 index 00000000..944a1a7a --- /dev/null +++ b/mods/ITEMS/mcl_banners/locale/template.txt @@ -0,0 +1,77 @@ +# textdomain: mcl_banners +White Banner= +White= +Grey Banner= +Grey= +Light Grey Banner= +Light Grey= +Black Banner= +Black= +Red Banner= +Red= +Yellow Banner= +Yellow= +Green Banner= +Green= +Cyan Banner= +Cyan= +Blue Banner= +Blue= +Magenta Banner= +Magenta= +Orange Banner= +Orange= +Purple Banner= +Violet= +Brown Banner= +Brown= +Pink Banner= +Pink= +Lime Banner= +Lime= +Light Blue Banner= +Light Blue= +Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.= +Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.= +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.= +@1 Bordure= +@1 Bricks= +@1 Roundel= +@1 Creeper Charge= +@1 Saltire= +@1 Bordure Indented= +@1 Per Bend Inverted= +@1 Per Bend Sinister Inverted= +@1 Per Bend= +@1 Per Bend Sinister= +@1 Flower Charge= +@1 Gradient= +@1 Base Gradient= +@1 Per Fess Inverted= +@1 Per Fess= +@1 Per Pale= +@1 Per Pale Inverted= +@1 Thing Charge= +@1 Lozenge= +@1 Skull Charge= +@1 Paly= +@1 Base Dexter Canton= +@1 Base Sinister Canton= +@1 Chief Dexter Canton= +@1 Chief Sinister Canton= +@1 Cross= +@1 Base= +@1 Pale= +@1 Bend Sinister= +@1 Bend= +@1 Pale Dexter= +@1 Fess= +@1 Pale Sinister= +@1 Chief= +@1 Chevron= +@1 Chevron Inverted= +@1 Base Indented= +@1 Chief Indented= +And one additional layer= +And @1 additional layer(s)= +Paintable decoration= diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 9c4339b0..e1f05ff1 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -1,9 +1,15 @@ +local S = minetest.get_translator("mcl_banners") +local N = function(s) return s end + -- Pattern crafting. This file contains the code for crafting all the -- emblazonings you can put on the banners. It's quite complicated; --- normal 08/15 crafting won't work here. +-- run-of-the-mill crafting won't work here. -- Maximum number of layers which can be put on a banner by crafting. -local max_layers_crafting = 6 +local max_layers_crafting = 12 + +-- Maximum number of layers when banner includes a gradient (workaround, see below). +local max_layers_gradient = 3 -- Max. number lines in the descriptions for the banner layers. -- This is done to avoid huge tooltips. @@ -14,99 +20,99 @@ local d = "group:dye" -- dye local e = "" -- empty slot (one of them must contain the banner) local patterns = { ["border"] = { - name = "%s Bordure", + name = N("@1 Bordure"), { d, d, d }, { d, e, d }, { d, d, d }, }, ["bricks"] = { - name = "%s Bricks", + name = N("@1 Bricks"), type = "shapeless", { e, "mcl_core:brick_block", d }, }, ["circle"] = { - name = "%s Roundel", + name = N("@1 Roundel"), { e, e, e }, { e, d, e }, { e, e, e }, }, ["creeper"] = { - name = "%s Creeper Charge", + name = N("@1 Creeper Charge"), type = "shapeless", { e, "mcl_heads:creeper", d }, }, ["cross"] = { - name = "%s Saltire", + name = N("@1 Saltire"), { d, e, d }, { e, d, e }, { d, e, d }, }, ["curly_border"] = { - name = "%s Bordure Indented", + name = N("@1 Bordure Indented"), type = "shapeless", { e, "mcl_core:vine", d }, }, ["diagonal_up_left"] = { - name = "%s Per Bend Inverted", + name = N("@1 Per Bend Inverted"), { e, e, e }, { d, e, e }, { d, d, e }, }, ["diagonal_up_right"] = { - name = "%s Per Bend Sinister Inverted", + name = N("@1 Per Bend Sinister Inverted"), { e, e, e }, { e, e, d }, { e, d, d }, }, ["diagonal_right"] = { - name = "%s Per Bend", + name = N("@1 Per Bend"), { e, d, d }, { e, e, d }, { e, e, e }, }, ["diagonal_left"] = { - name = "%s Per Bend Sinister", + name = N("@1 Per Bend Sinister"), { d, d, e }, { d, e, e }, { e, e, e }, }, ["flower"] = { - name = "%s Flower Charge", + name = N("@1 Flower Charge"), type = "shapeless", { e, "mcl_flowers:oxeye_daisy", d }, }, ["gradient"] = { - name = "%s Gradient", + name = N("@1 Gradient"), { d, e, d }, { e, d, e }, { e, d, e }, }, ["gradient_up"] = { - name = "%s Base Gradient", + name = N("@1 Base Gradient"), { e, d, e }, { e, d, e }, { d, e, d }, }, ["half_horizontal_bottom"] = { - name = "%s Per Fess Inverted", + name = N("@1 Per Fess Inverted"), { e, e, e }, { d, d, d }, { d, d, d }, }, ["half_horizontal"] = { - name = "%s Per Fess", + name = N("@1 Per Fess"), { d, d, d }, { d, d, d }, { e, e, e }, }, ["half_vertical"] = { - name = "%s Per Pale", + name = N("@1 Per Pale"), { d, d, e }, { d, d, e }, { d, d, e }, }, ["half_vertical_right"] = { - name = "%s Per Pale Inverted", + name = N("@1 Per Pale Inverted"), { e, d, d }, { e, d, d }, { e, d, d }, @@ -114,126 +120,126 @@ local patterns = { ["thing"] = { -- Symbol used for the “Thing”: U+1F65D 🙝 - name = "%s Thing Charge", + name = N("@1 Thing Charge"), type = "shapeless", -- TODO: Replace with enchanted golden apple { e, "mcl_core:apple_gold", d }, }, ["rhombus"] = { - name = "%s Lozenge", + name = N("@1 Lozenge"), { e, d, e }, { d, e, d }, { e, d, e }, }, ["skull"] = { - name = "%s Skull Charge", + name = N("@1 Skull Charge"), type = "shapeless", { e, "mcl_heads:wither_skeleton", d }, }, ["small_stripes"] = { - name = "%s Paly", + name = N("@1 Paly"), { d, e, d }, { d, e, d }, { e, e, e }, }, ["square_bottom_left"] = { - name = "%s Base Dexter Canton", + name = N("@1 Base Dexter Canton"), { e, e, e }, { e, e, e }, { d, e, e }, }, ["square_bottom_right"] = { - name = "%s Base Sinister Canton", + name = N("@1 Base Sinister Canton"), { e, e, e }, { e, e, e }, { e, e, d }, }, ["square_top_left"] = { - name = "%s Chief Dexter Canton", + name = N("@1 Chief Dexter Canton"), { d, e, e }, { e, e, e }, { e, e, e }, }, ["square_top_right"] = { - name = "%s Chief Sinister Canton", + name = N("@1 Chief Sinister Canton"), { e, e, d }, { e, e, e }, { e, e, e }, }, ["straight_cross"] = { - name = "%s Cross", + name = N("@1 Cross"), { e, d, e }, { d, d, d }, { e, d, e }, }, ["stripe_bottom"] = { - name = "%s Base", + name = N("@1 Base"), { e, e, e }, { e, e, e }, { d, d, d }, }, ["stripe_center"] = { - name = "%s Pale", + name = N("@1 Pale"), { e, d, e }, { e, d, e }, { e, d, e }, }, ["stripe_downleft"] = { - name = "%s Bend Sinister", + name = N("@1 Bend Sinister"), { e, e, d }, { e, d, e }, { d, e, e }, }, ["stripe_downright"] = { - name = "%s Bend", + name = N("@1 Bend"), { d, e, e }, { e, d, e }, { e, e, d }, }, ["stripe_left"] = { - name = "%s Pale Dexter", + name = N("@1 Pale Dexter"), { d, e, e }, { d, e, e }, { d, e, e }, }, ["stripe_middle"] = { - name = "%s Fess", + name = N("@1 Fess"), { e, e, e }, { d, d, d }, { e, e, e }, }, ["stripe_right"] = { - name = "%s Pale Sinister", + name = N("@1 Pale Sinister"), { e, e, d }, { e, e, d }, { e, e, d }, }, ["stripe_top"] = { - name = "%s Chief", + name = N("@1 Chief"), { d, d, d }, { e, e, e }, { e, e, e }, }, ["triangle_bottom"] = { - name = "%s Chevron", + name = N("@1 Chevron"), { e, e, e }, { e, d, e }, { d, e, d }, }, ["triangle_top"] = { - name = "%s Chevron Inverted", + name = N("@1 Chevron Inverted"), { d, e, d }, { e, d, e }, { e, e, e }, }, ["triangles_bottom"] = { - name = "%s Base Indented", + name = N("@1 Base Indented"), { e, e, e }, { d, e, d }, { e, d, e }, }, ["triangles_top"] = { - name = "%s Chief Indented", + name = N("@1 Chief Indented"), { e, d, e }, { d, e, d }, { e, e, e }, @@ -262,19 +268,20 @@ mcl_banners.make_advanced_banner_description = function(description, layers) -- Layer text line. local color = mcl_banners.colors[layers[l].color][6] local pattern_name = patterns[layers[l].pattern].name - -- The pattern name is a format string (e.g. “%s Base”) - table.insert(layerstrings, string.format(pattern_name, color)) + -- The pattern name is a format string + -- (e.g. “@1 Base” → “Yellow Base”) + table.insert(layerstrings, S(pattern_name, S(color))) end -- Warn about missing information if #layers == max_layer_lines + 1 then - table.insert(layerstrings, "And one addional layer") + table.insert(layerstrings, S("And one additional layer")) elseif #layers > max_layer_lines + 1 then - table.insert(layerstrings, string.format("And %d addional layers", #layers - max_layer_lines)) + table.insert(layerstrings, S("And @1 additional layers", #layers - max_layer_lines)) end -- Final string concatenations: Just a list of strings local append = table.concat(layerstrings, "\n") - description = description .. "\n" .. core.colorize("#8F8F8F", append) + description = description .. "\n" .. minetest.colorize("#8F8F8F", append) return description end end @@ -339,16 +346,18 @@ local banner_pattern_craft = function(itemstack, player, old_craft_grid, craft_i -- For copying to be allowed, one banner has to have no layers while the other one has at least 1 layer. -- The banner with layers will be used as a source. - local src_banner, src_layers, src_desc, src_index + local src_banner, src_layers, src_layers_raw, src_desc, src_index if #b1layers == 0 and #b2layers > 0 then src_banner = banner2 + src_layers = b2layers src_layers_raw = b2layers_raw - src_desc = b2meta:get_string("description") + src_desc = minetest.registered_items[src_banner:get_name()].description src_index = banner2_index elseif #b2layers == 0 and #b1layers > 0 then src_banner = banner + src_layers = b1layers src_layers_raw = b1layers_raw - src_desc = b1meta:get_string("description") + src_desc = minetest.registered_items[src_banner:get_name()].description src_index = banner_index else return ItemStack("") @@ -357,7 +366,8 @@ local banner_pattern_craft = function(itemstack, player, old_craft_grid, craft_i -- Set output metadata local imeta = itemstack:get_meta() imeta:set_string("layers", src_layers_raw) - imeta:set_string("description", src_desc) + -- Generate new description. This clears any (anvil) name from the original banners. + imeta:set_string("description", mcl_banners.make_advanced_banner_description(src_desc, src_layers)) if not craft_predict then -- Don't destroy source banner so this recipe is a true copy @@ -383,6 +393,16 @@ local banner_pattern_craft = function(itemstack, player, old_craft_grid, craft_i if #layers >= max_layers_crafting then return ItemStack("") end + -- Lower layer limit when banner includes any gradient. + -- Workaround to circumvent Minetest bug (https://github.com/minetest/minetest/issues/6210) + -- TODO: Remove this restriction when bug #6210 is fixed. + if #layers >= max_layers_gradient then + for l=1, #layers do + if layers[l].pattern == "gradient" or layers[l].pattern == "gradient_up" then + return ItemStack("") + end + end + end local matching_pattern local max_i = player:get_inventory():get_size("craft") @@ -461,9 +481,16 @@ local banner_pattern_craft = function(itemstack, player, old_craft_grid, craft_i local imeta = itemstack:get_meta() imeta:set_string("layers", minetest.serialize(layers)) - local odesc = itemstack:get_definition().description - local description = mcl_banners.make_advanced_banner_description(odesc, layers) - imeta:set_string("description", description) + local mname = ometa:get_string("name") + -- Only change description if banner does not have a name + if mname == "" then + local odesc = itemstack:get_definition().description + local description = mcl_banners.make_advanced_banner_description(odesc, layers) + imeta:set_string("description", description) + else + imeta:set_string("description", ometa:get_string("description")) + imeta:set_string("name", mname) + end return itemstack end diff --git a/mods/ITEMS/mcl_banners/textures/mcl_banners_fallback_wood.png b/mods/ITEMS/mcl_banners/textures/mcl_banners_fallback_wood.png new file mode 100644 index 00000000..4960f4fc Binary files /dev/null and b/mods/ITEMS/mcl_banners/textures/mcl_banners_fallback_wood.png differ diff --git a/mods/ITEMS/mcl_banners/textures/mcl_banners_triangle_top.png b/mods/ITEMS/mcl_banners/textures/mcl_banners_triangle_top.png index 7f626c26..1c72d742 100644 Binary files a/mods/ITEMS/mcl_banners/textures/mcl_banners_triangle_top.png and b/mods/ITEMS/mcl_banners/textures/mcl_banners_triangle_top.png differ diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 958c983d..7f11cf96 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -1,15 +1,14 @@ +local S = minetest.get_translator("mcl_beds") local reverse = true -local function destruct_bed(pos, n) +local function destruct_bed(pos, is_top) local node = minetest.get_node(pos) local other - - if n == 2 then - local dir = minetest.facedir_to_dir(node.param2) + local dir = minetest.facedir_to_dir(node.param2) + if is_top then other = vector.subtract(pos, dir) - elseif n == 1 then - local dir = minetest.facedir_to_dir(node.param2) + else other = vector.add(pos, dir) end @@ -22,22 +21,36 @@ local function destruct_bed(pos, n) end end -local beddesc = "Beds allow you to sleep at night and waste some time. Survival in this world does not demand sleep, but sleeping might have some other uses. " -local beduse = "Right-click on the bed to try to sleep in it. This only works when the sun sets or at night." +local function kick_player_after_destruct(destruct_pos) + for name, player_bed_pos in pairs(mcl_beds.bed_pos) do + if vector.distance(destruct_pos, player_bed_pos) < 0.1 then + local player = minetest.get_player_by_name(name) + if player and player:is_player() then + mcl_beds.kick_player(player) + break + end + end + end +end + +local beddesc = S("Beds allow you to sleep at night and make the time pass faster.") +local beduse = S("To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.") if minetest.settings:get_bool("enable_bed_respawn") == false then - beddesc = beddesc .. "In local folklore, legends are told of other worlds where setting the start point for your next would be possible. But this world is not one of them. " + beddesc = beddesc .. "\n" .. S("You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.") else - beddesc = beddesc .. "By sleeping in a bed, you set the starting point for your next life. " + beddesc = beddesc .. "\n" .. S("By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.") end if minetest.settings:get_bool("enable_bed_night_skip") == false then - beddesc = beddesc .. "In this strange world, the time will not pass faster for you when you sleep." + beddesc = beddesc .. "\n" .. S("In this world, going to bed won't skip the night, but it will skip thunderstorms.") else - beddesc = beddesc .. "Going into bed seems to make time pass faster: The night will be skipped when you go sleep and you're alone in this world. If you're not alone, the night is skipped when all players in this world went to sleep." + beddesc = beddesc .. "\n" .. S("Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.") end local default_sounds if minetest.get_modpath("mcl_sounds") then - default_sounds = mcl_sounds.node_sound_wood_defaults() + default_sounds = mcl_sounds.node_sound_wood_defaults({ + footstep = { gain = 0.5, name = "mcl_sounds_cloth" }, + }) end function mcl_beds.register_bed(name, def) @@ -53,18 +66,20 @@ function mcl_beds.register_bed(name, def) end minetest.register_node(name .. "_bottom", { description = def.description, + _tt_help = S("Allows you to sleep"), _doc_items_longdesc = def._doc_items_longdesc or beddesc, _doc_items_usagehelp = def._doc_items_usagehelp or beduse, + _doc_items_create_entry = def._doc_items_create_entry, + _doc_items_entry_name = def._doc_items_entry_name, inventory_image = def.inventory_image, wield_image = def.wield_image, drawtype = "nodebox", tiles = def.tiles.bottom, paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", is_ground_content = false, stack_max = 1, - groups = {handy=1, flammable = 3, bed = 1, dig_by_piston=1, bouncy=66, fall_damage_add_percent=-50}, + groups = {handy=1, flammable = 3, bed = 1, dig_by_piston=1, bouncy=66, fall_damage_add_percent=-50, deco_block = 1, flammable=-1}, _mcl_hardness = 0.2, _mcl_blast_resistance = 1, sounds = def.sounds or default_sounds, @@ -125,11 +140,12 @@ function mcl_beds.register_bed(name, def) end, on_destruct = function(pos) - destruct_bed(pos, 1) + destruct_bed(pos, false) + kick_player_after_destruct(pos) end, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - mcl_beds.on_rightclick(pos, clicker) + mcl_beds.on_rightclick(pos, clicker, false) return itemstack end, @@ -183,10 +199,9 @@ function mcl_beds.register_bed(name, def) tiles = def.tiles.top, paramtype = "light", paramtype2 = "facedir", - sunlight_propagates = true, is_ground_content = false, -- FIXME: Should be bouncy=66, but this would be a higher bounciness than slime blocks! - groups = {handy = 1, flammable = 3, bed = 2, dig_by_piston=1, bouncy=33, fall_damage_add_percent=-50}, + groups = {handy = 1, flammable = 3, bed = 2, dig_by_piston=1, bouncy=33, fall_damage_add_percent=-50, not_in_creative_inventory = 1}, _mcl_hardness = 0.2, _mcl_blast_resistance = 1, sounds = def.sounds or default_sounds, @@ -195,12 +210,13 @@ function mcl_beds.register_bed(name, def) selection_box = selection_box_top, collision_box = collision_box_top, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - mcl_beds.on_rightclick(pos, clicker) + mcl_beds.on_rightclick(pos, clicker, true) return itemstack end, on_rotate = false, on_destruct = function(pos) - destruct_bed(pos, 2) + destruct_bed(pos, true) + kick_player_after_destruct(pos) end, }) @@ -215,3 +231,5 @@ function mcl_beds.register_bed(name, def) doc.add_entry_alias("nodes", name.."_bottom", "nodes", name.."_top") end + + diff --git a/mods/ITEMS/mcl_beds/beds.lua b/mods/ITEMS/mcl_beds/beds.lua index 40deac70..8f41c7a3 100644 --- a/mods/ITEMS/mcl_beds/beds.lua +++ b/mods/ITEMS/mcl_beds/beds.lua @@ -1,4 +1,5 @@ --- 3D bed +local S = minetest.get_translator("mcl_beds") +local mod_doc = minetest.get_modpath("doc") local nodebox = { bottom = { @@ -15,26 +16,28 @@ local nodebox = { local colors = { -- { ID, decription, wool, dye } - { "red", "Red Bed", "mcl_wool:red", "mcl_dye:red" }, - { "blue", "Blue Bed", "mcl_wool:blue", "mcl_dye:blue" }, - { "cyan", "Cyan Bed", "mcl_wool:cyan", "mcl_dye:cyan" }, - { "grey", "Grey Bed", "mcl_wool:grey", "mcl_dye:dark_grey" }, - { "silver", "Light Grey Bed", "mcl_wool:silver", "mcl_dye:grey" }, - { "black", "Black Bed", "mcl_wool:black", "mcl_dye:black" }, - { "yellow", "Yellow Bed", "mcl_wool:yellow", "mcl_dye:yellow" }, - { "green", "Green Bed", "mcl_wool:green", "mcl_dye:dark_green" }, - { "magenta", "Magenta Bed", "mcl_wool:magenta", "mcl_dye:magenta" }, - { "orange", "Orange Bed", "mcl_wool:orange", "mcl_dye:orange" }, - { "purple", "Purple Bed", "mcl_wool:purple", "mcl_dye:violet" }, - { "brown", "Brown Bed", "mcl_wool:brown", "mcl_dye:brown" }, - { "pink", "Pink Bed", "mcl_wool:pink", "mcl_dye:pink" }, - { "lime", "Lime Bed", "mcl_wool:lime", "mcl_dye:green" }, - { "light_blue", "Light Blue Bed", "mcl_wool:light_blue", "mcl_dye:lightblue" }, - { "white", "White Bed", "mcl_wool:white", "mcl_dye:white" }, + { "red", S("Red Bed"), "mcl_wool:red", "mcl_dye:red" }, + { "blue", S("Blue Bed"), "mcl_wool:blue", "mcl_dye:blue" }, + { "cyan", S("Cyan Bed"), "mcl_wool:cyan", "mcl_dye:cyan" }, + { "grey", S("Grey Bed"), "mcl_wool:grey", "mcl_dye:dark_grey" }, + { "silver", S("Light Grey Bed"), "mcl_wool:silver", "mcl_dye:grey" }, + { "black", S("Black Bed"), "mcl_wool:black", "mcl_dye:black" }, + { "yellow", S("Yellow Bed"), "mcl_wool:yellow", "mcl_dye:yellow" }, + { "green", S("Green Bed"), "mcl_wool:green", "mcl_dye:dark_green" }, + { "magenta", S("Magenta Bed"), "mcl_wool:magenta", "mcl_dye:magenta" }, + { "orange", S("Orange Bed"), "mcl_wool:orange", "mcl_dye:orange" }, + { "purple", S("Purple Bed"), "mcl_wool:purple", "mcl_dye:violet" }, + { "brown", S("Brown Bed"), "mcl_wool:brown", "mcl_dye:brown" }, + { "pink", S("Pink Bed"), "mcl_wool:pink", "mcl_dye:pink" }, + { "lime", S("Lime Bed"), "mcl_wool:lime", "mcl_dye:green" }, + { "light_blue", S("Light Blue Bed"), "mcl_wool:light_blue", "mcl_dye:lightblue" }, + { "white", S("White Bed"), "mcl_wool:white", "mcl_dye:white" }, } +local canonical_color = "red" for c=1, #colors do local colorid = colors[c][1] + local is_canonical = colorid == canonical_color -- Recoloring recipe for white bed if minetest.get_modpath("mcl_dye") then @@ -54,9 +57,19 @@ for c=1, #colors do } end + local entry_name, create_entry + if mod_doc then + if is_canonical then + entry_name = S("Bed") + else + create_entry = false + end + end -- Register bed mcl_beds.register_bed("mcl_beds:bed_"..colorid, { description = colors[c][2], + _doc_items_entry_name = entry_name, + _doc_items_create_entry = create_entry, inventory_image = "mcl_beds_bed_"..colorid..".png", wield_image = "mcl_beds_bed_"..colorid..".png", tiles = { @@ -89,6 +102,10 @@ for c=1, #colors do }, recipe = main_recipe, }) + if mod_doc and not is_canonical then + doc.add_entry_alias("nodes", "mcl_beds:bed_"..canonical_color.."_bottom", "nodes", "mcl_beds:bed_"..colorid.."_bottom") + doc.add_entry_alias("nodes", "mcl_beds:bed_"..canonical_color.."_bottom", "nodes", "mcl_beds:bed_"..colorid.."_top") + end end diff --git a/mods/ITEMS/mcl_beds/depends.txt b/mods/ITEMS/mcl_beds/depends.txt index 53f5b7c5..c7c874fd 100644 --- a/mods/ITEMS/mcl_beds/depends.txt +++ b/mods/ITEMS/mcl_beds/depends.txt @@ -1,3 +1,9 @@ +playerphysics mcl_sounds? +mcl_worlds? mcl_wool? mcl_dye? +mcl_explosions? +mcl_weather? +mcl_spawn? +doc? diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index cbb2c3c0..d73154ee 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -1,10 +1,11 @@ +local S = minetest.get_translator("mcl_beds") +local F = minetest.formspec_escape + local pi = math.pi local player_in_bed = 0 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 +local weather_mod = minetest.get_modpath("mcl_weather") ~= nil +local explosions_mod = minetest.get_modpath("mcl_explosions") ~= nil -- Helper functions @@ -45,12 +46,66 @@ local function check_in_beds(players) return #players > 0 end +-- These monsters do not prevent sleep +local monster_exceptions = { + ["mobs_mc:ghast"] = true, + ["mobs_mc:enderdragon"] = true, + ["mobs_mc:killer_bunny"] = true, + ["mobs_mc:slime_big"] = true, + ["mobs_mc:slime_small"] = true, + ["mobs_mc:slime_tiny"] = true, + ["mobs_mc:magma_cube_big"] = true, + ["mobs_mc:magma_cube_small"] = true, + ["mobs_mc:magma_cube_tiny"] = true, + ["mobs_mc:shulker"] = true, +} + 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 + return false + end + + if bed_pos then + -- No sleeping if too far away + if vector.distance(bed_pos, pos) > 2 then + minetest.chat_send_player(name, S("You can't sleep, the bed's too far away!")) + return false + end + + for _, other_pos in pairs(mcl_beds.bed_pos) 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 + + -- No sleeping while moving. Slightly different behaviour than in MC. + if vector.length(player:get_player_velocity()) > 0.001 then + minetest.chat_send_player(name, S("You have to stop moving before going to bed!")) + return false + end + + -- No sleeping if monsters nearby. + -- The exceptions above apply. + -- Zombie pigmen only prevent sleep while they are hostle. + local objs = minetest.get_objects_inside_radius(bed_pos, 8) + for _, obj in ipairs(objs) do + if obj ~= nil and not obj:is_player() then + local ent = obj:get_luaentity() + local mobname = ent.name + local def = minetest.registered_entities[mobname] + -- Approximation of monster detection range + if def._cmi_is_mob and ((mobname ~= "mobs_mc:pigman" and def.type == "monster" and not monster_exceptions[mobname]) or (mobname == "mobs_mc:pigman" and ent.state == "attack")) then + if math.abs(bed_pos.y - obj:get_pos().y) <= 5 then + minetest.chat_send_player(name, S("You can't sleep now, monsters are nearby!")) + end + return false + end + end + end end -- stand up @@ -62,58 +117,130 @@ local function lay_down(player, pos, bed_pos, state, skip) end -- skip here to prevent sending player specific changes (used for leaving players) if skip then - return + return false end if p then - player:setpos(p) + player:set_pos(p) end -- physics, eye_offset, etc 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) + if player:get_look_vertical() > 0 then + player:set_look_vertical(0) + end mcl_player.player_attached[name] = false - player:set_physics_override(1, 1, 1) - player:set_attribute("mcl_beds:sleeping", "false") + playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping") + playerphysics.remove_physics_factor(player, "jump", "mcl_beds:sleeping") + player:get_meta():set_string("mcl_beds:sleeping", "false") hud_flags.wielditem = true mcl_player.player_set_animation(player, "stand" , 30) + mcl_beds.pos[name] = nil + mcl_beds.bed_pos[name] = nil -- lay down else + local yaw, param2 = get_look_yaw(bed_pos) + local dir = minetest.facedir_to_dir(param2) + local p = {x = bed_pos.x - dir.x/2, y = bed_pos.y, z = bed_pos.z - dir.z/2} + local n1 = minetest.get_node({x=bed_pos.x, y=bed_pos.y+1, z=bed_pos.z}) + local n2 = minetest.get_node({x=bed_pos.x, y=bed_pos.y+2, z=bed_pos.z}) + local def1 = minetest.registered_nodes[n1.name] + local def2 = minetest.registered_nodes[n2.name] + if def1.walkable or def2.walkable then + minetest.chat_send_player(name, S("You can't sleep, the bed is obstructed!")) + return false + elseif (def1.damage_per_second ~= nil and def1.damage_per_second > 0) or (def2.damage_per_second ~= nil and def2.damage_per_second > 0) then + minetest.chat_send_player(name, S("It's too dangerous to sleep here!")) + return false + end + + local spawn_changed = false + if minetest.get_modpath("mcl_spawn") then + local spos = table.copy(bed_pos) + spos.y = spos.y + 0.1 + spawn_changed = mcl_spawn.set_spawn_pos(player, spos) -- save respawn position when entering bed + end + + -- Check day of time and weather + local tod = minetest.get_timeofday() * 24000 + -- Values taken from Minecraft Wiki with offset of +6000 + if tod < 18541 and tod > 5458 and (not weather_mod or (mcl_weather.get_weather() ~= "thunder")) then + if spawn_changed then + minetest.chat_send_player(name, S("New respawn position set! But you can only sleep at night or during a thunderstorm.")) + else + minetest.chat_send_player(name, S("You can only sleep at night or during a thunderstorm.")) + end + return false + end + if spawn_changed then + minetest.chat_send_player(name, S("New respawn position set!")) + end + mcl_beds.player[name] = 1 mcl_beds.pos[name] = pos + mcl_beds.bed_pos[name] = bed_pos player_in_bed = player_in_bed + 1 - -- physics, eye_offset, etc player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0}) - local yaw, param2 = get_look_yaw(bed_pos) player:set_look_horizontal(yaw) - local dir = minetest.facedir_to_dir(param2) - local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} - -- Set player attribute so other mods know they should not touch set_physics_override - player:set_attribute("mcl_beds:sleeping", "true") - player:set_physics_override(0, 0, 0) - player:setpos(p) + player:set_look_vertical(-(math.pi/2)) + + player:get_meta():set_string("mcl_beds:sleeping", "true") + playerphysics.add_physics_factor(player, "speed", "mcl_beds:sleeping", 0) + playerphysics.add_physics_factor(player, "jump", "mcl_beds:sleeping", 0) + player:set_pos(p) mcl_player.player_attached[name] = true hud_flags.wielditem = false mcl_player.player_set_animation(player, "lay" , 0) end player:hud_set_flags(hud_flags) + return true end local function update_formspecs(finished) local ges = #minetest.get_connected_players() - local form_n + local form_n = "size[6,5;true]" local all_in_bed = ges == player_in_bed + local night_skip = is_night_skip_enabled() + local button_leave = "button_exit[1,3;4,0.75;leave;"..F(S("Leave bed")).."]" + local button_abort = "button_exit[1,3;4,0.75;leave;"..F(S("Abort sleep")).."]" + local bg_presleep = "bgcolor[#00000080;true]" + local bg_sleep = "bgcolor[#000000FF;true]" if finished then - form_n = mcl_beds.formspec .. "label[2.7,11; Good morning.]" - else - form_n = mcl_beds.formspec .. "label[2.2,11;" .. tostring(player_in_bed) .. - " of " .. tostring(ges) .. " players are in bed]" - if all_in_bed and is_night_skip_enabled() then - form_n = form_n .. "button_exit[2,8;4,0.75;force;Force night skip]" + for name,_ in pairs(mcl_beds.player) do + minetest.close_formspec(name, "mcl_beds_form") end + return + elseif not is_sp then + local text = S("Players in bed: @1/@2", player_in_bed, ges) + if not night_skip then + text = text .. "\n" .. S("Note: Night skip is disabled.") + form_n = form_n .. bg_presleep + form_n = form_n .. button_leave + elseif all_in_bed then + text = text .. "\n" .. S("You're sleeping.") + form_n = form_n .. bg_sleep + form_n = form_n .. button_abort + else + text = text .. "\n" .. S("You will fall asleep when all players are in bed.") + form_n = form_n .. bg_presleep + form_n = form_n .. button_leave + end + form_n = form_n .. "label[1,1;"..F(text).."]" + else + local text + if night_skip then + text = S("You're sleeping.") + form_n = form_n .. bg_sleep + form_n = form_n .. button_abort + else + text = S("You're in bed.") .. "\n" .. S("Note: Night skip is disabled.") + form_n = form_n .. bg_presleep + form_n = form_n .. button_leave + end + form_n = form_n .. "label[1,1;"..F(text).."]" end for name,_ in pairs(mcl_beds.player) do @@ -121,55 +248,97 @@ local function update_formspecs(finished) end end - -- Public functions +-- Handle environment stuff related to sleeping: skip night and thunderstorm +function mcl_beds.sleep() + local storm_skipped = mcl_beds.skip_thunderstorm() + -- Always clear weather + if weather_mod then + mcl_weather.change_weather("none") + end + if is_night_skip_enabled() then + if not storm_skipped then + mcl_beds.skip_night() + end + mcl_beds.kick_players() + end +end + +-- Throw all players out of bed function mcl_beds.kick_players() for name, _ in pairs(mcl_beds.player) do local player = minetest.get_player_by_name(name) lay_down(player, nil, nil, false) end + update_formspecs(false) +end + +-- Throw a player out of bed +function mcl_beds.kick_player(player) + local name = player:get_player_name() + if mcl_beds.player[name] ~= nil then + lay_down(player, nil, nil, false) + update_formspecs(false) + minetest.close_formspec(name, "mcl_beds_form") + end end function mcl_beds.skip_night() minetest.set_timeofday(0.25) -- tod = 6000 end -function mcl_beds.on_rightclick(pos, player) - local name = player:get_player_name() - local ppos = player:getpos() - local tod = minetest.get_timeofday() * 24000 +function mcl_beds.skip_thunderstorm() + -- Skip thunderstorm + if weather_mod and mcl_weather.get_weather() == "thunder" then + -- Sleep for a half day (=minimum thunderstorm duration) + minetest.set_timeofday((minetest.get_timeofday() + 0.5) % 1) + return true + end + return false +end - -- Values taken from Minecraft Wiki with offset of +6000 - if tod < 18541 and tod > 5458 then - if mcl_beds.player[name] then - lay_down(player, nil, nil, false) - end - minetest.chat_send_player(name, "You can only sleep at night.") +function mcl_beds.on_rightclick(pos, player, is_top) + -- Anti-Inception: Don't allow to sleep while you're sleeping + if player:get_meta():get_string("mcl_beds:sleeping") == "true" then return end + if minetest.get_modpath("mcl_worlds") then + local dim = mcl_worlds.pos_to_dimension(pos) + if dim == "nether" or dim == "end" then + -- Bed goes BOOM in the Nether or End. + minetest.remove_node(pos) + if explosions_mod then + mcl_explosions.explode(pos, 5, {drop_chance = 1.0, fire = true}) + end + return + end + end + local name = player:get_player_name() + local ppos = player:get_pos() -- move to bed if not mcl_beds.player[name] then - lay_down(player, ppos, pos) - player:set_attribute("mcl_beds:spawn", minetest.pos_to_string(player:getpos())) -- save respawn position when entering bed + if is_top then + lay_down(player, ppos, pos) + else + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + local other = vector.add(pos, dir) + lay_down(player, ppos, other) + end else lay_down(player, nil, nil, false) end - if not is_sp then - update_formspecs(false) - end + update_formspecs(false) -- skip the night and let all players stand up if check_in_beds() then - minetest.after(2, function() - if not is_sp then + minetest.after(5, function() + if check_in_beds() then update_formspecs(is_night_skip_enabled()) - end - if is_night_skip_enabled() then - mcl_beds.skip_night() - mcl_beds.kick_players() + mcl_beds.sleep() end end) end @@ -177,31 +346,30 @@ end -- Callbacks --- Only register respawn callback if respawn enabled -if enable_respawn then - -- respawn player at bed if enabled and valid position is found - minetest.register_on_respawnplayer(function(player) - local pos = minetest.string_to_pos(player:get_attribute("mcl_beds:spawn")) - if pos then - player:setpos(pos) - return true - end - end) -end +minetest.register_on_joinplayer(function(player) + local meta = player:get_meta() + if meta:get_string("mcl_beds:sleeping") == "true" then + -- Make player awake on joining server + meta:set_string("mcl_beds:sleeping", "false") + end + playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping") + playerphysics.remove_physics_factor(player, "jump", "mcl_beds:sleeping") + update_formspecs(false) +end) minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() lay_down(player, nil, nil, false, true) mcl_beds.player[name] = nil if check_in_beds() then - minetest.after(2, function() - update_formspecs(is_night_skip_enabled()) - if is_night_skip_enabled() then - mcl_beds.skip_night() - mcl_beds.kick_players() + minetest.after(5, function() + if check_in_beds() then + update_formspecs(is_night_skip_enabled()) + mcl_beds.sleep() end end) end + update_formspecs(false) end) minetest.register_on_player_receive_fields(function(player, formname, fields) @@ -215,9 +383,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.force then update_formspecs(is_night_skip_enabled()) - if is_night_skip_enabled() then - mcl_beds.skip_night() - mcl_beds.kick_players() - end + mcl_beds.sleep() + end +end) + +minetest.register_on_player_hpchange(function(player, hp_change) + if hp_change < 0 then + mcl_beds.kick_player(player) end end) diff --git a/mods/ITEMS/mcl_beds/init.lua b/mods/ITEMS/mcl_beds/init.lua index 72bfb347..4c25b539 100644 --- a/mods/ITEMS/mcl_beds/init.lua +++ b/mods/ITEMS/mcl_beds/init.lua @@ -1,10 +1,7 @@ mcl_beds = {} mcl_beds.player = {} mcl_beds.pos = {} - -mcl_beds.formspec = "size[8,15;true]" .. - "bgcolor[#080808BB; true]" .. - "button_exit[2,12;4,0.75;leave;Leave Bed]" +mcl_beds.bed_pos = {} local modpath = minetest.get_modpath("mcl_beds") diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr new file mode 100644 index 00000000..16592115 --- /dev/null +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -0,0 +1,41 @@ +# textdomain: mcl_beds +Beds allow you to sleep at night and make the time pass faster.=Mit Betten können Sie in der Nacht schlafen und die Zeit schneller verstreichen lassen. +To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Um ein Bett zu benutzen, stellen Sie sich direkt davor und rechtsklicken Sie darauf, um darin zu schlafen. Schlafen funktioniert nur, wenn die Sonne untergeht, in der Nacht oder während eines Gewittersturms. Das Bett muss außerdem fern von Gefahren sein. +You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Sie hörten von anderen Welten, in denen ein Bett den Startpunkt für Ihr nächstes Leben setzen würde. Aber diese Welt ist keine solche. +By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Indem Sie ein Bett benutzen, setzen Sie den Startpunkt Ihres nächsten Lebens. Wenn Sie sterben, werden Sie Ihr nächstes Leben auf diesem Bett beginnen, es sei denn, es ist blockiert oder zerstört. +In this world, going to bed won't skip the night, but it will skip thunderstorms.=In dieser Welt können mit dem Bett Nächte nicht übersprungen werden, nur Gewitterstürme. +Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Mit Schlaf können Sie die Nacht überspringen. Die Nacht wird übersprungen, wenn alle Spieler in dieser Welt sich schlafen gelegt haben. Die Nacht wird dann nach ein paar Sekunden übersprungen. Gewitterstürme werden auf die gleiche Weise übersprungen. +Bed=Bett +Red Bed=Rotes Bett +Blue Bed=Blaues Bett +Cyan Bed=Türkises Bett +Grey Bed=Graues Bett +Light Grey Bed=Hellgraues Bett +Black Bed=Schwarzes Bett +Yellow Bed=Gelbes Bett +Green Bed=Grünes Bett +Magenta Bed=Magenta Bett +Orange Bed=Orange Bett +Purple Bed=Violettes Bett +Brown Bed=Braunes Bett +Pink Bed=Rosa Bett +Lime Bed=Lindgrünes Bett +Light Blue Bed=Hellblaues Bett +White Bed=Weißes Bett +You can't sleep, the bed's too far away!=Sie können nicht schlafen, das Bett ist zu weit weg! +This bed is already occupied!=Dieses Bett ist schon belegt! +You have to stop moving before going to bed!=Sie müssen anhalten, bevor Sie zu Bett gehen! +You can't sleep now, monsters are nearby!=Sie können jetzt nicht schlafen, Monster sind in der Nähe! +You can't sleep, the bed is obstructed!=Sie können nicht schlafen, das Bett ist blockiert! +It's too dangerous to sleep here!=Es ist zu gefährlich, hier zu schlafen! +New respawn position set! But you can only sleep at night or during a thunderstorm.=Neue Wiedereinstiegsposition gesetzt! Aber Sie können nur nachts oder während eines Gewittersturms schlafen. +You can only sleep at night or during a thunderstorm.=Sie können nur nachts oder während eines Gewittersturms schlafen. +New respawn position set!=Neue Wiedereinstiegsposition gesetzt! +Leave bed=Bett verlassen +Abort sleep=Schlaf abbrechen +Players in bed: @1/@2=Spieler im Bett: @1/@2 +Note: Night skip is disabled.=Anmerkung: Überspringen der Nacht deaktiviert. +You're sleeping.=Sie schlafen. +You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn alle Spieler im Bett sind. +You're in bed.=Sie sind im Bett. +Allows you to sleep=Zum Einschafen diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.es.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.es.tr new file mode 100644 index 00000000..e03087d3 --- /dev/null +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.es.tr @@ -0,0 +1,40 @@ +# textdomain: mcl_beds +Beds allow you to sleep at night and make the time pass faster.=Las camas le permiten dormir por la noche y hacer que el tiempo pase más rápido. +To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Para usar una cama, párate cerca de ella y haz clic derecho en la cama para dormir en ella. Dormir solo funciona cuando se oculta el sol, por la noche o durante una tormenta eléctrica. La cama también debe estar libre de cualquier peligro. +You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Has oído hablar de otros mundos en los que una cama establecería el punto de partida para tu próxima vida. Pero este mundo no es uno de ellos. +By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Al usar una cama, se establece como el punto de partida para tu próxima vida. Si mueres, comenzarás tu próxima vida en esta cama, a menos que esté obstruida o destruida. +In this world, going to bed won't skip the night, but it will skip thunderstorms.=En este mundo, ir a la cama no se saltará la noche, pero se saltará las tormentas eléctricas. +Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Dormir te permite saltarte la noche. Se omite la noche cuando todos los jugadores en este mundo se fueron a dormir. La noche se salta después de dormir durante unos segundos. Las tormentas eléctricas se pueden omitir de la misma manera. +Bed=Cama +Red Bed=Cama roja +Blue Bed=Cama azul +Cyan Bed=Cama cian +Grey Bed=Cama gris +Light Grey Bed=Cama gris ocuro +Black Bed=Cama negra +Yellow Bed=Cama amarilla +Green Bed=Cama verde +Magenta Bed=Cama magenta +Orange Bed=Cama naranja +Purple Bed=Cama morada +Brown Bed=Cama marrón +Pink Bed=Cama rosa +Lime Bed=Cama verde lima +Light Blue Bed=Cama azul claro +White Bed=Cama blanca +You can't sleep, the bed's too far away!=¡No puedes dormir, la cama está muy lejos! +This bed is already occupied!=¡La cama ya está ocupada! +You have to stop moving before going to bed!=¡Tienes que dejar de moverte antes de acostarte! +You can't sleep now, monsters are nearby!=No puedes dormir ahora, ¡hay monstruos cerca! +You can't sleep, the bed is obstructed!=¡No puedes dormir, la cama está obstruida! +It's too dangerous to sleep here!=¡Es muy peligroso dormir aquí! +New respawn position set! But you can only sleep at night or during a thunderstorm.=¡Nueva posición de reaparición establecida! Pero solo puedes dormir por la noche o durante tormentas eléctricas. +You can only sleep at night or during a thunderstorm.=Solo puedes dormir por la noche o durante tormentas eléctricas. +New respawn position set!=¡Nueva posición de reaparición establecida! +Leave bed=Salir de la cama +Abort sleep=Levantarse +Players in bed: @1/@2=Jugadores en la cama: @1/@2 +Note: Night skip is disabled.=Nota: El salto nocturno está deshabilitado. +You're sleeping.=Estás durmiendo. +You will fall asleep when all players are in bed.=Te quedarás dormido cuando todos los jugadores estén en la cama. +You're in bed.=Estas en la cama. diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr new file mode 100644 index 00000000..d85d48bf --- /dev/null +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr @@ -0,0 +1,41 @@ +# textdomain: mcl_beds +Beds allow you to sleep at night and make the time pass faster.=Les lits vous permettent de dormir la nuit et de faire passer le temps plus rapidement. +To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Pour utiliser un lit, tenez-vous près de lui et faites un clic droit sur le lit pour y dormir. Dormir ne fonctionne que lorsque le soleil se couche, la nuit ou pendant un orage. Le lit doit également être à l'abri de tout danger. +You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Vous avez entendu parler d'autres mondes dans lesquels un lit serait le point de départ de votre prochaine vie. Mais ce monde n'en fait pas partie. +By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=En utilisant un lit, vous définissez le point de départ de votre prochaine vie. Si vous mourez, vous commencerez votre prochaine vie dans ce lit, à moins qu'il ne soit obstrué ou détruit. +In this world, going to bed won't skip the night, but it will skip thunderstorms.=Dans ce monde, aller au lit ne sautera pas la nuit, mais cela évitera les orages. +Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Dormir vous permet de sauter la nuit. La nuit est sautée lorsque tous les joueurs de ce monde se sont endormis. La nuit est sautée après avoir dormi quelques secondes. Les orages peuvent être évités de la même manière. +Bed=Lit +Red Bed=Lit Rouge +Blue Bed=Lit Bleu +Cyan Bed=Lit Cyan +Grey Bed=Lit Gris +Light Grey Bed=Lit Gris Clair +Black Bed=Lit Noir +Yellow Bed=Lit Jaune +Green Bed=Lit Vert +Magenta Bed=Lit Magenta +Orange Bed=Lit Orange +Purple Bed=Lit Violet +Brown Bed=Lit Marron +Pink Bed=Lit Rose +Lime Bed=Lit Vert Clair +Light Blue Bed=Lit Bleu Clair +White Bed=Lit Blanc +You can't sleep, the bed's too far away!=Vous ne pouvez pas dormir, le lit est trop loin! +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! +You can't sleep now, monsters are nearby!=Vous ne pouvez pas dormir maintenant, les monstres sont à proximité! +You can't sleep, the bed is obstructed!=Vous ne pouvez pas dormir, le lit est obstrué! +It's too dangerous to sleep here!=C'est trop dangereux de dormir ici! +New respawn position set! But you can only sleep at night or during a thunderstorm.=Nouvelle position de réapparition définie! Mais vous ne pouvez dormir que la nuit ou pendant un orage. +You can only sleep at night or during a thunderstorm.=Vous ne pouvez dormir que la nuit ou pendant un orage. +New respawn position set!=Nouvelle position de réapparition définie! +Leave bed=Quitter le lit +Abort sleep=Abandonner le sommeil +Players in bed: @1/@2=Joueurs au lit: @1/@2 +Note: Night skip is disabled.=Remarque: Le saut de nuit est désactivé. +You're sleeping.=Tu dors. +You will fall asleep when all players are in bed.=Vous vous endormirez lorsque tous les joueurs seront au lit. +You're in bed.=Tu es au lit. +Allows you to sleep=Vous permet de dormir diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt new file mode 100644 index 00000000..d18fbe5d --- /dev/null +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -0,0 +1,41 @@ +# textdomain: mcl_beds +Beds allow you to sleep at night and make the time pass faster.= +To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.= +You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them. +By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.= +In this world, going to bed won't skip the night, but it will skip thunderstorms.= +Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.= +Bed= +Red Bed= +Blue Bed= +Cyan Bed= +Grey Bed= +Light Grey Bed= +Black Bed= +Yellow Bed= +Green Bed= +Magenta Bed= +Orange Bed= +Purple Bed= +Brown Bed= +Pink Bed= +Lime Bed= +Light Blue Bed= +White Bed= +You can't sleep, the bed's too far away!= +This bed is already occupied!= +You have to stop moving before going to bed!= +You can't sleep now, monsters are nearby!= +You can't sleep, the bed is obstructed!= +It's too dangerous to sleep here!= +New respawn position set! But you can only sleep at night or during a thunderstorm.= +You can only sleep at night or during a thunderstorm.= +New respawn position set!= +Leave bed= +Abort sleep= +Players in bed: @1/@2= +Note: Night skip is disabled.= +You're sleeping.= +You will fall asleep when all players are in bed.= +You're in bed.= +Allows you to sleep= diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_black.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_black.png index 5bfa983c..2ec1864d 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_black.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_black.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_blue.png index ecf58cd0..076663f7 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_blue.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_blue.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_brown.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_brown.png index f1473c36..450a5921 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_brown.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_brown.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_cyan.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_cyan.png index e3c466ec..4b7f06a4 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_cyan.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_cyan.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_green.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_green.png index e59981a4..53101587 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_green.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_green.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_grey.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_grey.png index 65052ad0..264fe4bd 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_grey.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_grey.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_light_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_light_blue.png index 974ac656..2e98d09f 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_light_blue.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_light_blue.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_lime.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_lime.png index 88c36740..6588e80d 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_lime.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_lime.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_magenta.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_magenta.png index 04bdc7dd..5789f0b8 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_magenta.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_magenta.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_orange.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_orange.png index 5271b820..a74da540 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_orange.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_orange.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_pink.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_pink.png index ca6b5047..741b1646 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_pink.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_pink.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_purple.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_purple.png index 740824b3..07965418 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_purple.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_purple.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_red.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_red.png index 638bdd50..94c867a1 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_red.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_red.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_silver.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_silver.png index b0739432..ee693465 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_silver.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_silver.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_white.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_white.png index 1e536432..cd1632d5 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_white.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_white.png differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_yellow.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_yellow.png index a3d9c8c2..eb886247 100644 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_yellow.png and b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_yellow.png differ diff --git a/mods/ITEMS/mcl_books/depends.txt b/mods/ITEMS/mcl_books/depends.txt index 8b043fbb..e1ecc48c 100644 --- a/mods/ITEMS/mcl_books/depends.txt +++ b/mods/ITEMS/mcl_books/depends.txt @@ -1,3 +1,4 @@ +mcl_init? mcl_core? mcl_sounds? mcl_mobitems? diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 87503705..cf4daf0b 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -1,10 +1,21 @@ +local S =minetest.get_translator("mcl_books") + +local max_text_length = 4500 -- TODO: Increase to 12800 when scroll bar was added to written book +local max_title_length = 64 + +local header = "" +if minetest.get_modpath("mcl_init") then + header = "no_prepend[]" .. mcl_vars.gui_nonbg .. mcl_vars.gui_bg_color .. + "style_type[button;border=false;bgimg=mcl_books_button9.png;bgimg_pressed=mcl_books_button9_pressed.png;bgimg_middle=2,2]" +end + -- Book minetest.register_craftitem("mcl_books:book", { - description = "Book", - _doc_items_longdesc = "Books are used to make bookshelves and book and quills.", + description = S("Book"), + _doc_items_longdesc = S("Books are used to make bookshelves and book and quills."), inventory_image = "default_book.png", stack_max = 64, - groups = { book=1 }, + groups = { book=1, craftitem = 1 }, }) if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then @@ -47,18 +58,22 @@ end local make_description = function(title, author, generation) local desc if generation == 0 then - desc = string.format("“%s”", title) + desc = S("“@1”", title) elseif generation == 1 then - desc = string.format("Copy of “%s”", title) + desc = S("Copy of “@1”", title) elseif generation == 2 then - desc = string.format("Copy of Copy of “%s”", title) + desc = S("Copy of Copy of “@1”", title) else - desc = "Tattered Book" + desc = S("Tattered Book") end - desc = desc .. "\n" .. core.colorize("#AAAAAA", string.format("by %s", author)) + desc = desc .. "\n" .. minetest.colorize("#AAAAAA", S("by @1", author)) return desc end +local cap_text_length = function(text, max_length) + return string.sub(text, 1, max_length) +end + local write = function(itemstack, user, pointed_thing) -- Call on_rightclick if the pointed node defines it if pointed_thing.type == "node" then @@ -72,10 +87,11 @@ local write = function(itemstack, user, pointed_thing) local text = get_text(itemstack) local formspec = "size[8,9]".. + header.. "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. "textarea[0.75,0.1;7.25,9;text;;"..minetest.formspec_escape(text).."]".. - "button[0.75,7.95;3,1;sign;Sign]".. - "button_exit[4.25,7.95;3,1;ok;Done]" + "button[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign")).."]".. + "button_exit[4.25,7.95;3,1;ok;"..minetest.formspec_escape(S("Done")).."]" minetest.show_formspec(user:get_player_name(), "mcl_books:writable_book", formspec) end @@ -92,17 +108,20 @@ local read = function(itemstack, user, pointed_thing) local text = get_text(itemstack) local formspec = "size[8,9]".. + header.. "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "textarea[0.75,0.1;7.25,9;;"..core.colorize("#000000", minetest.formspec_escape(text))..";]".. - "button_exit[2.25,7.95;3,1;ok;Done]" + "textarea[0.75,0.1;7.25,9;;"..minetest.formspec_escape(text)..";]".. + "button_exit[2.25,7.95;3,1;ok;"..minetest.formspec_escape(S("Done")).."]" minetest.show_formspec(user:get_player_name(), "mcl_books:written_book", formspec) end -- Book and Quill minetest.register_craftitem("mcl_books:writable_book", { - description = "Book and Quill", - _doc_items_longdesc = "This item can be used to write down some notes.", - _doc_items_usagehelp = "Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.", + description = S("Book and Quill"), + _tt_help = S("Write down some notes"), + _doc_items_longdesc = S("This item can be used to write down some notes."), + _doc_items_usagehelp = S("Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.").."\n".. + S("A book can hold up to 4500 characters. The title length is limited to 64 characters."), inventory_image = "mcl_books_book_writable.png", groups = { book=1 }, stack_max = 1, @@ -115,21 +134,23 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) local stack = player:get_wielded_item() if (stack:get_name() and (stack:get_name() == "mcl_books:writable_book")) then local meta = stack:get_meta() + local text = cap_text_length(fields.text, max_text_length) if fields.ok then - meta:set_string("text", fields.text) + meta:set_string("text", text) player:set_wielded_item(stack) elseif fields.sign then - meta:set_string("text", fields.text) + meta:set_string("text", text) player:set_wielded_item(stack) local name = player:get_player_name() local formspec = "size[8,9]".. + header.. "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "field[0.75,1;7.25,1;title;"..core.colorize("#000000", "Enter book title:")..";]".. - "label[0.75,1.5;"..core.colorize("#404040", minetest.formspec_escape("by " .. name)).."]".. - "label[0.75,6.95;"..core.colorize("#000000", "Note: The book will no longer") .. "\n" .. core.colorize("#000000", "be editable after signing.").."]".. - "button_exit[0.75,7.95;3,1;sign;Sign and Close]".. - "button[4.25,7.95;3,1;cancel;Cancel]" + "field[0.75,1;7.25,1;title;"..minetest.formspec_escape(minetest.colorize("#000000", S("Enter book title:")))..";]".. + "label[0.75,1.5;"..minetest.formspec_escape(minetest.colorize("#404040", S("by @1", name))).."]".. + "button_exit[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign and Close")).."]".. + "tooltip[sign;"..minetest.formspec_escape(S("Note: The book will no longer be editable after signing")).."]".. + "button[4.25,7.95;3,1;cancel;"..minetest.formspec_escape(S("Cancel")).."]" minetest.show_formspec(player:get_player_name(), "mcl_books:signing", formspec) end end @@ -138,15 +159,17 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) local book = player:get_wielded_item() local name = player:get_player_name() if book:get_name() == "mcl_books:writable_book" then - if fields.title == "" then - fields.title = "Nameless Book" + local title = fields.title + if string.len(title) == 0 then + title = S("Nameless Book") end + title = cap_text_length(title, max_title_length) local meta = newbook:get_meta() - local text = get_text(book) - meta:set_string("title", fields.title) + local text = cap_text_length(get_text(book), max_text_length) + meta:set_string("title", title) meta:set_string("author", name) meta:set_string("text", text) - meta:set_string("description", make_description(fields.title, name, 0)) + meta:set_string("description", make_description(title, name, 0)) -- The book copy counter. 0 = original, 1 = copy of original, 2 = copy of copy of original, … meta:set_int("generation", 0) @@ -173,13 +196,13 @@ end -- Written Book minetest.register_craftitem("mcl_books:written_book", { - description = "Written Book", - _doc_items_longdesc = "Written books contain some text written by someone. They can be read and copied, but not edited.", - _doc_items_usagehelp = [[Hold it in your hand, then rightclick to read the book. + description = S("Written Book"), + _doc_items_longdesc = S("Written books contain some text written by someone. They can be read and copied, but not edited."), + _doc_items_usagehelp = S("Hold it in your hand, then rightclick to read the book.").."\n\n".. -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.]], +S("To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied."), inventory_image = "mcl_books_book_written.png", - groups = { not_in_creative_inventory=1, book=1 }, + groups = { not_in_creative_inventory=1, book=1, no_rename=1 }, stack_max = 16, on_place = read, on_secondary_use = read @@ -235,7 +258,7 @@ minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craf -- Valid copy. Let's update the description field of the result item -- so it is properly displayed in the crafting grid. local imeta = itemstack:get_meta() - local title = ometa:get_string("title") + local title = cap_text_length(ometa:get_string("title"), max_title_length) local author = ometa:get_string("author") -- Increase book generation and update description @@ -283,11 +306,11 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv -- Copy metadata local imeta = itemstack:get_meta() - local title = ometa:get_string("title") + local title = cap_text_length(ometa:get_string("title"), max_title_length) local author = ometa:get_string("author") imeta:set_string("title", title) imeta:set_string("author", author) - imeta:set_string("text", text) + imeta:set_string("text", cap_text_length(text, max_text_length)) -- Increase book generation and update description generation = generation + 1 @@ -311,15 +334,15 @@ end -- Bookshelf minetest.register_node("mcl_books:bookshelf", { - description = "Bookshelf", - _doc_items_longdesc = "Bookshelves are used for decoration.", + description = S("Bookshelf"), + _doc_items_longdesc = S("Bookshelves are used for decoration."), tiles = {"mcl_books_bookshelf_top.png", "mcl_books_bookshelf_top.png", "default_bookshelf.png"}, stack_max = 64, is_ground_content = false, - groups = {handy=1,axey=1, flammable=3,building_block=1, material_wood=1}, + groups = {handy=1,axey=1, flammable=3,building_block=1, material_wood=1, fire_encouragement=30, fire_flammability=20}, drop = "mcl_books:book 3", sounds = wood_sound, - _mcl_blast_resistance = 7.5, + _mcl_blast_resistance = 1.5, _mcl_hardness = 1.5, }) diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.de.tr b/mods/ITEMS/mcl_books/locale/mcl_books.de.tr new file mode 100644 index 00000000..df51c185 --- /dev/null +++ b/mods/ITEMS/mcl_books/locale/mcl_books.de.tr @@ -0,0 +1,26 @@ +# textdomain: mcl_books +Book=Buch +Books are used to make bookshelves and book and quills.=Bücher werden zur Herstellung von Bücherregalen und Büchern mit Federkiel gebraucht. +“@1”=„@1“ +Copy of “@1”=Kopie von „@1“ +Copy of Copy of “@1”=Kopie von Kopie von „@1“ +Tattered Book=Zerfleddertes Buch +by @1=von @1 +Sign=Signieren +Done=Fertig +This item can be used to write down some notes.=Dies kann benutzt werden, um ein paar Notizen aufzuschreiben. +Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Halten Sie es in der Hand, dann rechtsklicken Sie, um die Notizen zu sehen und zu ändern. Sie können den Text beliebig ändern. Sie können das Buch auch signieren und in ein geschriebenes Buch verwandeln, das gestapelt, aber nicht mehr geändert werden kann. +A book can hold up to 4500 characters. The title length is limited to 64 characters.=Ein Buch kann bis zu 4500 Zeichen enthalten. Die Titellänge ist begrenzt auf 64 Zeichen. +Enter book title:=Buchtitel eingeben: +Note: The book will no longer be editable after signing=Anmerkung: Das Buch kann nach der Signierung nicht länger@nbearbeitet werden +Sign and Close=Signieren und schließen +Cancel=Abbrechen +Nameless Book=Namenloses Buch +Written Book=Geschriebenes Buch +Written books contain some text written by someone. They can be read and copied, but not edited.=Geschriebene Bücher enthalten etwas Text, den jemand geschrieben hat. Sie können gelesen und kopiert, aber nicht geändert werden. +Hold it in your hand, then rightclick to read the book.=Halten Sie es in Ihrer Hand und rechtsklicken Sie, um das Buch zu lesen. +To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Um den Text zu kopieren, platzieren Sie es ins Fertigungsgitter mit einem Buch mit Federkiel (oder mehreren) und fertigen Sie die Kopie an. Das geschriebene Buch bleibt. Kopien von Kopien können nicht kopiert werden. +Bookshelf=Bücherregal +Bookshelves are used for decoration.=Bücherregale werden zur Dekoration benutzt. +Book and Quill=Buch und Federkiel +Write down some notes=Zum Aufschreiben von Notizen diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.es.tr b/mods/ITEMS/mcl_books/locale/mcl_books.es.tr new file mode 100644 index 00000000..d1e0d947 --- /dev/null +++ b/mods/ITEMS/mcl_books/locale/mcl_books.es.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_books +Book=Libro +Books are used to make bookshelves and book and quills.=Los libros se usan para hacer estanterías, libros y plumas. +“@1”="@1“ +Copy of “@1”=Copia de "@1“ +Copy of Copy of “@1”=Kopie von Kopie von „@1“ +Tatter ed Book=Libro andrajoso +by @1=por @1 +Sign=Firmar +Done=Hecho +This item can be used to write down some notes.=Este elemento se puede usar para escribir algunas notas. +Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Sosténgalo en la mano, luego haga clic derecho para leer las notas actuales y luego edite. Puede editar el texto con la frecuencia que desee. También puede firmar el libro que lo convierte en un libro escrito que puede apilar, pero ya no se puede editar. +A book can hold up to 4500 characters. The title length is limited to 64 characters.=Un libro puede contener hasta 4500 caracteres. La longitud del título está limitada a 64 caracteres. +Enter book title:=Inserta el título del libro: +Note: The book will no longer be editable after signing=Nota: El libro ya no será editable después de firmarlo +Sign and Close=Firmar y cerrar libro +Cancel=Cancelar +Nameless Book=Libro sin nombre +Written Book=Libro escrito +Written books contain some text written by someone. They can be read and copied, but not edited.=Los libros escritos contienen texto escrito por alguien. Pueden leerse y copiarse, pero no editarse. +Hold it in your hand, then rightclick to read the book.=Sostenlo en tu mano, luego haz clic derecho para leer el libro. +To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Para copiar el texto del libro escrito, colóquelo en la cuadrícula de elaboración junto con un libro y pluma (o varios de esos) y haga manualidades. El libro escrito no se consumirá. Las copias de copias no se pueden copiar. +Bookshelf=Librería +Bookshelves are used for decoration.=Las librerías se utilizan para la decoración. +Book and Quill=Libro y pluma diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr b/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr new file mode 100644 index 00000000..7024cf5d --- /dev/null +++ b/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr @@ -0,0 +1,28 @@ +# textdomain: mcl_books +Book=Livre +Books are used to make bookshelves and book and quills.=Les livres sont utilisés pour fabriquer des étagères et des livres et des plumes. +“@1”="@1" +Copy of “@1”=Copie de "@1" +Copy of Copy of “@1”=Copie de Copie de "@1" +Tattered Book=Livre en lambeaux +by @1=ar @1 +# as in “to sign a book” +Sign=Signer +Done=Terminé +This item can be used to write down some notes.=Cet élément peut être utilisé pour écrire certaines notes. +Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Tenez-le dans la main, puis faites un clic droit pour lire les notes actuelles et modifiez-les ensuite. Vous pouvez modifier le texte aussi souvent que vous le souhaitez. Vous pouvez également signer le livre qui le transforme en livre écrit que vous pouvez empiler, mais il ne peut plus être édité. +A book can hold up to 4500 characters. The title length is limited to 64 characters.=Un livre peut contenir jusqu'à 4500 caractères. La longueur du titre est limitée à 64 caractères. +Enter book title:=Entrez le titre du livre: +by @1=par @1 +Note: The book will no longer be editable after signing=Remarque: le livre ne sera plus modifiable après la signature +Sign and Close=Signez et fermez +Cancel=Annuler +Nameless Book=Livre sans nom +Written Book=Livre écrit +Written books contain some text written by someone. They can be read and copied, but not edited.=Les livres écrits contiennent du texte écrit par quelqu'un. Ils peuvent être lus et copiés, mais pas modifiés. +Hold it in your hand, then rightclick to read the book.=Tenez-le dans votre main, puis faites un clic droit pour lire le livre. +To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Pour copier le texte du livre écrit, placez-le dans la grille d'artisanat avec un livre et une plume (ou plusieurs de ceux-ci) et de l'artisanat. Le livre écrit ne sera pas consommé. Les copies de copies ne peuvent pas être copiées. +Bookshelf=Bibliothèque +Bookshelves are used for decoration.=Les bibliothèques sont utilisées pour la décoration. +Book and Quill=Livre et Plume +Write down some notes=Notez quelques notes diff --git a/mods/ITEMS/mcl_books/locale/template.txt b/mods/ITEMS/mcl_books/locale/template.txt new file mode 100644 index 00000000..8667d1f0 --- /dev/null +++ b/mods/ITEMS/mcl_books/locale/template.txt @@ -0,0 +1,28 @@ +# textdomain: mcl_books +Book= +Books are used to make bookshelves and book and quills.= +“@1”= +Copy of “@1”= +Copy of Copy of “@1”= +Tattered Book= +by @1= +# as in “to sign a book” +Sign= +Done= +This item can be used to write down some notes.= +Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.= +A book can hold up to 4500 characters. The title length is limited to 64 characters.= +Enter book title:= +by @1= +Note: The book will no longer be editable after signing= +Sign and Close= +Cancel= +Nameless Book= +Written Book= +Written books contain some text written by someone. They can be read and copied, but not edited.= +Hold it in your hand, then rightclick to read the book.= +To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.= +Bookshelf= +Bookshelves are used for decoration.= +Book and Quill= +Write down some notes= diff --git a/mods/ITEMS/mcl_books/textures/mcl_books_button9.png b/mods/ITEMS/mcl_books/textures/mcl_books_button9.png new file mode 100644 index 00000000..27b80a89 Binary files /dev/null and b/mods/ITEMS/mcl_books/textures/mcl_books_button9.png differ diff --git a/mods/ITEMS/mcl_books/textures/mcl_books_button9_pressed.png b/mods/ITEMS/mcl_books/textures/mcl_books_button9_pressed.png new file mode 100644 index 00000000..08d4272d Binary files /dev/null and b/mods/ITEMS/mcl_books/textures/mcl_books_button9_pressed.png differ diff --git a/mods/ITEMS/mcl_bows/README.txt b/mods/ITEMS/mcl_bows/README.txt new file mode 100644 index 00000000..5660f922 --- /dev/null +++ b/mods/ITEMS/mcl_bows/README.txt @@ -0,0 +1,13 @@ +This mod adds bows and arrows for MineClone 2. + +License: +* Source code: LGPL 3.0 + * Incorporates code from the [bow] mod by Arcelmi. + https://github.com/Arcelmi/minetest-bows + +* Textures: See MineClone 2 license notes. +* Sounds: + * mcl_bows_bow_shoot.ogg: MIT License + * mcl_bows_hit_player.ogg: CC BY 3.0 by Freesound.org user tim.kahn. + https://freesound.org/people/tim.kahn/sounds/38495/ + http://creativecommons.org/licenses/by/3.0/ diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua new file mode 100644 index 00000000..9ae6e85a --- /dev/null +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -0,0 +1,413 @@ +local S = minetest.get_translator("mcl_bows") + +-- Time in seconds after which a stuck arrow is deleted +local ARROW_TIMEOUT = 60 +-- Time after which stuck arrow is rechecked for being stuck +local STUCK_RECHECK_TIME = 5 + +local GRAVITY = 9.81 + +local YAW_OFFSET = -math.pi/2 + +local dir_to_pitch = function(dir) + local dir2 = vector.normalize(dir) + local xz = math.abs(dir.x) + math.abs(dir.z) + return -math.atan2(-dir.y, xz) +end + +local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") +local mod_button = minetest.get_modpath("mesecons_button") + +minetest.register_craftitem("mcl_bows:arrow", { + description = S("Arrow"), + _tt_help = S("Ammunition").."\n"..S("Damage from bow: 1-10").."\n"..S("Damage from dispenser: 3"), + _doc_items_longdesc = S("Arrows are ammunition for bows and dispensers.").."\n".. +S("An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.").."\n".. +S("Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons."), + _doc_items_usagehelp = S("To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it."), + inventory_image = "mcl_bows_arrow_inv.png", + groups = { ammo=1, ammo_bow=1 }, + _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) + -- Shoot arrow + local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) + local yaw = math.atan2(dropdir.z, dropdir.x) + YAW_OFFSET + mcl_bows.shoot_arrow(itemstack:get_name(), shootpos, dropdir, yaw, nil, 19, 3) + end, +}) + +-- This is a fake node, used as model for the arrow entity. +-- It's not supposed to be usable as item or real node. +-- TODO: Use a proper mesh for the arrow entity +minetest.register_node("mcl_bows:arrow_box", { + drawtype = "nodebox", + is_ground_content = false, + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, -4.5/17, 1.5/17, 1.5/17}, + {-4.5/17, -0.5/17, -0.5/17, 5.5/17, 0.5/17, 0.5/17}, + {5.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + -- Tip + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + -- Fletching + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow_back.png", "mcl_bows_arrow_front.png", "mcl_bows_arrow.png", "mcl_bows_arrow.png^[transformFX"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + groups = {not_in_creative_inventory=1, dig_immediate=3}, + drop = "", + node_placement_prediction = "", + on_construct = function(pos) + minetest.log("error", "[mcl_bows] Trying to construct mcl_bows:arrow_box at "..minetest.pos_to_string(pos)) + minetest.remove_node(pos) + end, +}) + +local ARROW_ENTITY={ + physical = true, + visual = "wielditem", + visual_size = {x=0.4, y=0.4}, + textures = {"mcl_bows:arrow_box"}, + collisionbox = {-0.19, -0.125, -0.19, 0.19, 0.125, 0.19}, + collide_with_objects = false, + + _lastpos={}, + _startpos=nil, + _damage=1, -- Damage on impact + _stuck=false, -- Whether arrow is stuck + _stucktimer=nil,-- Amount of time (in seconds) the arrow has been stuck so far + _stuckrechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow + _stuckin=nil, --Position of node in which arow is stuck. + _shooter=nil, -- ObjectRef of player or mob who shot it + + _viscosity=0, -- Viscosity of node the arrow is currently in + _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession +} + +-- Destroy arrow entity self at pos and drops it as an item +local spawn_item = function(self, pos) + if not minetest.settings:get_bool("creative_mode") then + local item = minetest.add_item(pos, "mcl_bows:arrow") + item:set_velocity({x=0, y=0, z=0}) + item:set_yaw(self.object:get_yaw()) + end + self.object:remove() +end + +ARROW_ENTITY.on_step = function(self, dtime) + local pos = self.object:get_pos() + local dpos = table.copy(pos) -- digital pos + dpos = vector.round(dpos) + local node = minetest.get_node(dpos) + + if self._stuck then + self._stucktimer = self._stucktimer + dtime + self._stuckrechecktimer = self._stuckrechecktimer + dtime + if self._stucktimer > ARROW_TIMEOUT then + self.object:remove() + return + end + -- Drop arrow as item when it is no longer stuck + -- FIXME: Arrows are a bit slow to react and continue to float in mid air for a few seconds. + if self._stuckrechecktimer > STUCK_RECHECK_TIME then + local stuckin_def + if self._stuckin then + stuckin_def = minetest.registered_nodes[minetest.get_node(self._stuckin).name] + end + -- TODO: In MC, arrow just falls down without turning into an item + if stuckin_def and stuckin_def.walkable == false then + spawn_item(self, pos) + return + end + self._stuckrechecktimer = 0 + end + -- Pickup arrow if player is nearby (not in Creative Mode) + local objects = minetest.get_objects_inside_radius(pos, 1) + for _,obj in ipairs(objects) do + if obj:is_player() then + if not minetest.settings:get_bool("creative_mode") then + if obj:get_inventory():room_for_item("main", "mcl_bows:arrow") then + obj:get_inventory():add_item("main", "mcl_bows:arrow") + minetest.sound_play("item_drop_pickup", { + pos = pos, + max_hear_distance = 16, + gain = 1.0, + }, true) + end + end + self.object:remove() + return + end + end + + -- Check for object "collision". Done every tick (hopefully this is not too stressing) + else + -- We just check for any hurtable objects nearby. + -- The radius of 3 is fairly liberal, but anything lower than than will cause + -- arrow to hilariously go through mobs often. + -- TODO: Implement an ACTUAL collision detection (engine support needed). + local objs = minetest.get_objects_inside_radius(pos, 3) + local closest_object + local closest_distance + + if self._deflection_cooloff > 0 then + self._deflection_cooloff = self._deflection_cooloff - dtime + end + + -- Iterate through all objects and remember the closest attackable object + for k, obj in pairs(objs) do + local ok = false + -- Arrows can only damage players and mobs + if obj ~= self._shooter and obj:is_player() then + ok = true + elseif obj:get_luaentity() ~= nil then + if obj ~= self._shooter and obj:get_luaentity()._cmi_is_mob then + ok = true + end + end + + if ok then + local dist = vector.distance(pos, obj:get_pos()) + if not closest_object or not closest_distance then + closest_object = obj + closest_distance = dist + elseif dist < closest_distance then + closest_object = obj + closest_distance = dist + end + end + end + + -- If an attackable object was found, we will damage the closest one only + if closest_object ~= nil then + local obj = closest_object + local is_player = obj:is_player() + local lua = obj:get_luaentity() + if obj ~= self._shooter and (is_player or (lua and lua._cmi_is_mob)) then + if obj:get_hp() > 0 then + -- Check if there is no solid node between arrow and object + local ray = minetest.raycast(self.object:get_pos(), obj:get_pos(), true) + for pointed_thing in ray do + if pointed_thing.type == "object" and pointed_thing.ref == closest_object then + -- Target reached! We can proceed now. + break + elseif pointed_thing.type == "node" then + local nn = minetest.get_node(minetest.get_pointed_thing_position(pointed_thing)).name + local def = minetest.registered_nodes[nn] + if (not def) or def.walkable then + -- There's a node in the way. Delete arrow without damage + self.object:remove() + return + end + end + end + + -- Punch target object + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self._damage}, + }, nil) + + if is_player then + if self._shooter and self._shooter:is_player() then + -- “Ding” sound for hitting another player + minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter}, true) + end + end + + if lua then + local entity_name = lua.name + -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away + -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> + -- TODO: This achievement should be given for the kill, not just a hit + if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then + if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then + awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") + end + end + end + end + self.object:remove() + return + end + end + end + + -- Check for node collision + if self._lastpos.x~=nil and not self._stuck then + local def = minetest.registered_nodes[node.name] + local vel = self.object:get_velocity() + -- Arrow has stopped in one axis, so it probably hit something. + -- This detection is a bit clunky, but sadly, MT does not offer a direct collision detection for us. :-( + if (math.abs(vel.x) < 0.0001) or (math.abs(vel.z) < 0.0001) or (math.abs(vel.y) < 0.00001) then + -- Check for the node to which the arrow is pointing + local dir + if math.abs(vel.y) < 0.00001 then + if self._lastpos.y < pos.y then + dir = {x=0, y=1, z=0} + else + dir = {x=0, y=-1, z=0} + end + else + dir = minetest.facedir_to_dir(minetest.dir_to_facedir(minetest.yaw_to_dir(self.object:get_yaw()-YAW_OFFSET))) + end + self._stuckin = vector.add(dpos, dir) + local snode = minetest.get_node(self._stuckin) + local sdef = minetest.registered_nodes[snode.name] + + -- If node is non-walkable, unknown or ignore, don't make arrow stuck. + -- This causes a deflection in the engine. + if not sdef or sdef.walkable == false or snode.name == "ignore" then + self._stuckin = nil + if self._deflection_cooloff <= 0 then + -- Lose 1/3 of velocity on deflection + local newvel = vector.multiply(vel, 0.6667) + + self.object:set_velocity(newvel) + -- Reset deflection cooloff timer to prevent many deflections happening in quick succession + self._deflection_cooloff = 1.0 + end + else + + -- Node was walkable, make arrow stuck + self._stuck = true + self._stucktimer = 0 + self._stuckrechecktimer = 0 + + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=0, z=0}) + + -- Push the button! Push, push, push the button! + if mod_button and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then + local bdir = minetest.wallmounted_to_dir(node.param2) + -- Check the button orientation + if vector.equals(vector.add(dpos, bdir), self._stuckin) then + mesecon.push_button(dpos, node) + end + end + end + elseif (def and def.liquidtype ~= "none") then + -- Slow down arrow in liquids + local v = def.liquid_viscosity + if not v then + v = 0 + end + local old_v = self._viscosity + self._viscosity = v + local vpenalty = math.max(0.1, 0.98 - 0.1 * v) + if math.abs(vel.x) > 0.001 then + vel.x = vel.x * vpenalty + end + if math.abs(vel.z) > 0.001 then + vel.z = vel.z * vpenalty + end + self.object:set_velocity(vel) + end + end + + -- Update yaw + if not self._stuck then + local vel = self.object:get_velocity() + local yaw = minetest.dir_to_yaw(vel)+YAW_OFFSET + local pitch = dir_to_pitch(vel) + self.object:set_rotation({ x = 0, y = yaw, z = pitch }) + end + + -- Update internal variable + self._lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +-- Force recheck of stuck arrows when punched. +-- Otherwise, punching has no effect. +ARROW_ENTITY.on_punch = function(self) + if self._stuck then + self._stuckrechecktimer = STUCK_RECHECK_TIME + end +end + +ARROW_ENTITY.get_staticdata = function(self) + local out = { + lastpos = self._lastpos, + startpos = self._startpos, + damage = self._damage, + stuck = self._stuck, + stuckin = self._stuckin, + } + if self._stuck then + -- If _stucktimer is missing for some reason, assume the maximum + if not self._stucktimer then + self._stucktimer = ARROW_TIMEOUT + end + out.stuckstarttime = minetest.get_gametime() - self._stucktimer + end + if self._shooter and self._shooter:is_player() then + out.shootername = self._shooter:get_player_name() + end + return minetest.serialize(out) +end + +ARROW_ENTITY.on_activate = function(self, staticdata, dtime_s) + local data = minetest.deserialize(staticdata) + if data then + self._stuck = data.stuck + if data.stuck then + if data.stuckstarttime then + -- First, check if the stuck arrow is aleady past its life timer. + -- If yes, delete it. + self._stucktimer = minetest.get_gametime() - data.stuckstarttime + if self._stucktimer > ARROW_TIMEOUT then + self.object:remove() + return + end + end + + -- Perform a stuck recheck on the next step. + self._stuckrechecktimer = STUCK_RECHECK_TIME + + self._stuckin = data.stuckin + end + + -- Get the remaining arrow state + self._lastpos = data.lastpos + self._startpos = data.startpos + self._damage = data.damage + if data.shootername then + local shooter = minetest.get_player_by_name(data.shootername) + if shooter and shooter:is_player() then + self._shooter = shooter + end + end + end + self.object:set_armor_groups({ immortal = 1 }) +end + +minetest.register_entity("mcl_bows:arrow_entity", ARROW_ENTITY) + +if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then + minetest.register_craft({ + output = 'mcl_bows:arrow 4', + recipe = { + {'mcl_core:flint'}, + {'mcl_core:stick'}, + {'mcl_mobitems:feather'} + } + }) +end + +if minetest.get_modpath("doc_identifier") ~= nil then + doc.sub.identifier.register_object("mcl_bows:arrow_entity", "craftitems", "mcl_bows:arrow") +end + diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua new file mode 100644 index 00000000..3bae7687 --- /dev/null +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -0,0 +1,308 @@ +local S = minetest.get_translator("mcl_bows") + +mcl_bows = {} + +local arrows = { + ["mcl_bows:arrow"] = "mcl_bows:arrow_entity", +} + +local GRAVITY = 9.81 +local BOW_DURABILITY = 385 + +-- Charging time in microseconds +local BOW_CHARGE_TIME_HALF = 500000 -- bow level 1 +local BOW_CHARGE_TIME_FULL = 1000000 -- bow level 2 (full charge) + +-- Factor to multiply with player speed while player uses bow +-- This emulates the sneak speed. +local PLAYER_USE_BOW_SPEED = tonumber(minetest.settings:get("movement_speed_crouch")) / tonumber(minetest.settings:get("movement_speed_walk")) + +-- TODO: Use Minecraft speed (ca. 53 m/s) +-- Currently nerfed because at full speed the arrow would easily get out of the range of the loaded map. +local BOW_MAX_SPEED = 26 + +--[[ Store the charging state of each player. +keys: player name +value: +nil = not charging or player not existing +number: currently charging, the number is the time from minetest.get_us_time + in which the charging has started +]] +local bow_load = {} + +-- Another player table, this one stores the wield index of the bow being charged +local bow_index = {} + +mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damage) + local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrows[arrow_item]) + if power == nil then + power = 19 + end + if damage == nil then + damage = 3 + end + obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) + obj:set_acceleration({x=0, y=-GRAVITY, z=0}) + obj:set_yaw(yaw-math.pi/2) + local le = obj:get_luaentity() + le._shooter = shooter + le._damage = damage + le._startpos = pos + minetest.sound_play("mcl_bows_bow_shoot", {pos=pos}, true) + if shooter ~= nil and shooter:is_player() then + if obj:get_luaentity().player == "" then + obj:get_luaentity().player = shooter + end + obj:get_luaentity().node = shooter:get_inventory():get_stack("main", 1):get_name() + end + return obj +end + +local get_arrow = function(player) + local inv = player:get_inventory() + local arrow_stack, arrow_stack_id + for i=1, inv:get_size("main") do + local it = inv:get_stack("main", i) + if not it:is_empty() and minetest.get_item_group(it:get_name(), "ammo_bow") ~= 0 then + arrow_stack = it + arrow_stack_id = i + break + end + end + return arrow_stack, arrow_stack_id +end + +local player_shoot_arrow = function(itemstack, player, power, damage) + local arrow_stack, arrow_stack_id = get_arrow(player) + local arrow_itemstring + if not minetest.settings:get_bool("creative_mode") then + if not arrow_stack then + return false + end + arrow_itemstring = arrow_stack:get_name() + arrow_stack:take_item() + local inv = player:get_inventory() + inv:set_stack("main", arrow_stack_id, arrow_stack) + end + local playerpos = player:get_pos() + local dir = player:get_look_dir() + local yaw = player:get_look_horizontal() + + if not arrow_itemstring then + arrow_itemstring = "mcl_bows:arrow" + end + mcl_bows.shoot_arrow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage) + return true +end + +-- Bow item, uncharged state +minetest.register_tool("mcl_bows:bow", { + description = S("Bow"), + _tt_help = S("Launches arrows"), + _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes.").."\n".. +S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), + _doc_items_usagehelp = S("To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot."), + _doc_items_durability = BOW_DURABILITY, + inventory_image = "mcl_bows_bow.png", + wield_scale = { x = 1.8, y = 1.8, z = 1 }, + stack_max = 1, + -- Trick to disable melee damage to entities. + -- Range not set to 0 (unlike the others) so it can be placed into item frames + range = 1, + -- Trick to disable digging as well + on_use = function() end, + groups = {weapon=1,weapon_ranged=1}, +}) + +-- Iterates through player inventory and resets all the bows in "charging" state back to their original stage +local reset_bows = function(player) + local inv = player:get_inventory() + local list = inv:get_list("main") + for place, stack in pairs(list) do + if stack:get_name()=="mcl_bows:bow_0" or stack:get_name()=="mcl_bows:bow_1" or stack:get_name()=="mcl_bows:bow_2" then + stack:set_name("mcl_bows:bow") + list[place] = stack + end + end + inv:set_list("main", list) +end + +-- Resets the bow charging state and player speed. To be used when the player is no longer charging the bow +local reset_bow_state = function(player, also_reset_bows) + bow_load[player:get_player_name()] = nil + bow_index[player:get_player_name()] = nil + if minetest.get_modpath("playerphysics") then + playerphysics.remove_physics_factor(player, "speed", "mcl_bows:use_bow") + end + if also_reset_bows then + reset_bows(player) + end +end + +-- Bow in charging state +for level=0, 2 do + minetest.register_tool("mcl_bows:bow_"..level, { + description = S("Bow"), + _doc_items_create_entry = false, + inventory_image = "mcl_bows_bow_"..level..".png", + wield_scale = { x = 1.8, y = 1.8, z = 1 }, + stack_max = 1, + range = 0, -- Pointing range to 0 to prevent punching with bow :D + groups = {not_in_creative_inventory=1, not_in_craft_guide=1}, + on_drop = function(itemstack, dropper, pos) + reset_bow_state(dropper) + itemstack:set_name("mcl_bows:bow") + minetest.item_drop(itemstack, dropper, pos) + itemstack:take_item() + return itemstack + end, + -- Prevent accidental interaction with itemframes and other nodes + on_place = function(itemstack) + return itemstack + end, + }) +end + + +controls.register_on_release(function(player, key, time) + if key~="RMB" then return end + local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) + local wielditem = player:get_wielded_item() + if (wielditem:get_name()=="mcl_bows:bow_0" or wielditem:get_name()=="mcl_bows:bow_1" or wielditem:get_name()=="mcl_bows:bow_2") then + local has_shot = false + + local speed, damage + local p_load = bow_load[player:get_player_name()] + local charge + -- Type sanity check + if type(p_load) == "number" then + charge = minetest.get_us_time() - p_load + else + -- In case something goes wrong ... + -- Just assume minimum charge. + charge = 0 + minetest.log("warning", "[mcl_bows] Player "..player:get_player_name().." fires arrow with non-numeric bow_load!") + end + charge = math.max(math.min(charge, BOW_CHARGE_TIME_FULL), 0) + + local charge_ratio = charge / BOW_CHARGE_TIME_FULL + charge_ratio = math.max(math.min(charge_ratio, 1), 0) + + -- Calculate damage and speed + -- Fully charged + if charge >= BOW_CHARGE_TIME_FULL then + speed = BOW_MAX_SPEED + local r = math.random(1,5) + if r == 1 then + -- 20% chance for critical hit + damage = 10 + else + damage = 9 + end + -- Partially charged + else + -- Linear speed and damage increase + speed = math.max(4, BOW_MAX_SPEED * charge_ratio) + damage = math.max(1, math.floor(9 * charge_ratio)) + end + + has_shot = player_shoot_arrow(wielditem, player, speed, damage) + + wielditem:set_name("mcl_bows:bow") + if has_shot and minetest.settings:get_bool("creative_mode") == false then + wielditem:add_wear(65535/BOW_DURABILITY) + end + player:set_wielded_item(wielditem) + reset_bow_state(player, true) + end +end) + +controls.register_on_hold(function(player, key, time) + if key ~= "RMB" then + return + end + local name = player:get_player_name() + local inv = minetest.get_inventory({type="player", name=name}) + local wielditem = player:get_wielded_item() + if bow_load[name] == nil and wielditem:get_name()=="mcl_bows:bow" and (minetest.settings:get_bool("creative_mode") or inv:contains_item("main", "mcl_bows:arrow")) then + wielditem:set_name("mcl_bows:bow_0") + player:set_wielded_item(wielditem) + if minetest.get_modpath("playerphysics") then + -- Slow player down when using bow + playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_bow", PLAYER_USE_BOW_SPEED) + end + bow_load[name] = minetest.get_us_time() + bow_index[name] = player:get_wield_index() + else + if player:get_wield_index() == bow_index[name] then + if type(bow_load[name]) == "number" then + if wielditem:get_name() == "mcl_bows:bow_0" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_HALF then + wielditem:set_name("mcl_bows:bow_1") + elseif wielditem:get_name() == "mcl_bows:bow_1" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_FULL then + wielditem:set_name("mcl_bows:bow_2") + end + else + if wielditem:get_name() == "mcl_bows:bow_0" or wielditem:get_name() == "mcl_bows:bow_1" or wielditem:get_name() == "mcl_bows:bow_2" then + wielditem:set_name("mcl_bows:bow") + end + end + player:set_wielded_item(wielditem) + else + reset_bow_state(player, true) + end + end +end) + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local wielditem = player:get_wielded_item() + local wieldindex = player:get_wield_index() + local controls = player:get_player_control() + if type(bow_load[name]) == "number" and ((wielditem:get_name()~="mcl_bows:bow_0" and wielditem:get_name()~="mcl_bows:bow_1" and wielditem:get_name()~="mcl_bows:bow_2") or wieldindex ~= bow_index[name]) then + reset_bow_state(player, true) + end + end +end) + +minetest.register_on_joinplayer(function(player) + reset_bows(player) +end) + +minetest.register_on_leaveplayer(function(player) + reset_bow_state(player, true) +end) + +if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then + minetest.register_craft({ + output = 'mcl_bows:bow', + recipe = { + {'', 'mcl_core:stick', 'mcl_mobitems:string'}, + {'mcl_core:stick', '', 'mcl_mobitems:string'}, + {'', 'mcl_core:stick', 'mcl_mobitems:string'}, + } + }) + minetest.register_craft({ + output = 'mcl_bows:bow', + recipe = { + {'mcl_mobitems:string', 'mcl_core:stick', ''}, + {'mcl_mobitems:string', '', 'mcl_core:stick'}, + {'mcl_mobitems:string', 'mcl_core:stick', ''}, + } + }) +end + +minetest.register_craft({ + type = "fuel", + recipe = "mcl_bows:bow", + burntime = 15, +}) + +-- Add entry aliases for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("tools", "mcl_bows:bow", "tools", "mcl_bows:bow_0") + doc.add_entry_alias("tools", "mcl_bows:bow", "tools", "mcl_bows:bow_1") + doc.add_entry_alias("tools", "mcl_bows:bow", "tools", "mcl_bows:bow_2") +end + + diff --git a/mods/ITEMS/mcl_bows/depends.txt b/mods/ITEMS/mcl_bows/depends.txt new file mode 100644 index 00000000..08132ddb --- /dev/null +++ b/mods/ITEMS/mcl_bows/depends.txt @@ -0,0 +1,9 @@ +controls +awards? +mcl_achievements? +mcl_core? +mcl_mobitems? +playerphysics? +doc? +doc_identifier? +mesecons_button? diff --git a/mods/ITEMS/mcl_bows/init.lua b/mods/ITEMS/mcl_bows/init.lua new file mode 100644 index 00000000..a2745d95 --- /dev/null +++ b/mods/ITEMS/mcl_bows/init.lua @@ -0,0 +1,5 @@ +dofile(minetest.get_modpath("mcl_bows") .. "/arrow.lua") +dofile(minetest.get_modpath("mcl_bows") .. "/bow.lua") + +minetest.register_alias("mcl_throwing:bow", "mcl_bows:bow") +minetest.register_alias("mcl_throwing:arrow", "mcl_bows:arrow") diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr new file mode 100644 index 00000000..c3b42681 --- /dev/null +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr @@ -0,0 +1,15 @@ +# textdomain: mcl_bows +Arrow=Pfeil +Arrows are ammunition for bows and dispensers.=Pfeile sind Munition für Bögen und Werfer. +An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Ein Bogen von einem Pfeil richtet regulär 1-9 Schaden an. Mit voller Zugkraft gibt es eine 20%-ige Chance auf einen kritischen Treffer mit 10 Schaden. Ein Pfeil aus einem Werfer richtet immer 3 Schaden an. +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Pfeile können in festen Blöcken stecken bleiben und wieder aufgesammelt werden. Sie können auf Holzknöpfe drücken. +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Um Pfeile als Munition für dne Bogen zu benutzen, platzieren Sie sie einfach irgendwo im Inventar, sie werden automatisch benutzt. Um Pfeile als Munition für Werfer zu benutzen, platzieren Sie sie ins Inventar eines Werferr. Um einen steckengebliebenen Pfeil aufzusammeln, gehen Sie einfach zu ihm hin. +Bow=Bogen +Bows are ranged weapons to shoot arrows at your foes.=Bogen sind Fernwaffen, um Pfeile auf Ihre Feinde zu schießen. +The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=Die Geschwindigkeit und der Schaden des Bogens erhöht sich, je länger sie den Bogen spannen. Der reguläre Schaden des Pfeiles ist zwischen 1 und 9. Ist der Bogen voll gespannt, gibt es eine 20%-ig Change für einen kritischen Treffer, der 10 Schaden anrichtet. +To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Um den Bogen zu benutzen, muss sich im Inventar mindestens ein Pfeil befinden (außer im Kreativmodus). Halten sie die rechte Maustaste gedrückt zum Spannen, lassen Sie sie los zum Schießen. +Bow=Bogen +Ammunition=Munition +Damage from bow: 1-10=Schaden vom Bogen: 1-10 +Damage from dispenser: 3=Schaden vom Werfer: 3 +Launches arrows=Verschießt Pfeile diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr new file mode 100644 index 00000000..539afdcf --- /dev/null +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_bows +Arrow=Flecha +Arrows are ammunition for bows and dispensers.=Las flechas son municiones para arcos y dispensadores. +An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Una flecha disparada desde un arco tiene un daño regular de 1-9. A plena carga, hay un 20% de posibilidades de que un golpe crítico inflija 10 daños en su lugar. Una flecha disparada desde un dispensador siempre causa 3 de daño. +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Las flechas pueden atascarse en bloques sólidos y pueden recuperarse nuevamente. También son capaces de presionar botones de madera. +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Para usar flechas como municiones para un arco, simplemente colóquelas en cualquier parte de su inventario, se usarán automáticamente. Para usar flechas como municiones para un dispensador, colóquelas en el inventario del dispensador. Para recuperar una flecha que se pega en un bloque, simplemente camine cerca de ella. +Bow=Arco +Bows are ranged weapons to shoot arrows at your foes.=Los arcos son armas a distancia para disparar flechas a tus enemigos. +The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=La velocidad y el daño de la flecha aumentan cuanto más tiempo tenses. El daño regular de la flecha está entre 1 y 9. A plena carga, también hay un 20% de un golpe crítico, que en vez de eso causa 10 de daño. +To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Para usar el arco, primero debes de tener al menos una flecha en cualquier parte de su inventario (a menos que esté en modo creativo). Mantenga presionado el botón derecho del mouse para tensar, suelte para disparar. +Bow=Arco \ No newline at end of file diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr new file mode 100644 index 00000000..313081e4 --- /dev/null +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr @@ -0,0 +1,15 @@ +# textdomain: mcl_bows +Arrow=Flèche +Arrows are ammunition for bows and dispensers.=Les flèches sont des munitions pour les arcs et les distributeurs. +An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Une flèche tirée d'un arc a des dégâts réguliers de 1 à 9. À pleine charge, il y a 20% de chances qu'un coup critique inflige 10 dégâts à la place. Une flèche tirée depuis un distributeur inflige toujours 3 dégâts. +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Les flèches peuvent se coincer sur des blocs solides et peuvent être récupérées à nouveau. Ils sont également capables de pousser des boutons en bois. +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Pour utiliser des flèches comme munitions pour un arc, il suffit de les placer n'importe où dans votre inventaire, elles seront utilisées automatiquement. Pour utiliser des flèches comme munitions pour un distributeur, placez-les dans l'inventaire du distributeur. Pour récupérer une flèche qui colle dans un bloc, il vous suffit de vous en approcher. +Bow=Arc +Bows are ranged weapons to shoot arrows at your foes.=Les arcs sont des armes à distance pour tirer des flèches sur vos ennemis. +The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=La vitesse et les dégâts de la flèche augmentent plus vous chargez. Les dégâts réguliers de la flèche sont compris entre 1 et 9. À pleine charge, il y a également 20% d'un coup critique, infligeant 10 dégâts à la place. +To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Pour utiliser l'arc, vous devez d'abord avoir au moins une flèche n'importe où dans votre inventaire (sauf en mode créatif). Maintenez enfoncé le bouton droit de la souris pour charger, relâchez pour tirer. +Bow=Arc +Ammunition=Munition +Damage from bow: 1-10=Dégâts de l'arc: 1-10 +Damage from dispenser: 3=Dégâts du distributeur: 3 +Launches arrows=Lance des flèches diff --git a/mods/ITEMS/mcl_bows/locale/template.txt b/mods/ITEMS/mcl_bows/locale/template.txt new file mode 100644 index 00000000..228b6170 --- /dev/null +++ b/mods/ITEMS/mcl_bows/locale/template.txt @@ -0,0 +1,15 @@ +# textdomain: mcl_bows +Arrow= +Arrows are ammunition for bows and dispensers.= +An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.= +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.= +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.= +Bow= +Bows are ranged weapons to shoot arrows at your foes.= +The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.= +To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.= +Bow= +Ammunition= +Damage from bow: 1-10= +Damage from dispenser: 3= +Launches arrows= diff --git a/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_bow_shoot.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_bow_shoot.ogg similarity index 100% rename from mods/ITEMS/mcl_throwing/sounds/mcl_throwing_bow_shoot.ogg rename to mods/ITEMS/mcl_bows/sounds/mcl_bows_bow_shoot.ogg diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_hit_player.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_hit_player.ogg new file mode 100644 index 00000000..abf6163a Binary files /dev/null and b/mods/ITEMS/mcl_bows/sounds/mcl_bows_hit_player.ogg differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow.png new file mode 100644 index 00000000..278d910f Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_back.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_back.png new file mode 100644 index 00000000..18164e90 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_back.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_front.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_front.png new file mode 100644 index 00000000..054561f7 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_front.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_inv.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_inv.png new file mode 100644 index 00000000..bf324d62 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_inv.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow.png new file mode 100644 index 00000000..6df5c5b8 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_0.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_0.png new file mode 100644 index 00000000..f2867b2a Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_0.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_1.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_1.png new file mode 100644 index 00000000..881206eb Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_1.png differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow_2.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_2.png similarity index 100% rename from mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow_2.png rename to mods/ITEMS/mcl_bows/textures/mcl_bows_bow_2.png diff --git a/mods/ITEMS/mcl_buckets/depends.txt b/mods/ITEMS/mcl_buckets/depends.txt index e650ecc8..eb9bca8d 100644 --- a/mods/ITEMS/mcl_buckets/depends.txt +++ b/mods/ITEMS/mcl_buckets/depends.txt @@ -1,2 +1,4 @@ +mcl_worlds mcl_core? +mclx_core? doc? diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index 3d00f3dc..9918ef73 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_buckets") + -- Minetest 0.4 mod: bucket -- See README.txt for licensing and other information. @@ -7,6 +9,7 @@ minetest.register_alias("bucket:bucket_lava", "mcl_buckets:bucket_lava") local mod_doc = minetest.get_modpath("doc") local mod_mcl_core = minetest.get_modpath("mcl_core") +local mod_mclx_core = minetest.get_modpath("mclx_core") if mod_mcl_core then minetest.register_craft({ @@ -25,17 +28,23 @@ mcl_buckets.liquids = {} local sound_place = function(itemname, pos) local def = minetest.registered_nodes[itemname] if def and def.sounds and def.sounds.place then - minetest.sound_play(def.sounds.place, {gain=1.0, pos = pos}) + minetest.sound_play(def.sounds.place, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end end local sound_take = function(itemname, pos) local def = minetest.registered_nodes[itemname] if def and def.sounds and def.sounds.dug then - minetest.sound_play(def.sounds.dug, {gain=1.0, pos = pos}) + minetest.sound_play(def.sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end end +local place_liquid = function(pos, itemstring) + local fullness = minetest.registered_nodes[itemstring].liquid_range + sound_place(itemstring, pos) + minetest.add_node(pos, {name=itemstring, param2=fullness}) +end + -- Register a new liquid -- source_place = a string or function. -- * string: name of the node to place @@ -46,10 +55,13 @@ end -- name = user-visible bucket description -- longdesc = long explanatory description (for help) -- usagehelp = short usage explanation (for help) --- extra_check = optional function(pos) which can returns false to avoid placing the liquid +-- tt_help = very short tooltip help +-- extra_check(pos, placer) = optional function(pos) which can returns false to avoid placing the liquid. +-- placer is object/player who is placing the liquid, can be nil +-- groups = optional list of item groups -- -- This function can be called from any mod (which depends on this one) -function mcl_buckets.register_liquid(source_place, source_take, itemname, inventory_image, name, longdesc, usagehelp, extra_check) +function mcl_buckets.register_liquid(source_place, source_take, itemname, inventory_image, name, longdesc, usagehelp, tt_help, extra_check, groups) for i=1, #source_take do mcl_buckets.liquids[source_take[i]] = { source_place = source_place, @@ -66,9 +78,10 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent description = name, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, + _tt_help = tt_help, inventory_image = inventory_image, stack_max = 16, - liquids_pointable = true, + groups = groups, on_place = function(itemstack, user, pointed_thing) -- Must be pointing to node if pointed_thing.type ~= "node" then @@ -85,12 +98,6 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent end end - local place_liquid = function(pos, itemstring) - local fullness = minetest.registered_nodes[itemstring].liquid_range - sound_place(itemstring, pos) - minetest.add_node(pos, {name=itemstring, param2=fullness}) - end - local node_place if type(source_place) == "function" then node_place = source_place(place_pos) @@ -100,22 +107,13 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent -- Check if pointing to a buildable node local item = itemstack:get_name() - if extra_check and extra_check(place_pos) == false then + if extra_check and extra_check(place_pos, user) == false then -- Fail placement of liquid - elseif item == "mcl_buckets:bucket_water" and - (nn == "mcl_cauldrons:cauldron" or - nn == "mcl_cauldrons:cauldron_1" or - nn == "mcl_cauldrons:cauldron_2") then - -- Put water into cauldron - minetest.set_node(place_pos, {name="mcl_cauldrons:cauldron_3"}) - - sound_place("mcl_core:water_source", pos) - elseif item == "mcl_buckets:bucket_water" and nn == "mcl_cauldrons:cauldron_3" then - sound_place("mcl_core:water_source", pos) elseif minetest.registered_nodes[nn] and minetest.registered_nodes[nn].buildable_to then -- buildable; replace the node local pns = user:get_player_name() if minetest.is_protected(place_pos, pns) then + minetest.record_protection_violation(place_pos, pns) return itemstack end place_liquid(place_pos, node_place) @@ -129,6 +127,7 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent if minetest.registered_nodes[abovenode.name] and minetest.registered_nodes[abovenode.name].buildable_to then local pn = user:get_player_name() if minetest.is_protected(pointed_thing.above, pn) then + minetest.record_protection_violation(pointed_thing.above, pn) return itemstack end place_liquid(pointed_thing.above, node_place) @@ -153,7 +152,7 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent if inv:room_for_item("main", new_bucket) then inv:add_item("main", new_bucket) else - minetest.add_item(user:getpos(), new_bucket) + minetest.add_item(user:get_pos(), new_bucket) end itemstack:take_item() return itemstack @@ -161,23 +160,42 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent else return end - end + end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + local iname = stack:get_name() + local buildable = minetest.registered_nodes[dropnode.name].buildable_to + + if extra_check and extra_check(droppos, nil) == false then + -- Fail placement of liquid + elseif buildable then + -- buildable; replace the node + local node_place + if type(source_place) == "function" then + node_place = source_place(droppos) + else + node_place = source_place + end + place_liquid(droppos, node_place) + stack:set_name("mcl_buckets:bucket_empty") + end + return stack + end, }) end end minetest.register_craftitem("mcl_buckets:bucket_empty", { - description = "Empty Bucket", - _doc_items_longdesc = "A bucket can be used to collect and release liquids.", - _doc_items_usagehelp = "Punch a liquid source to collect the liquid. With the filled bucket, you can right-click somewhere to empty the bucket which will create a liquid source at the position you've clicked at.", + description = S("Empty Bucket"), + _doc_items_longdesc = S("A bucket can be used to collect and release liquids."), + _doc_items_usagehelp = S("Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else."), + _tt_help = S("Collects liquids"), inventory_image = "bucket.png", stack_max = 16, - liquids_pointable = true, on_place = function(itemstack, user, pointed_thing) -- Must be pointing to node if pointed_thing.type ~= "node" then - return + return itemstack end -- Call on_rightclick if the pointed node defines it @@ -189,8 +207,14 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { end end + -- Can't steal liquids + if minetest.is_protected(pointed_thing.above, user:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, user:get_player_name()) + return itemstack + end + -- Check if pointing to a liquid source - liquiddef = mcl_buckets.liquids[nn] + local liquiddef = mcl_buckets.liquids[nn] local new_bucket if liquiddef ~= nil and liquiddef.itemname ~= nil and (nn == liquiddef.source_take) then @@ -213,6 +237,13 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { new_bucket = ItemStack("mcl_buckets:bucket_water") end sound_take("mcl_core:water_source", pointed_thing.under) + elseif nn == "mcl_cauldrons:cauldron_3r" then + -- Take river water out of full cauldron + minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) + if not minetest.settings:get_bool("creative_mode") then + new_bucket = ItemStack("mcl_buckets:bucket_river_water") + end + sound_take("mclx_core:river_water_source", pointed_thing.under) end -- Add liquid bucket and put it into inventory, if possible. @@ -225,7 +256,7 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { if inv:room_for_item("main", new_bucket) then inv:add_item("main", new_bucket) else - minetest.add_item(user:getpos(), new_bucket) + minetest.add_item(user:get_pos(), new_bucket) end if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() @@ -234,33 +265,37 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { end end end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Fill empty bucket with liquid or drop bucket if no liquid + local collect_liquid = false + + local liquiddef = mcl_buckets.liquids[dropnode.name] + local new_bucket + if liquiddef ~= nil and liquiddef.itemname ~= nil and (dropnode.name == liquiddef.source_take) then + -- Fill bucket + new_bucket = ItemStack({name = liquiddef.itemname, metadata = tostring(dropnode.param2)}) + sound_take(dropnode.name, droppos) + collect_liquid = true + end + if collect_liquid then + minetest.set_node(droppos, {name="air"}) + + -- Fill bucket with liquid + stack = new_bucket + else + -- No liquid found: Drop empty bucket + minetest.add_item(droppos, stack) + stack:take_item() + end + return stack + end, }) if mod_mcl_core then - -- Water bucket - mcl_buckets.register_liquid( - "mcl_core:water_source", - {"mcl_core:water_source"}, - "mcl_buckets:bucket_water", - "bucket_water.png", - "Water Bucket", - "A bucket can be used to collect and release liquids. This one is filled with water.", - "Right-click on any block to empty the bucket and put a water source on this spot.", - function(pos) - local _, dim = mcl_util.y_to_layer(pos.y) - if dim == "nether" then - minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}) - return false - else - return true - end - end - ) - -- Lava bucket mcl_buckets.register_liquid( function(pos) - local _, dim = mcl_util.y_to_layer(pos.y) + local dim = mcl_worlds.pos_to_dimension(pos) if dim == "nether" then return "mcl_nether:nether_lava_source" else @@ -270,9 +305,94 @@ if mod_mcl_core then {"mcl_core:lava_source", "mcl_nether:nether_lava_source"}, "mcl_buckets:bucket_lava", "bucket_lava.png", - "Lava Bucket", - "A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.", - "Choose a place where you want to empty the bucket, then get in a safe spot somewhere above it. Be prepared to run away when something goes wrong as the lava will soon start to flow after placing. To empty the bucket (which places a lava source), right-click on your chosen place." + S("Lava Bucket"), + S("A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution."), + S("Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!"), + S("Places a lava source") + ) + + -- Water bucket + mcl_buckets.register_liquid( + "mcl_core:water_source", + {"mcl_core:water_source"}, + "mcl_buckets:bucket_water", + "bucket_water.png", + S("Water Bucket"), + S("A bucket can be used to collect and release liquids. This one is filled with water."), + S("Place it to empty the bucket and create a water source."), + S("Places a water source"), + function(pos, placer) + -- Check protection + local placer_name = "" + if placer ~= nil then + placer_name = placer:get_player_name() + end + if placer and minetest.is_protected(pos, placer_name) then + minetest.record_protection_violation(pos, placer_name) + return false + end + local nn = minetest.get_node(pos).name + -- Pour water into cauldron + if minetest.get_item_group(nn, "cauldron") ~= 0 then + -- Put water into cauldron + if nn ~= "mcl_cauldrons:cauldron_3" then + minetest.set_node(pos, {name="mcl_cauldrons:cauldron_3"}) + end + sound_place("mcl_core:water_source", pos) + return false + -- Evaporate water if used in Nether (except on cauldron) + else + local dim = mcl_worlds.pos_to_dimension(pos) + if dim == "nether" then + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + return false + end + end + end, + { water_bucket = 1 } + ) +end + +if mod_mclx_core then + -- River water bucket + mcl_buckets.register_liquid( + "mclx_core:river_water_source", + {"mclx_core:river_water_source"}, + "mcl_buckets:bucket_river_water", + "bucket_river_water.png", + S("River Water Bucket"), + S("A bucket can be used to collect and release liquids. This one is filled with river water."), + S("Place it to empty the bucket and create a river water source."), + S("Places a river water source"), + function(pos, placer) + -- Check protection + local placer_name = "" + if placer ~= nil then + placer_name = placer:get_player_name() + end + if placer and minetest.is_protected(pos, placer_name) then + minetest.record_protection_violation(pos, placer_name) + return false + end + local nn = minetest.get_node(pos).name + -- Pour into cauldron + if minetest.get_item_group(nn, "cauldron") ~= 0 then + -- Put water into cauldron + if nn ~= "mcl_cauldrons:cauldron_3r" then + minetest.set_node(pos, {name="mcl_cauldrons:cauldron_3r"}) + end + sound_place("mcl_core:water_source", pos) + return false + else + -- Evaporate water if used in Nether (except on cauldron) + local dim = mcl_worlds.pos_to_dimension(pos) + if dim == "nether" then + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + return false + end + end + end, + { water_bucket = 1 } ) end diff --git a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.de.tr b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.de.tr new file mode 100644 index 00000000..99d07109 --- /dev/null +++ b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.de.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_buckets +Empty Bucket=Leerer Eimer +A bucket can be used to collect and release liquids.=Ein Eimer kann benutzt werden, um Flüssigkeiten aufzusammeln und wieder freizulassen. +Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=Hauen Sie auf eine Flüssigkeitsquelle, um sie aufzusammeln. Sie können den vollen Eimer dann benutzen, um die Flüssigkeit woanders zu platzieren. +Lava Bucket=Lavaeimer +A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.=Ein Eimer kann benutzt werden, um Flüssigkeiten aufzusammeln und wieder freizulassen. Dieser hier ist voller heißer Lava, die sicher in ihm verstaut ist. Mit Vorsicht zu handhaben. +Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=Gehen Sie zu einer sicheren Stelle und platzieren Sie den Eimer, um ihn zu leeren und eine Lavaquelle an dieser Stelle zu erzeugen. Verbrennen Sie sich nicht! +Water Bucket=Wassereimer +A bucket can be used to collect and release liquids. This one is filled with water.=Ein Eimer kann benutzt werden, um Flüssigkeiten aufzusammeln und wieder freizulassen. Dieser hier ist mit Wasser gefüllt. +Place it to empty the bucket and create a water source.=Platzieren Sie ihn, um den Eimer zu leeren und eine Wasserquelle zu erzeugen. +River Water Bucket=Flusswassereimer +A bucket can be used to collect and release liquids. This one is filled with river water.=Ein Eimer kann benutzt werden, um Flüssigkeiten aufzusammeln und wieder freizulassen. Dieser hier ist mit Flusswasser gefüllt. +Place it to empty the bucket and create a river water source.=Platzieren Sie ihn, um den Eimer zu leeren und eine Flusswasserquelle zu erzeugen. +Collects liquids=Sammelt Flüssigkeiten auf +Places a lava source=Platziert eine Lavaquelle +Places a water source=Platziert eine Wasserquelle +Places a river water source=Platziert eine Flusswasserquelle diff --git a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.es.tr b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.es.tr new file mode 100644 index 00000000..27517a1a --- /dev/null +++ b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.es.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_buckets +Empty Bucket=Cubo vacío +A bucket can be used to collect and release liquids.=Se puede usar un cubo para recoger y liberar líquidos. +Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=Golpea una fuente de líquido para recolectarla. Luego puede usar el cubo lleno para colocar el líquido en otro lugar. +Lava Bucket=Cubo con lava +A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.=Se puede usar un cubo para recoger y liberar líquidos. Este está lleno de lava caliente, contenida de forma segura en el interior. Usar con precaución. +Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=Aléjate a una distancia segura y coloca el cubo para vaciarlo y crea una fuente de lava en este lugar. ¡No te quemes! +Water Bucket=Cubo con agua +A bucket can be used to collect and release liquids. This one is filled with water.=Se puede usar un cubo para recoger y liberar líquidos. Este está lleno de agua. +Place it to empty the bucket and create a water source.=Colóquelo para vaciar el cubo y crear una fuente de agua. +River Water Bucket=Cubo de agua de río +A bucket can be used to collect and release liquids. This one is filled with river water.=Se puede usar un cubo para recoger y liberar líquidos. Este está lleno de agua de río. +Place it to empty the bucket and create a river water source.=Colóquelo para vaciar el cubo y crear una fuente de agua de río. \ No newline at end of file diff --git a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.fr.tr b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.fr.tr new file mode 100644 index 00000000..4320f750 --- /dev/null +++ b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.fr.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_buckets +Empty Bucket=Seau Vide +A bucket can be used to collect and release liquids.=Un seau peut être utilisé pour recueillir et libérer les liquides. +Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=Frappez une source de liquide pour la collecter. Vous pouvez ensuite utiliser le seau rempli pour placer le liquide ailleurs. +Lava Bucket=Seau de Lave +A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.=Un seau peut être utilisé pour recueillir et libérer les liquides. Celui-ci est rempli de lave chaude, contenue en toute sécurité à l'intérieur. Utiliser avec précaution. +Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=Eloignez-vous et placez le seau pour le vider et créez une source de lave à cet endroit. Ne vous brûlez pas! +Water Bucket=Seau d'Eau +A bucket can be used to collect and release liquids. This one is filled with water.=Un seau peut être utilisé pour recueillir et libérer les liquides. Celui-ci est rempli d'eau. +Place it to empty the bucket and create a water source.=Placez-le pour vider le seau et créer une source d'eau. +River Water Bucket=Seau d'Eau de Rivière +A bucket can be used to collect and release liquids. This one is filled with river water.=Un seau peut être utilisé pour recueillir et libérer les liquides. Celui-ci est rempli d'eau de rivière. +Place it to empty the bucket and create a river water source.=Placez-le pour vider le seau et créer une source d'eau de rivière. +Collects liquids=Collecte des liquides +Places a lava source=Place une source de lave +Places a water source=Place une source d'eau +Places a river water source=Place une source d'eau de rivière diff --git a/mods/ITEMS/mcl_buckets/locale/template.txt b/mods/ITEMS/mcl_buckets/locale/template.txt new file mode 100644 index 00000000..174d1b76 --- /dev/null +++ b/mods/ITEMS/mcl_buckets/locale/template.txt @@ -0,0 +1,17 @@ +# textdomain: mcl_buckets +Empty Bucket= +A bucket can be used to collect and release liquids.= +Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.= +Lava Bucket= +A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.= +Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!= +Water Bucket= +A bucket can be used to collect and release liquids. This one is filled with water.= +Place it to empty the bucket and create a water source.= +River Water Bucket= +A bucket can be used to collect and release liquids. This one is filled with river water.= +Place it to empty the bucket and create a river water source.= +Collects liquids= +Places a lava source= +Places a water source= +Places a river water source= diff --git a/mods/ITEMS/mcl_buckets/textures/bucket_river_water.png b/mods/ITEMS/mcl_buckets/textures/bucket_river_water.png new file mode 100644 index 00000000..5e58c92f Binary files /dev/null and b/mods/ITEMS/mcl_buckets/textures/bucket_river_water.png differ diff --git a/mods/ITEMS/mcl_cake/init.lua b/mods/ITEMS/mcl_cake/init.lua index 4683ce75..9f9dd204 100644 --- a/mods/ITEMS/mcl_cake/init.lua +++ b/mods/ITEMS/mcl_cake/init.lua @@ -3,6 +3,10 @@ #!#!#!#Released under CC Attribution-ShareAlike 3.0 Unported #!#!# ]]-- +local CAKE_HUNGER_POINTS = 2 + +local S = minetest.get_translator("mcl_cake") + local cake_texture = {"cake_top.png","cake_bottom.png","cake_inner.png","cake_side.png","cake_side.png","cake_side.png"} local slice_1 = { -7/16, -8/16, -7/16, -5/16, 0/16, 7/16} local slice_2 = { -7/16, -8/16, -7/16, -3/16, 0/16, 7/16} @@ -28,9 +32,10 @@ minetest.register_craft({ }) minetest.register_node("mcl_cake:cake", { - description = "Cake", - _doc_items_longdesc = "Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.", - _doc_items_usagehelp = "Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.", + description = S("Cake"), + _tt_help = S("With 7 tasty slices!").."\n"..S("Hunger points: +@1 per slice", CAKE_HUNGER_POINTS), + _doc_items_longdesc = S("Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken."), + _doc_items_usagehelp = S("Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full."), tiles = {"cake_top.png","cake_bottom.png","cake_side.png","cake_side.png","cake_side.png","cake_side.png"}, inventory_image = "cake.png", wield_image = "cake.png", @@ -46,12 +51,18 @@ minetest.register_node("mcl_cake:cake", { fixed = full_cake }, stack_max = 1, - groups = {handy=1, cake=7, food=2,no_eat_delay=1, attached_node=1, dig_by_piston=1}, + groups = {handy=1, cake=7, food=2,no_eat_delay=1, attached_node=1, dig_by_piston=1, comparator_signal=14}, drop = '', on_rightclick = function(pos, node, clicker, itemstack) + -- Cake is subject to protection + local name = clicker:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end local newcake = minetest.do_item_eat(2, ItemStack("mcl_cake:cake_6"), ItemStack("mcl_cake:cake"), clicker, {type="nothing"}) -- Check if we were allowed to eat - if newcake:get_name() ~= "mcl_cake:cake" then + if newcake:get_name() ~= "mcl_cake:cake" or minetest.settings:get_bool("creative_mode") == true then minetest.add_node(pos,{type="node",name="mcl_cake:cake_6",param2=0}) end end, @@ -59,7 +70,7 @@ minetest.register_node("mcl_cake:cake", { _food_particles = false, _mcl_saturation = 0.4, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) @@ -69,18 +80,28 @@ local register_slice = function(level, nodebox, desc) local on_rightclick if level > 1 then on_rightclick = function(pos, node, clicker, itemstack) - local newcake = minetest.do_item_eat(2, ItemStack(after_eat), ItemStack(this), clicker, {type="nothing"}) + local name = clicker:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack(after_eat), ItemStack(this), clicker, {type="nothing"}) -- Check if we were allowed to eat - if newcake:get_name() ~= this then + if newcake:get_name() ~= this or minetest.settings:get_bool("creative_mode") == true then minetest.add_node(pos,{type="node",name=after_eat,param2=0}) end end else -- Last slice on_rightclick = function(pos, node, clicker, itemstack) - local newcake = minetest.do_item_eat(2, ItemStack("mcl:cake:cake 0"), ItemStack("mcl_cake:cake_1"), clicker, {type="nothing"}) + local name = clicker:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack("mcl:cake:cake 0"), ItemStack("mcl_cake:cake_1"), clicker, {type="nothing"}) -- Check if we were allowed to eat - if newcake:get_name() ~= this then + if newcake:get_name() ~= this or minetest.settings:get_bool("creative_mode") == true then minetest.remove_node(pos) core.check_for_falling(pos) end @@ -102,14 +123,14 @@ local register_slice = function(level, nodebox, desc) type = "fixed", fixed = nodebox, }, - groups = {handy=1, cake=level, food=2,no_eat_delay=1,attached_node=1,not_in_creative_inventory=1,dig_by_piston=1}, + groups = {handy=1, cake=level, food=2,no_eat_delay=1,attached_node=1,not_in_creative_inventory=1,dig_by_piston=1,comparator_signal=level*2}, drop = '', on_rightclick = on_rightclick, sounds = mcl_sounds.node_sound_leaves_defaults(), _food_particles = false, _mcl_saturation = 0.4, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) @@ -118,9 +139,9 @@ local register_slice = function(level, nodebox, desc) end end -register_slice(6, slice_6, "Cake (6 Slices Left") -register_slice(5, slice_5, "Cake (5 Slices Left") -register_slice(4, slice_4, "Cake (4 Slices Left") -register_slice(3, slice_3, "Cake (3 Slices Left") -register_slice(2, slice_2, "Cake (2 Slices Left") -register_slice(1, slice_1, "Cake (1 Slice Left") +register_slice(6, slice_6, S("Cake (6 Slices Left)")) +register_slice(5, slice_5, S("Cake (5 Slices Left)")) +register_slice(4, slice_4, S("Cake (4 Slices Left)")) +register_slice(3, slice_3, S("Cake (3 Slices Left)")) +register_slice(2, slice_2, S("Cake (2 Slices Left)")) +register_slice(1, slice_1, S("Cake (1 Slice Left)")) diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr new file mode 100644 index 00000000..f5af4f30 --- /dev/null +++ b/mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_cake +Cake=Kuchen +Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Kuchen können platziert und gegessen werden, um Hungerpunkte wiederherzustellen. Ein Kuchen hat 7 Stücke. Jedes Stück stellt 2 Hungerpunkte und 0,4 Sättigungspunkte wieder her. Kuchen werden zerstört, wenn sie abgebaut werden oder der Block unter ihnen bricht. +Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Platzieren Sie ihn irgendwo, dann rechtsklicken Sie auf ihn, um ein Stück zu essen. Sie können nicht vom Kuchen naschen, wenn ihre Hungerleiste voll ist. +Cake (6 Slices Left)=Kuchen (6 Stücke übrig) +Cake (5 Slices Left)=Kuchen (5 Stücke übrig) +Cake (4 Slices Left)=Kuchen (4 Stücke übrig) +Cake (3 Slices Left)=Kuchen (3 Stücke übrig) +Cake (2 Slices Left)=Kuchen (2 Stücke übrig) +Cake (1 Slice Left)=Kuchen (1 Stück übrig) +With 7 tasty slices!=Mit 7 leckeren Stücken! +Hunger points: +@1 per slice=Hungerpunkte: +@1 pro Stück diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr new file mode 100644 index 00000000..261d581e --- /dev/null +++ b/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_cake +Cake=Tarta +Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Los pasteles se pueden colocar y comer para restaurar los puntos de hambre. Un pastel tiene 7 trozos. Cada trozo restaura 2 puntos de hambre y 0.4 puntos de saturación. Los pasteles se destruirán cuando se caven o cuando se rompa el bloque debajo de ellos. +Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Coloque el pastel en cualquier lugar, luego haga clic derecho para comer una sola trozo. No puedes comer del pastel cuando tu barra de hambre está llena. +Cake (6 Slices Left)=Tarta (Quedan 6 trozos) +Cake (5 Slices Left)=Tarta (Quedan 5 trozos) +Cake (4 Slices Left)=Tarta (Quedan 4 trozos) +Cake (3 Slices Left)=Tarta (Quedan 3 trozos) +Cake (2 Slices Left)=Tarta (Quedan 2 trozos) +Cake (1 Slice Left)=Tarta (Queda 1 trozo) diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.fr.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.fr.tr new file mode 100644 index 00000000..06e3b7ce --- /dev/null +++ b/mods/ITEMS/mcl_cake/locale/mcl_cake.fr.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_cake +Cake=Gâteau +Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Les gâteaux peuvent être placés et mangés pour restaurer les points de faim. Un gâteau a 7 tranches. Chaque tranche restaure 2 points de faim et 0,4 points de saturation. Les gâteaux seront détruits lorsqu'ils seront creusés ou lorsque le bloc en dessous d'eux sera brisé. +Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Placez le gâteau n'importe où, puis faites un clic droit pour manger une seule tranche. Vous ne pouvez pas manger du gâteau lorsque votre barre de faim est pleine. +Cake (6 Slices Left)=Gâteau (reste 6 tranches) +Cake (5 Slices Left)=Gâteau (reste 5 tranches) +Cake (4 Slices Left)=Gâteau (reste 4 tranches) +Cake (3 Slices Left)=Gâteau (reste 3 tranches) +Cake (2 Slices Left)=Gâteau (reste 2 tranches) +Cake (1 Slice Left)=Gâteau (reste 1 tranche) +With 7 tasty slices!=Avec 7 tranches savoureuses! +Hunger points: +@1 per slice=Points de faim: +@1 par tranche diff --git a/mods/ITEMS/mcl_cake/locale/template.txt b/mods/ITEMS/mcl_cake/locale/template.txt new file mode 100644 index 00000000..080e7395 --- /dev/null +++ b/mods/ITEMS/mcl_cake/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: mcl_cake +Cake= +Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.= +Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.= +Cake (6 Slices Left)= +Cake (5 Slices Left)= +Cake (4 Slices Left)= +Cake (3 Slices Left)= +Cake (2 Slices Left)= +Cake (1 Slice Left)= +With 7 tasty slices!= +Hunger points: +@1 per slice= diff --git a/mods/ITEMS/mcl_cake/textures/cake.png b/mods/ITEMS/mcl_cake/textures/cake.png index 736faa6d..db340bd7 100644 Binary files a/mods/ITEMS/mcl_cake/textures/cake.png and b/mods/ITEMS/mcl_cake/textures/cake.png differ diff --git a/mods/ITEMS/mcl_cake/textures/cake_bottom.png b/mods/ITEMS/mcl_cake/textures/cake_bottom.png index d64db7f7..d7f8602b 100644 Binary files a/mods/ITEMS/mcl_cake/textures/cake_bottom.png and b/mods/ITEMS/mcl_cake/textures/cake_bottom.png differ diff --git a/mods/ITEMS/mcl_cake/textures/cake_side.png b/mods/ITEMS/mcl_cake/textures/cake_side.png index 3d4643e4..f69be02c 100644 Binary files a/mods/ITEMS/mcl_cake/textures/cake_side.png and b/mods/ITEMS/mcl_cake/textures/cake_side.png differ diff --git a/mods/ITEMS/mcl_cake/textures/cake_top.png b/mods/ITEMS/mcl_cake/textures/cake_top.png index 576c3fe8..667a5b32 100644 Binary files a/mods/ITEMS/mcl_cake/textures/cake_top.png and b/mods/ITEMS/mcl_cake/textures/cake_top.png differ diff --git a/mods/ITEMS/mcl_cauldrons/depends.txt b/mods/ITEMS/mcl_cauldrons/depends.txt index cbc0405c..2c344c60 100644 --- a/mods/ITEMS/mcl_cauldrons/depends.txt +++ b/mods/ITEMS/mcl_cauldrons/depends.txt @@ -1,3 +1,4 @@ mcl_core +mclx_core? mcl_sounds doc? diff --git a/mods/ITEMS/mcl_cauldrons/init.lua b/mods/ITEMS/mcl_cauldrons/init.lua index e2fa6852..7f0592b2 100644 --- a/mods/ITEMS/mcl_cauldrons/init.lua +++ b/mods/ITEMS/mcl_cauldrons/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_cauldron") + -- Cauldron mod, adds cauldrons. -- TODO: Extinguish fire of burning entities @@ -42,16 +44,16 @@ end -- Empty cauldron minetest.register_node("mcl_cauldrons:cauldron", { - description = "Cauldron", - _doc_items_longdesc = "Cauldrons are used to store water and slowly fill up under rain.", - _doc_items_usagehelp = "Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.", + description = S("Cauldron"), + _tt_help = S("Stores water"), + _doc_items_longdesc = S("Cauldrons are used to store water and slowly fill up under rain."), + _doc_items_usagehelp = S("Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water."), wield_image = "mcl_cauldrons_cauldron.png", inventory_image = "mcl_cauldrons_cauldron.png", drawtype = "nodebox", paramtype = "light", is_ground_content = false, - sunlight_propagates = true, - groups = {pickaxey=1, deco_block=1}, + groups = {pickaxey=1, deco_block=1, cauldron=1}, node_box = cauldron_nodeboxes[0], selection_box = { type = "regular" }, tiles = { @@ -61,43 +63,56 @@ minetest.register_node("mcl_cauldrons:cauldron", { }, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_hardness = 2, - _mcl_blast_resistance = 10, + _mcl_blast_resistance = 2, }) -- Template function for cauldrons with water -local register_filled_cauldron = function(water_level, description) - minetest.register_node("mcl_cauldrons:cauldron_"..water_level, { +local register_filled_cauldron = function(water_level, description, river_water) + local id = "mcl_cauldrons:cauldron_"..water_level + local water_tex + if river_water then + id = id .. "r" + water_tex = "default_river_water_source_animated.png^[verticalframe:16:0" + else + water_tex = "default_water_source_animated.png^[verticalframe:16:0" + end + minetest.register_node(id, { description = description, _doc_items_create_entry = false, drawtype = "nodebox", paramtype = "light", is_ground_content = false, - sunlight_propagates = true, - groups = {pickaxey=1, not_in_creative_inventory=1}, + groups = {pickaxey=1, not_in_creative_inventory=1, cauldron=(1+water_level), comparator_signal=water_level}, node_box = cauldron_nodeboxes[water_level], collision_box = cauldron_nodeboxes[0], selection_box = { type = "regular" }, tiles = { - "(default_water_source_animated.png^[verticalframe:16:0)^mcl_cauldrons_cauldron_top.png", + "("..water_tex..")^mcl_cauldrons_cauldron_top.png", "mcl_cauldrons_cauldron_inner.png^mcl_cauldrons_cauldron_bottom.png", "mcl_cauldrons_cauldron_side.png" }, sounds = mcl_sounds.node_sound_metal_defaults(), drop = "mcl_cauldrons:cauldron", _mcl_hardness = 2, - _mcl_blast_resistance = 10, + _mcl_blast_resistance = 2, }) -- Add entry aliases for the Help if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_cauldrons:cauldron", "nodes", "mcl_cauldrons:cauldron_"..water_level) + doc.add_entry_alias("nodes", "mcl_cauldrons:cauldron", "nodes", id) end end --- Filled crauldrons (3 levels) -register_filled_cauldron(1, "Cauldron (One Third Full)") -register_filled_cauldron(2, "Cauldron (Two Thirds Full)") -register_filled_cauldron(3, "Cauldron (Full)") +-- Filled cauldrons (3 levels) +register_filled_cauldron(1, S("Cauldron (1/3 Water)")) +register_filled_cauldron(2, S("Cauldron (2/3 Water)")) +register_filled_cauldron(3, S("Cauldron (3/3 Water)")) + +if minetest.get_modpath("mclx_core") then + register_filled_cauldron(1, S("Cauldron (1/3 River Water)"), true) + register_filled_cauldron(2, S("Cauldron (2/3 River Water)"), true) + register_filled_cauldron(3, S("Cauldron (3/3 River Water)"), true) +end minetest.register_craft({ output = "mcl_cauldrons:cauldron", diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr new file mode 100644 index 00000000..72432b04 --- /dev/null +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_cauldron +Cauldron=Kessel +Cauldrons are used to store water and slowly fill up under rain.=Kessel werden benutzt, um Wasser zu lagern, im Regen werden sie langsam aufgefüllt. +Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water.=Platzieren Sie einen Wassereinmer in den Kessel, um ihn mit Wasser zu füllen. Platzieren Sie einen leeren Eimer auf einen vollen Kessel, um das Wasser aufzusammeln. Platzieren Sie eine Wasserflasche in den Kessel, um ihn zu einem Drittel mit Wasser zu füllen. +Cauldron (1/3 Water)=Kessel (1/3 Wasser) +Cauldron (2/3 Water)=Kessel (2/3 Wasser) +Cauldron (3/3 Water)=Kessel (3/3 Wasser) +Cauldron (1/3 River Water)=Kessel (1/3 Wasser) +Cauldron (2/3 River Water)=Kessel (2/3 Flusswasser) +Cauldron (3/3 River Water)=Kessel (3/3 Flusswasser) +Stores water=Speichert Wasser diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr new file mode 100644 index 00000000..5f7f9fc3 --- /dev/null +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_cauldron +Cauldron=Caldera +Cauldrons are used to store water and slowly fill up under rain.=Los calderos se usan para almacenar agua y llenarse lentamente bajo la lluvia. +Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water.=Coloque un cubo de agua en el caldero para llenarlo con agua. Coloque un cubo vacío en un caldero lleno para recuperar el agua. Coloque una botella de agua en el caldero para llenar el caldero hasta un tercio con agua. Coloque una botella de vidrio en un caldero con agua para recuperar un tercio del agua. +Cauldron (1/3 Water)=Caldera (1/3 de agua) +Cauldron (2/3 Water)=Caldera (2/3 de agua) +Cauldron (3/3 Water)=Caldera (3/3 de agua) +Cauldron (1/3 River Water)=Caldera (1/3 de agua de río) +Cauldron (2/3 River Water)=Caldera (2/3 de agua de río) +Cauldron (3/3 River Water)=Caldera (3/3 de agua de río) \ No newline at end of file diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr new file mode 100644 index 00000000..03b0e9be --- /dev/null +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_cauldron +Cauldron=Chaudrons +Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Les chaudrons sont utilisés pour stocker l'eau et se remplissent lentement sous la pluie. Ils peuvent également être utilisés pour laver les bannières. +Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Placez une marmite d'eau dans le chaudron pour le remplir d'eau. Placez un seau vide sur un chaudron plein pour récupérer l'eau. Placez une bouteille d'eau dans le chaudron pour remplir le chaudron au tiers avec de l'eau. Placez une bouteille en verre dans un chaudron avec de l'eau pour récupérer un tiers de l'eau. Utilisez une bannière blasonnée sur un chaudron avec de l'eau pour laver sa couche supérieure. +Cauldron (1/3 Water)=Chaudron (1/3 d'eau) +Cauldron (2/3 Water)=Chaudron (2/3 d'eau) +Cauldron (3/3 Water)=Chaudron (3/3 d'eau) +Cauldron (1/3 River Water)=Chaudron (1/3 d'eau de rivière) +Cauldron (2/3 River Water)=Chaudron (2/3 d'eau de rivière) +Cauldron (3/3 River Water)=Chaudron (3/3 d'eau de rivière) +Stores water=Stocke l'eau diff --git a/mods/ITEMS/mcl_cauldrons/locale/template.txt b/mods/ITEMS/mcl_cauldrons/locale/template.txt new file mode 100644 index 00000000..b4385631 --- /dev/null +++ b/mods/ITEMS/mcl_cauldrons/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: mcl_cauldron +Cauldron= +Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.= +Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.= +Cauldron (1/3 Water)= +Cauldron (2/3 Water)= +Cauldron (3/3 Water)= +Cauldron (1/3 River Water)= +Cauldron (2/3 River Water)= +Cauldron (3/3 River Water)= +Stores water= diff --git a/mods/ITEMS/mcl_cauldrons/textures/mcl_cauldrons_cauldron.png b/mods/ITEMS/mcl_cauldrons/textures/mcl_cauldrons_cauldron.png index d373012f..b4a51c31 100644 Binary files a/mods/ITEMS/mcl_cauldrons/textures/mcl_cauldrons_cauldron.png and b/mods/ITEMS/mcl_cauldrons/textures/mcl_cauldrons_cauldron.png differ diff --git a/mods/ITEMS/mcl_chests/depends.txt b/mods/ITEMS/mcl_chests/depends.txt index 0d2cf397..af11d5f6 100644 --- a/mods/ITEMS/mcl_chests/depends.txt +++ b/mods/ITEMS/mcl_chests/depends.txt @@ -1,6 +1,8 @@ mcl_init +mcl_formspec mcl_core mcl_sounds mcl_end mesecons doc? +screwdriver? diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 99779182..3d36aa13 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1,24 +1,140 @@ --- This is a helper function to register both chests and trapped chests. Trapped chests will make use of the additional parameters -local register_chest = function(basename, desc, longdesc, usagehelp, hidden, mesecons, on_rightclick_addendum, on_rightclick_addendum_left, on_rightclick_addendum_right, drop) +local S = minetest.get_translator("mcl_chests") +local mod_doc = minetest.get_modpath("doc") +local no_rotate, simple_rotate +if minetest.get_modpath("screwdriver") then + no_rotate = screwdriver.disallow + simple_rotate = screwdriver.rotate_simple +end + +--[[ List of open chests. +Key: Player name +Value: + If player is using a chest: { pos = } + Otherwise: nil ]] +local open_chests = {} +-- To be called if a player opened a chest +local player_chest_open = function(player, pos) + open_chests[player:get_player_name()] = { pos = pos } +end + +-- Simple protection checking functions +local protection_check_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end +end +local protection_check_put_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end +end + +local trapped_chest_mesecons_rules = mesecon.rules.pplate + +-- To be called when a chest is closed (only relevant for trapped chest atm) +local chest_update_after_close = function(pos) + local node = minetest.get_node(pos) + + if node.name == "mcl_chests:trapped_chest_on" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + elseif node.name == "mcl_chests:trapped_chest_on_left" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + elseif node.name == "mcl_chests:trapped_chest_on_right" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) + mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + end +end + +-- To be called if a player closed a chest +local player_chest_close = function(player) + local name = player:get_player_name() + if open_chests[name] == nil then + return + end + local pos = open_chests[name].pos + chest_update_after_close(pos) + + open_chests[name] = nil +end + +-- This is a helper function to register both chests and trapped chests. Trapped chests will make use of the additional parameters +local register_chest = function(basename, desc, longdesc, usagehelp, tt_help, tiles_table, hidden, mesecons, on_rightclick_addendum, on_rightclick_addendum_left, on_rightclick_addendum_right, drop, canonical_basename) +-- START OF register_chest FUNCTION BODY if not drop then drop = "mcl_chests:"..basename else drop = "mcl_chests:"..drop end +-- The basename of the "canonical" version of the node, if set (e.g.: trapped_chest_on → trapped_chest). +-- Used to get a shared formspec ID and to swap the node back to the canonical version in on_construct. +if not canonical_basename then + canonical_basename = basename +end + +local double_chest_add_item = function(top_inv, bottom_inv, listname, stack) + if not stack or stack:is_empty() then + return + end + + local name = stack:get_name() + + local top_off = function(inv, stack) + for c, chest_stack in ipairs(inv:get_list(listname)) do + if stack:is_empty() then + break + end + + if chest_stack:get_name() == name and chest_stack:get_free_space() > 0 then + stack = chest_stack:add_item(stack) + inv:set_stack(listname, c, chest_stack) + end + end + + return stack + end + + stack = top_off(top_inv, stack) + stack = top_off(bottom_inv, stack) + + if not stack:is_empty() then + stack = top_inv:add_item(listname, stack) + if not stack:is_empty() then + bottom_inv:add_item(listname, stack) + end + end +end minetest.register_node("mcl_chests:"..basename, { description = desc, + _tt_help = tt_help, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, _doc_items_hidden = hidden, - tiles = {"default_chest_top.png", "mcl_chests_chest_bottom.png", - "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", - "mcl_chests_chest_back.png", "default_chest_front.png"}, + tiles = tiles_table.small, + paramtype = "light", paramtype2 = "facedir", stack_max = 64, drop = drop, - groups = {handy=1,axey=1, container=2, deco_block=1, material_wood=1}, + groups = {handy=1,axey=1, container=2, deco_block=1, material_wood=1,flammable=-1}, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) @@ -26,7 +142,7 @@ minetest.register_node("mcl_chests:"..basename, { local meta = minetest.get_meta(pos) --[[ This is a workaround for Minetest issue 5894 . - Apparently if we don't do this, double chests initially don't work when + Apparently if we don't do this, large chests initially don't work when placed at chunk borders, and some chests randomly don't work after placing. ]] -- FIXME: Remove this workaround when the bug has been fixed. @@ -46,14 +162,16 @@ minetest.register_node("mcl_chests:"..basename, { -- BEGIN OF LISTRING WORKAROUND inv:set_size("input", 1) -- END OF LISTRING WORKAROUND - if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == "mcl_chests:"..basename then - minetest.swap_node(pos, {name="mcl_chests:"..basename.."_right",param2=param2}) + if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == "mcl_chests:"..canonical_basename then + minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_right",param2=param2}) local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") - minetest.swap_node(p, { name = "mcl_chests:"..basename.."_left", param2 = param2 }) - elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..basename then - minetest.swap_node(pos, {name="mcl_chests:"..basename.."_left",param2=param2}) + minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_left", param2 = param2 }) + elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename then + minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_left",param2=param2}) local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") - minetest.swap_node(p, { name = "mcl_chests:"..basename.."_right", param2 = param2 }) + minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_right", param2 = param2 }) + else + minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename, param2 = param2 }) end end, after_dig_node = function(pos, oldnode, oldmetadata, digger) @@ -70,6 +188,9 @@ minetest.register_node("mcl_chests:"..basename, { end meta:from_table(meta2:to_table()) end, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, + allow_metadata_inventory_put = protection_check_put_take, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in chest at "..minetest.pos_to_string(pos)) @@ -93,14 +214,16 @@ minetest.register_node("mcl_chests:"..basename, { on_rightclick = function(pos, node, clicker) minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. - mcl_vars.inventory_header.. - "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. - "image[0,-0.2;5,0.75;mcl_chests_fnt_chest.png]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Chest"))).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. + mcl_formspec.get_itemslot_bg(0,0.5,9,3).. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]".. "listring[current_player;main]") @@ -108,27 +231,53 @@ minetest.register_node("mcl_chests:"..basename, { on_rightclick_addendum(pos, node, clicker) end end, + + on_destruct = function(pos) + local players = minetest.get_connected_players() + for p=1, #players do + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + end + end, mesecons = mesecons, + on_rotate = simple_rotate, }) minetest.register_node("mcl_chests:"..basename.."_left", { - tiles = {"default_chest_top_big.png", "default_chest_top_big.png", "mcl_chests_chest_right.png", - "mcl_chests_chest_left.png", "default_chest_side_big.png^[transformFX", "default_chest_front_big.png"}, + tiles = tiles_table.left, + paramtype = "light", paramtype2 = "facedir", - groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1}, + groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1,flammable=-1}, drop = drop, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), + on_construct = function(pos) + local n = minetest.get_node(pos) + local param2 = n.param2 + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") + if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_right" then + n.name = "mcl_chests:"..canonical_basename + minetest.swap_node(pos, n) + end + end, on_destruct = function(pos) local n = minetest.get_node(pos) if n.name == "mcl_chests:"..basename then return end + + local players = minetest.get_connected_players() + for p=1, #players do + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + end + local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_right" then return end + for pl=1, #players do + minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) + end minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) end, after_dig_node = function(pos, oldnode, oldmetadata, digger) @@ -145,9 +294,15 @@ minetest.register_node("mcl_chests:"..basename.."_left", { end meta:from_table(meta2:to_table()) end, - -- BEGIN OF LISTRING WORKAROUND + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "input" then + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + -- BEGIN OF LISTRING WORKAROUND + elseif listname == "input" then local inv = minetest.get_inventory({type="node", pos=pos}) if inv:room_for_item("main", stack) then return -1 @@ -160,11 +315,11 @@ minetest.register_node("mcl_chests:"..basename.."_left", { return 0 end end + -- END OF LISTRING WORKAROUND else return stack:get_count() end end, - -- END OF LISTRING WORKAROUND on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in chest at "..minetest.pos_to_string(pos)) @@ -175,12 +330,10 @@ minetest.register_node("mcl_chests:"..basename.."_left", { -- BEGIN OF LISTRING WORKAROUND if listname == "input" then local inv = minetest.get_inventory({type="node", pos=pos}) - local leftover = inv:add_item("main", stack) - if not leftover:is_empty() then - local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") - local other_inv = minetest.get_inventory({type="node", pos=other_pos}) - other_inv:add_item("main", leftover) - end + local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") + local other_inv = minetest.get_inventory({type="node", pos=other_pos}) + + double_chest_add_item(inv, other_inv, "main", stack) end -- END OF LISTRING WORKAROUND end, @@ -195,14 +348,18 @@ minetest.register_node("mcl_chests:"..basename.."_left", { local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. - mcl_vars.inventory_header.. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Large Chest"))).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. + mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. + mcl_formspec.get_itemslot_bg(0,3.5,9,3).. + "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. + mcl_formspec.get_itemslot_bg(0,10.75,9,1).. -- BEGIN OF LISTRING WORKAROUND "listring[current_player;main]".. "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";input]".. @@ -217,26 +374,45 @@ minetest.register_node("mcl_chests:"..basename.."_left", { end end, mesecons = mesecons, + on_rotate = no_rotate, }) minetest.register_node("mcl_chests:"..basename.."_right", { - tiles = {"default_chest_top_big.png^[transformFX", "default_chest_top_big.png^[transformFX", "mcl_chests_chest_right.png", - "mcl_chests_chest_left.png", "default_chest_side_big.png", "default_chest_front_big.png^[transformFX"}, + tiles = tiles_table.right, + paramtype = "light", paramtype2 = "facedir", - groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1}, + groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1,flammable=-1}, drop = drop, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), + on_construct = function(pos) + local n = minetest.get_node(pos) + local param2 = n.param2 + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") + if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_left" then + n.name = "mcl_chests:"..canonical_basename + minetest.swap_node(pos, n) + end + end, on_destruct = function(pos) local n = minetest.get_node(pos) if n.name == "mcl_chests:"..basename then return end + + local players = minetest.get_connected_players() + for p=1, #players do + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + end + local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_left" then return end + for pl=1, #players do + minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) + end minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) end, after_dig_node = function(pos, oldnode, oldmetadata, digger) @@ -253,9 +429,15 @@ minetest.register_node("mcl_chests:"..basename.."_right", { end meta:from_table(meta2:to_table()) end, - -- BEGIN OF LISTRING WORKAROUND + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "input" then + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + -- BEGIN OF LISTRING WORKAROUND + elseif listname == "input" then local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") local other_inv = minetest.get_inventory({type="node", pos=other_pos}) if other_inv:room_for_item("main", stack) then @@ -268,11 +450,11 @@ minetest.register_node("mcl_chests:"..basename.."_right", { return 0 end end + -- END OF LISTRING WORKAROUND else return stack:get_count() end end, - -- END OF LISTRING WORKAROUND on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in chest at "..minetest.pos_to_string(pos)) @@ -284,11 +466,9 @@ minetest.register_node("mcl_chests:"..basename.."_right", { if listname == "input" then local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") local other_inv = minetest.get_inventory({type="node", pos=other_pos}) - local leftover = other_inv:add_item("main", stack) - if not leftover:is_empty() then - local inv = minetest.get_inventory({type="node", pos=pos}) - inv:add_item("main", leftover) - end + local inv = minetest.get_inventory({type="node", pos=pos}) + + double_chest_add_item(other_inv, inv, "main", stack) end -- END OF LISTRING WORKAROUND end, @@ -303,15 +483,19 @@ minetest.register_node("mcl_chests:"..basename.."_right", { local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. - mcl_vars.inventory_header.. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Large Chest"))).."]".. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. + mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. + mcl_formspec.get_itemslot_bg(0,3.5,9,3).. + "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. + mcl_formspec.get_itemslot_bg(0,10.75,9,1).. -- BEGIN OF LISTRING WORKAROUND "listring[current_player;main]".. "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";input]".. @@ -326,155 +510,153 @@ minetest.register_node("mcl_chests:"..basename.."_right", { end end, mesecons = mesecons, + on_rotate = no_rotate, }) -if minetest.get_modpath("doc") then +if mod_doc then doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_left") doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_right") end +-- END OF register_chest FUNCTION BODY end +local chestusage = S("To access its inventory, rightclick it. When broken, the items will drop out.") + register_chest("chest", - "Chest", - "Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.", - "To acccess the inventory of a chest or large chest, rightclick it. When broken, the items of the chest will drop out.", + S("Chest"), + S("Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other."), + chestusage, + S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest"), + { + small = {"default_chest_top.png", "mcl_chests_chest_bottom.png", + "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", + "mcl_chests_chest_back.png", "default_chest_front.png"}, + left = {"default_chest_top_big.png", "default_chest_top_big.png", + "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", + "default_chest_side_big.png^[transformFX", "default_chest_front_big.png"}, + right = {"default_chest_top_big.png^[transformFX", "default_chest_top_big.png^[transformFX", + "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", + "default_chest_side_big.png", "default_chest_front_big.png^[transformFX"}, + }, false ) -local trapped_chest_mesecons_rules = { - {x = 1, y = 0, z = 0}, - {x = -1, y = 0, z = 0}, - {x = 0, y = 0, z = 1}, - {x = 0, y = 0, z =-1}, - {x = 0, y =-1, z = 0} +local traptiles = { + small = {"mcl_chests_chest_trapped_top.png", "mcl_chests_chest_trapped_bottom.png", + "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", + "mcl_chests_chest_trapped_back.png", "mcl_chests_chest_trapped_front.png"}, + left = {"mcl_chests_chest_trapped_top_big.png", "mcl_chests_chest_trapped_top_big.png", + "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", + "mcl_chests_chest_trapped_side_big.png^[transformFX", "mcl_chests_chest_trapped_front_big.png"}, + right = {"mcl_chests_chest_trapped_top_big.png^[transformFX", "mcl_chests_chest_trapped_top_big.png^[transformFX", + "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", + "mcl_chests_chest_trapped_side_big.png", "mcl_chests_chest_trapped_front_big.png^[transformFX"}, } register_chest("trapped_chest", - "Trapped Chest", - "A trapped chest is a container which provides 27 inventory slots. It looks identical to a regular chest, but when it is opened, it sends a redstone signal to its adjacent blocks. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.", - "To acccess the inventory of a trapped chest or a large trapped chest, rightclick it. When broken, the items will drop out.", + S("Trapped Chest"), + S("A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other."), + chestusage, + S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest") .. "\n" .. S("Emits a redstone signal when opened"), + traptiles, nil, {receptor = { state = mesecon.state.off, rules = trapped_chest_mesecons_rules, }}, function(pos, node, clicker) - local meta = minetest.get_meta(pos) - meta:set_int("players", 1) minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on", param2 = node.param2}) - mesecon:receptor_on(pos, trapped_chest_mesecons_rules) + mesecon.receptor_on(pos, trapped_chest_mesecons_rules) + player_chest_open(clicker, pos) end, function(pos, node, clicker) local meta = minetest.get_meta(pos) meta:set_int("players", 1) minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - mesecon:receptor_on(pos, trapped_chest_mesecons_rules) + mesecon.receptor_on(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_right", param2 = node.param2}) - mesecon:receptor_on(pos_other, trapped_chest_mesecons_rules) + mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) + + player_chest_open(clicker, pos) end, function(pos, node, clicker) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - -- Save number of players in left part of the chest only - local meta = minetest.get_meta(pos_other) - meta:set_int("players", 1) - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_right", param2 = node.param2}) - mesecon:receptor_on(pos, trapped_chest_mesecons_rules) + mesecon.receptor_on(pos, trapped_chest_mesecons_rules) minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - mesecon:receptor_on(pos_other, trapped_chest_mesecons_rules) + mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) + + player_chest_open(clicker, pos) end ) register_chest("trapped_chest_on", - nil, nil, nil, true, + nil, nil, nil, nil, traptiles, true, {receptor = { state = mesecon.state.on, rules = trapped_chest_mesecons_rules, }}, function(pos, node, clicker) - local meta = minetest.get_meta(pos) - local players = meta:get_int("players") - players = players + 1 - meta:set_int("players", players) + player_chest_open(clicker, pos) end, function(pos, node, clicker) - local meta = minetest.get_meta(pos) - local players = meta:get_int("players") - players = players + 1 - meta:set_int("players", players) + player_chest_open(clicker, pos) end, function(pos, node, clicker) - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - local meta = minetest.get_meta(pos_other) - local players = meta:get_int("players") - players = players + 1 - meta:set_int("players", players) + player_chest_open(clicker, pos) end, + "trapped_chest", "trapped_chest" ) +local function close_if_trapped_chest(pos, player) + local node = minetest.get_node(pos) + + if node.name == "mcl_chests:trapped_chest_on" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + player_chest_close(player) + elseif node.name == "mcl_chests:trapped_chest_on_left" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + + player_chest_close(player) + elseif node.name == "mcl_chests:trapped_chest_on_right" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) + mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + + player_chest_close(player) + end +end + -- Disable trapped chest when it has been closed minetest.register_on_player_receive_fields(function(player, formname, fields) if formname:find("mcl_chests:trapped_chest_") == 1 then if fields.quit then - local x, y, z = formname:match("mcl_chests:trapped_chest_(.-)_(.-)_(.*)") - local pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} - if not pos or not pos.x or not pos.y or not pos.z then return end - local node = minetest.get_node(pos) - local meta, players, pos_other - if node.name == "mcl_chests:trapped_chest_on" or node.name == "mcl_chests:trapped_chest_on_left" then - meta = minetest.get_meta(pos) - players = meta:get_int("players") - players = players - 1 - elseif node.name == "mcl_chests:trapped_chest_on_right" then - pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - meta = minetest.get_meta(pos_other) - players = meta:get_int("players") - players = players - 1 - end - - if node.name == "mcl_chests:trapped_chest_on" then - if players <= 0 then - meta:set_int("players", 0) - minetest.swap_node(pos, {name="mcl_chests:trapped_chest", param2 = node.param2}) - mesecon:receptor_off(pos, trapped_chest_mesecons_rules) - else - meta:set_int("players", players) - end - elseif node.name == "mcl_chests:trapped_chest_on_left" then - if players <= 0 then - meta:set_int("players", 0) - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - mesecon:receptor_off(pos, trapped_chest_mesecons_rules) - - pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon:receptor_off(pos_other, trapped_chest_mesecons_rules) - else - meta:set_int("players", players) - end - elseif node.name == "mcl_chests:trapped_chest_on_right" then - if players <= 0 then - meta:set_int("players", 0) - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon:receptor_off(pos, trapped_chest_mesecons_rules) - - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - mesecon:receptor_off(pos_other, trapped_chest_mesecons_rules) - else - meta:set_int("players", players) - end - end + player_chest_close(player) end end end) +minetest.register_on_leaveplayer(function(player) + player_chest_close(player) +end) + minetest.register_craft({ output = 'mcl_chests:chest', recipe = { @@ -496,10 +678,24 @@ minetest.register_craft({ burntime = 15 }) +local formspec_ender_chest = "size[9,8.75]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]".. + "list[current_player;enderchest;0,0.5;9,3;]".. + mcl_formspec.get_itemslot_bg(0,0.5,9,3).. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "listring[current_player;enderchest]".. + "listring[current_player;main]" + + minetest.register_node("mcl_chests:ender_chest", { - description = "Ender Chest", - _doc_items_longdesc = "Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests worldwide. Each player will only see their own items, but not the items of other players.", - _doc_items_usagehelp = "Rightclick the ender chest to access your personal interdimensional inventory.", + description = S("Ender Chest"), + _tt_help = S("27 interdimensional inventory slots") .. "\n" .. S("Put items inside, retrieve them from any ender chest"), + _doc_items_longdesc = S("Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), + _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), tiles = {"mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png", "mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_left.png", "mcl_chests_ender_chest_back.png", "mcl_chests_ender_chest_front.png"}, @@ -514,19 +710,21 @@ minetest.register_node("mcl_chests:ender_chest", { drop = "mcl_core:obsidian 8", on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "size[9,8.75]".. - mcl_vars.inventory_header.. - "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. - "image[0,-0.2;5,0.75;mcl_chests_fnt_ender_chest.png]".. - "list[current_player;enderchest;0,0.5;9,3;]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]".. - "listring[current_player;enderchest]".. - "listring[current_player;main]") + meta:set_string("formspec", formspec_ender_chest) end, _mcl_blast_resistance = 3000, _mcl_hardness = 22.5, + on_rotate = simple_rotate, +}) + +minetest.register_lbm({ + label = "Update ender chest + shulker box formspecs (0.51.0)", + name = "mcl_chests:update_formspecs_0_51_0", + nodenames = { "mcl_chests:ender_chest", "group:shulker_box" }, + action = function(pos, node) + minetest.registered_nodes[node.name].on_construct(pos) + minetest.log("action", "[mcl_chests] Node formspec updated at "..minetest.pos_to_string(pos)) + end, }) minetest.register_on_joinplayer(function(player) @@ -545,22 +743,22 @@ minetest.register_craft({ -- Shulker boxes local boxtypes = { - white = "White Shulker Box", - grey = "Light Grey Shulker Box", - orange = "Orange Shulker Box", - cyan = "Cyan Shulker Box", - magenta = "Magenta Shulker Box", - violet = "Purple Shulker Box", - lightblue = "Light Blue Shulker Box", - blue = "Blue Shulker Box", - yellow = "Yellow Shulker Box", - brown = "Brown Shulker Box", - green = "Lime Shulker Box", - dark_green = "Green Shulker Box", - pink = "Pink Shulker Box", - red = "Red Shulker Box", - dark_grey = "Grey Shulker Box", - black = "Black Shulker Box", + white = S("White Shulker Box"), + grey = S("Light Grey Shulker Box"), + orange = S("Orange Shulker Box"), + cyan = S("Cyan Shulker Box"), + magenta = S("Magenta Shulker Box"), + violet = S("Purple Shulker Box"), + lightblue = S("Light Blue Shulker Box"), + blue = S("Blue Shulker Box"), + yellow = S("Yellow Shulker Box"), + brown = S("Brown Shulker Box"), + green = S("Lime Shulker Box"), + dark_green = S("Green Shulker Box"), + pink = S("Pink Shulker Box"), + red = S("Red Shulker Box"), + dark_grey = S("Grey Shulker Box"), + black = S("Black Shulker Box"), } local shulker_mob_textures = { @@ -581,13 +779,41 @@ local shulker_mob_textures = { dark_grey = "mobs_mc_shulker_gray.png", black = "mobs_mc_shulker_black.png", } +local canonical_shulker_color = "violet" + +local formspec_shulker_box = "size[9,8.75]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Shulker Box"))).."]".. + "list[current_name;main;0,0.5;9,3;]".. + mcl_formspec.get_itemslot_bg(0,0.5,9,3).. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "listring[current_name;main]".. + "listring[current_player;main]" for color, desc in pairs(boxtypes) do local mob_texture = shulker_mob_textures[color] + local is_canonical = color == canonical_shulker_color + local longdesc, usagehelp, create_entry, entry_name + if mod_doc then + if is_canonical then + longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.") + usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.") + entry_name = S("Shulker Box") + else + create_entry = false + end + end + minetest.register_node("mcl_chests:"..color.."_shulker_box", { description = desc, - _doc_items_longdesc = "A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.", - _doc_items_usagehelp = "To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.", + _tt_help = S("27 inventory slots") .. "\n" .. S("Can be carried around with its contents"), + _doc_items_create_entry = create_entry, + _doc_items_entry_name = entry_name, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, tiles = { "mcl_chests_"..color.."_shulker_box_top.png", -- top "[combine:16x16:-32,-28="..mob_texture, -- bottom @@ -602,26 +828,28 @@ for color, desc in pairs(boxtypes) do stack_max = 1, drop = "", paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", -- TODO: Make shulker boxes rotatable -- This doesn't work, it just destroys the inventory: -- on_place = minetest.rotate_node, on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "size[9,8.75]".. - mcl_vars.inventory_header.. - "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. - "image[0,-0.2;5,0.75;mcl_chests_fnt_shulker_box.png]".. - "list[current_name;main;0,0.5;9,3;]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]".. - "listring[current_name;main]".. - "listring[current_player;main]") + meta:set_string("formspec", formspec_shulker_box) local inv = meta:get_inventory() inv:set_size("main", 9*3) end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Place shulker box as node + if minetest.registered_nodes[dropnode.name].buildable_to then + minetest.set_node(droppos, {name = stack:get_name(), param2 = minetest.dir_to_facedir(dropdir)}) + local imeta = stack:get_metadata() + local iinv_main = minetest.deserialize(imeta) + local ninv = minetest.get_inventory({type="node", pos=droppos}) + ninv:set_list("main", iinv_main) + stack:take_item() + end + return stack + end, after_place_node = function(pos, placer, itemstack, pointed_thing) local nmeta = minetest.get_meta(pos) local ninv = nmeta:get_inventory() @@ -659,7 +887,14 @@ for color, desc in pairs(boxtypes) do minetest.add_item(pos, boxitem) end end, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end -- Do not allow to place shulker boxes into shulker boxes local group = minetest.get_item_group(stack:get_name(), "shulker_box") if group == 0 or group == nil then @@ -672,6 +907,10 @@ for color, desc in pairs(boxtypes) do _mcl_hardness = 6, }) + if mod_doc and not is_canonical then + doc.add_entry_alias("nodes", "mcl_chests:"..canonical_shulker_color.."_shulker_box", "nodes", "mcl_chests:"..color.."_shulker_box") + end + minetest.register_craft({ type = "shapeless", output = 'mcl_chests:'..color..'_shulker_box', @@ -688,3 +927,61 @@ minetest.register_craft({ } }) +-- Save metadata of shulker box when used in crafting +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + local new = itemstack:get_name() + if minetest.get_item_group(itemstack:get_name(), "shulker_box") ~= 1 then + return + end + local original + for i = 1, #old_craft_grid do + local item = old_craft_grid[i]:get_name() + if minetest.get_item_group(item, "shulker_box") == 1 then + original = old_craft_grid[i] + break + end + end + if original then + local ometa = original:get_meta():to_table() + local nmeta = itemstack:get_meta() + nmeta:from_table(ometa) + return itemstack + end +end) + + +minetest.register_lbm({ + -- Disable active/open trapped chests when loaded because nobody could + -- have them open at loading time. + -- Fixes redstone weirdness. + label = "Disable active trapped chests", + name = "mcl_chests:reset_trapped_chests", + nodenames = { "mcl_chests:trapped_chest_on", "mcl_chests:trapped_chest_on_left", "mcl_chests:trapped_chest_on_right" }, + run_at_every_load = true, + action = function(pos, node) + minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " ..minetest.pos_to_string(pos)) + chest_update_after_close(pos) + end, +}) + +-- Legacy +minetest.register_lbm({ + label = "Update ender chest formspecs (0.60.0)", + name = "mcl_chests:update_ender_chest_formspecs_0_60_0", + nodenames = { "mcl_chests:ender_chest" }, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec_ender_chest) + end, +}) +minetest.register_lbm({ + label = "Update shulker box formspecs (0.60.0)", + name = "mcl_chests:update_shulker_box_formspecs_0_60_0", + nodenames = { "group:shulker_box" }, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec_shulker_box) + end, +}) diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr new file mode 100644 index 00000000..b4ef7969 --- /dev/null +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_chests +Chest=Truhe +Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Truhen sind Behälter, die 27 Inventarplätze Platz bieten. Truhen verwandeln sich in große Truhen mit der doppelten Kapazität, wenn zwei Truhen nebeneinander platziert werden. +To access its inventory, rightclick it. When broken, the items will drop out.=Um auf das Inventar zuzugreifen, rechtsklicken Sie darauf. Wenn abgebaut, wird der Inhalt hinausfallen. +Trapped Chest=Mechanismustruhe +A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Mechanismustruhen sind Behälter, die 27 Inventarplätze Platz bieten. Wenn sie geöffnet wird, sendet sie ein Redstone-Signal zu benachbarten Blöcken, solange sie geöffnet bleibt. Mechanismustruhen verwandeln sich in große Mechanismustruhen mit der doppelten Kapazität, wenn zwei Mechanismustruhen nebeneinander platziert werden. +Ender Chest=Endertruhe +Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Endertruhen gewähren Ihnen Zugriff zu einem einzigartigen persönlichen interdimensionalen Inventar mit 27 Plätzen. Dieses Inventar ist das selbe, egal, welche Endertruhe sie benutzen. Wenn Sie einen Gegenstand in eine Endertruhe platzieren, werden Sie sie in allen anderen Endertruhen vorhinden. Jeder Spieler wird nur seine eigenen Gegenstände sehen, aber nicht die der anderen Spieler. +Rightclick the ender chest to access your personal interdimensional inventory.=Rechtsklicken Sie die Endertruhe, um auf Ihr persönliches interdimensionales Inventar zuzugreifen. +White Shulker Box=Weiße Schulkerkiste +Light Grey Shulker Box=Hellgraue Schulkerkiste +Orange Shulker Box=Orange Schulkerkiste +Cyan Shulker Box=Türkise Schulkerkiste +Magenta Shulker Box=Magenta Schulkerkiste +Purple Shulker Box=Violette Schulkerkiste +Light Blue Shulker Box=Hellblaue Schulkerkiste +Blue Shulker Box=Blaue Schulkerkiste +Yellow Shulker Box=Gelbe Schulkerkiste +Brown Shulker Box=Braune Schulkerkiste +Lime Shulker Box=Lindgrüne Schulkerkiste +Green Shulker Box=Grüne Schulkerkiste +Pink Shulker Box=Rosa Schulkerkiste +Red Shulker Box=Rote Schulkerkiste +Grey Shulker Box=Graue Schulkerkiste +Black Shulker Box=Schwarze Schulkerkiste +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Eine Schulkerkiste ist ein tragbarer Behälter, der 27 Inventarplätze für alle Gegenstände außer Schulkerkisten bietet. Schulkerkisten behalten ihr Inventar, wenn sie abgebaut werden, also können Schulkerkisten so wie ihr Inhalt als einzelne Gegenstände mitgenommen werden. Schulkerkisten gibt es in vielen verschiedenen Farben. +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.=Um auf das Inventar einer Schulkerkiste zuzugreifen, platzieren Sie sie und rechtsklicken sie auf ihr. Um eine Schulkerkiste und ihren Inhalt mitzunehmen, bauen Sie sie einfach ab und sammeln Sie sie auf, der Inhalt will nicht hinausfallen. +Shulker Box=Schulkerkiste +Large Chest=Große Truhe +Inventory=Inventar +27 inventory slots=27 Inventarplätze +Can be carried around with its contents=Kann mitsamt Inhalt transportiert werden +Can be combined to a large chest=Kann zu einer großen Truhe kombiniert werden +27 interdimensional inventory slots=27 interdimensionale Inventarplätze +Put items inside, retrieve them from any ender chest=Abgelegte Gegenstände können aus beliebigen Endertruhen genommen werden +Emits a redstone signal when opened=Sendet ein Redstonesignal beim Öffnen diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.es.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.es.tr new file mode 100644 index 00000000..9d44bacc --- /dev/null +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.es.tr @@ -0,0 +1,30 @@ +# textdomain: mcl_chests +Chest=Cofre +Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Los cofres son contenedores que proporcionan 27 ranuras de inventario. Los cofres se pueden convertir en cofres grandes con el doble de capacidad colocando dos cofres uno al lado del otro. +To access its inventory, rightclick it. When broken, the items will drop out.=Para acceder a su inventario, haga clic derecho. Cuando se rompen, los artículos se caerán. +Trapped Chest=Cofre trampa +A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Un sofre trampa es un contenedor que proporciona 27 ranuras de inventario. Cuando se abre, envía una señal de redstone a sus bloques adyacentes siempre que permanezca abierto. Los cofres trampa se pueden convertir en grandes cofres trampa con el doble de capacidad colocando dos cofres atrapados uno al lado del otro. +Ender Chest=Cofre de ender +Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Los cofres Ender le otorgan acceso a un único inventario interdimensional personal con 27 ranuras. Este inventario es el mismo sin importar desde qué cofre de acceso accedas. Si pones un elemento en un cofre de ender, lo encontrarás en todos los demás cofres de ender. Cada jugador solo verá sus propios artículos, pero no los artículos de otros jugadores. +Rightclick the ender chest to access your personal interdimensional inventory.=Haga clic derecho en el cofre ender para acceder a su inventario interdimensional personal. +White Shulker Box=Caja de shulker Blanca +Light Grey Shulker Box=Caja de shulker gris claro +Orange Shulker Box=Caja de shulker naranja +Cyan Shulker Box=Caja de shulker cian +Magenta Shulker Box=Caja de shulker magenta +Purple Shulker Box=Caja de shulker morada +Light Blue Shulker Box=Caja de shulker azul claro +Blue Shulker Box=Caja de shulker azul +Yellow Shulker Box=Caja de shulker amarilla +Brown Shulker Box=Caja de shulker marrón +Lime Shulker Box=Caja de shulker verde lima +Green Shulker Box=Caja de shulker verde +Pink Shulker Box=Caja de shulker rosa +Red Shulker Box=Caja de shulker roja +Grey Shulker Box=Caja de shulker gris +Black Shulker Box=Caja de shulker negra +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Una caja de shulker es un contenedor portátil que proporciona 27 ranuras de inventario para cualquier artículo, excepto las cajas shulker. Las cajas de shulker mantienen su inventario cuando están rotas, por lo que las cajas de shulker y sus contenidos se pueden tomar como un solo artículo. Las cajas shulker vienen en muchos colores diferentes. +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.=Para acceder al inventario de un cuadro de shulker, colóquelo y haga clic con el botón derecho. Para llevar una caja de shulker y su contenido, solo rómpela y recójala, los artículos no se caerán. +Shulker Box=Caja de shulker +Large Chest=Arcón +Inventory=Inventario diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr new file mode 100644 index 00000000..b84dac02 --- /dev/null +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_chests +Chest=Coffre +Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Les coffres sont des conteneurs qui offrent 27 emplacements d'inventaire. Les coffres peuvent être transformés en grands coffres avec une capacité double en plaçant deux coffres l'un à côté de l'autre. +To access its inventory, rightclick it. When broken, the items will drop out.=Pour accéder à son inventaire, faites un clic droit dessus. Une fois cassés, les articles tomberont. +Trapped Chest=Coffre Piégé +A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Un coffre piégé est un conteneur qui fournit 27 emplacements d'inventaire. Lorsqu'il est ouvert, il envoie un signal redstone à ses blocs adjacents tant qu'il reste ouvert. Les coffres piégés peuvent être transformés en grands coffres piégés avec une capacité double en plaçant deux coffres piégés l'un à côté de l'autre. +Ender Chest=Coffre Ender +Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Les coffres Ender vous donnent accès à un seul inventaire interdimensionnel personnel avec 27 emplacements. Cet inventaire est le même quel que soit le coffre d'ender d'où vous y accédez. Si vous placez un objet dans un coffre d'ender, vous le trouverez dans tous les autres coffres d'ender. Chaque joueur ne verra que ses propres objets, mais pas ceux des autres joueurs. +Rightclick the ender chest to access your personal interdimensional inventory.=Faites un clic droit sur le coffre d'ender pour accéder à votre inventaire interdimensionnel personnel. +White Shulker Box=Boîte de Shulter Blanche +Light Grey Shulker Box=Boîte de Shulter Gris Clair +Orange Shulker Box=Boîte de Shulter Orange +Cyan Shulker Box=Boîte de Shulter Cyan +Magenta Shulker Box=Boîte de Shulter Magenta +Purple Shulker Box=Boîte de Shulter Violette +Light Blue Shulker Box=Boîte de Shulter Bleu Clair +Blue Shulker Box=Boîte de Shulter Bleue +Yellow Shulker Box=Boîte de Shulter Jaune +Brown Shulker Box=Boîte de Shulter Marron +Lime Shulker Box=Boîte de Shulter Vert Clair +Green Shulker Box=Boîte de Shulter Verte +Pink Shulker Box=Boîte de Shulter Rose +Red Shulker Box=Boîte de Shulter Rouge +Grey Shulker Box=Boîte de Shulter Grise +Black Shulker Box=Boîte de Shulter Noire +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Une boîte shulker est un conteneur portable qui fournit 27 emplacements d'inventaire pour tout article, à l'exception des boîtes shulker. Les boîtes Shulker conservent leur inventaire lorsqu'elles sont brisées, de sorte que les boîtes Shulker ainsi que leur contenu peuvent être considérés comme un seul élément. Les boîtes Shulker sont disponibles dans de nombreuses couleurs différentes. +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.=Pour accéder à l'inventaire d'une boîte shulker, placez-la et cliquez dessus avec le bouton droit. Pour emporter une boîte shulker et son contenu, il suffit de la casser et de la récupérer, les objets ne tomberont pas. Replacez la boîte shulker pour pouvoir récupérer son contenu. +Shulker Box=Boîte de Shulter +Large Chest=Coffre Large +Inventory=Inventaire +27 inventory slots=27 emplacements d'inventaire +Can be carried around with its contents=Peut être transporté avec son contenu +Can be combined to a large chest=Peut être combiné à un grand coffre +27 interdimensional inventory slots=27 emplacements d'inventaire interdimensionnels +Put items inside, retrieve them from any ender chest=Mettez des objets à l'intérieur, récupérez-les dans n'importe quel coffre +Emits a redstone signal when opened=Émet un signal redstone à l'ouverture diff --git a/mods/ITEMS/mcl_chests/locale/template.txt b/mods/ITEMS/mcl_chests/locale/template.txt new file mode 100644 index 00000000..d680c24c --- /dev/null +++ b/mods/ITEMS/mcl_chests/locale/template.txt @@ -0,0 +1,36 @@ +# textdomain: mcl_chests +Chest= +Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.= +To access its inventory, rightclick it. When broken, the items will drop out.= +Trapped Chest= +A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.= +Ender Chest= +Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.= +Rightclick the ender chest to access your personal interdimensional inventory.= +White Shulker Box= +Light Grey Shulker Box= +Orange Shulker Box= +Cyan Shulker Box= +Magenta Shulker Box= +Purple Shulker Box= +Light Blue Shulker Box= +Blue Shulker Box= +Yellow Shulker Box= +Brown Shulker Box= +Lime Shulker Box= +Green Shulker Box= +Pink Shulker Box= +Red Shulker Box= +Grey Shulker Box= +Black Shulker Box= +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.= +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.= +Shulker Box= +Large Chest= +Inventory= +27 inventory slots= +Can be carried around with its contents= +Can be combined to a large chest= +27 interdimensional inventory slots= +Put items inside, retrieve them from any ender chest= +Emits a redstone signal when opened= diff --git a/mods/ITEMS/mcl_chests/textures/default_chest_top_big.png b/mods/ITEMS/mcl_chests/textures/default_chest_top_big.png index de56e2ca..b8b2696b 100644 Binary files a/mods/ITEMS/mcl_chests/textures/default_chest_top_big.png and b/mods/ITEMS/mcl_chests/textures/default_chest_top_big.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_black_shulker_box_top.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_black_shulker_box_top.png index df859694..a8564e42 100644 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_black_shulker_box_top.png and b/mods/ITEMS/mcl_chests/textures/mcl_chests_black_shulker_box_top.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_back.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_back.png new file mode 100644 index 00000000..f347e921 Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_back.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_bottom.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_bottom.png new file mode 100644 index 00000000..cb43e55e Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_bottom.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_front.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_front.png new file mode 100644 index 00000000..67cc716b Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_front.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_front_big.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_front_big.png new file mode 100644 index 00000000..b65bfc23 Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_front_big.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_left.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_left.png new file mode 100644 index 00000000..d420aaba Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_left.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_right.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_right.png new file mode 100644 index 00000000..4536ada8 Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_right.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_side_big.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_side_big.png new file mode 100644 index 00000000..deb00680 Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_side_big.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_top.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_top.png new file mode 100644 index 00000000..5c1beb4b Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_top.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_top_big.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_top_big.png new file mode 100644 index 00000000..b8b2696b Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_chest_trapped_top_big.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender.png new file mode 100644 index 00000000..8a59e5ce Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_bottom.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_bottom.png index 03a61a59..2cf3d49d 100644 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_bottom.png and b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_bottom.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_left.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_left.png index 1a0ceaef..e22d3366 100644 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_left.png and b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_left.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_right.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_right.png index f547532f..d7600a0a 100644 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_right.png and b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_right.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_top.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_top.png index c109aa82..94f198c1 100644 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_top.png and b/mods/ITEMS/mcl_chests/textures/mcl_chests_ender_chest_top.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_chest.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_chest.png deleted file mode 100644 index e57e7efb..00000000 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_chest.png and /dev/null differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_ender_chest.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_ender_chest.png deleted file mode 100644 index b470cfd1..00000000 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_ender_chest.png and /dev/null differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_shulker_box.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_shulker_box.png deleted file mode 100644 index aa2aad61..00000000 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_shulker_box.png and /dev/null differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_inventory_chest.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_inventory_chest.png deleted file mode 100644 index 01cac232..00000000 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_inventory_chest.png and /dev/null differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_inventory_chest_large.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_inventory_chest_large.png deleted file mode 100644 index bb7b96af..00000000 Binary files a/mods/ITEMS/mcl_chests/textures/mcl_chests_inventory_chest_large.png and /dev/null differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_normal.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_normal.png new file mode 100644 index 00000000..5133f53f Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_normal.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_normal_double.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_normal_double.png new file mode 100644 index 00000000..a8793f60 Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_chests_normal_double.png differ diff --git a/mods/ITEMS/mcl_clock/depends.txt b/mods/ITEMS/mcl_clock/depends.txt index 0430af2c..514d7814 100644 --- a/mods/ITEMS/mcl_clock/depends.txt +++ b/mods/ITEMS/mcl_clock/depends.txt @@ -1,3 +1,4 @@ -mcl_core +mcl_init +mcl_worlds mesecons doc? diff --git a/mods/ITEMS/mcl_clock/init.lua b/mods/ITEMS/mcl_clock/init.lua index c011b1ee..0532bf5f 100644 --- a/mods/ITEMS/mcl_clock/init.lua +++ b/mods/ITEMS/mcl_clock/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_clock") + --[[ mcl_clock, renew of the renew of the watch mod @@ -12,10 +14,21 @@ mcl_clock.stereotype = "mcl_clock:clock" local watch = {} watch.old_time = -1 --- Image of all 64 possible faces +local clock_frames = 64 + +-- Timer for random clock spinning +local random_timer = 0.0 +local random_timer_trigger = 1.0 -- random clock spinning tick in seconds. Increase if there are performance problems +local random_frame = math.random(0, clock_frames-1) + +-- Image of all possible faces watch.images = {} -for frame=0,63 do - table.insert(watch.images, "mcl_clock_clock.png^[verticalframe:64:"..frame) +for frame=0, clock_frames-1 do + local sframe = tostring(frame) + if string.len(sframe) == 1 then + sframe = "0" .. sframe + end + table.insert(watch.images, "mcl_clock_clock_"..sframe..".png") end local function round(num) @@ -23,9 +36,9 @@ local function round(num) end function watch.get_clock_frame() - local t = 64 * minetest.get_timeofday() + local t = clock_frames * minetest.get_timeofday() t = round(t) - if t == 64 then t = 0 end + if t == clock_frames then t = 0 end return tostring(t) end @@ -41,18 +54,20 @@ function watch.register_item(name, image, creative, frame) if doc_mod and not use_doc then doc.add_entry_alias("craftitems", mcl_clock.stereotype, "craftitems", name) end - local longdesc, usagehelp + local longdesc, usagehelp, tt if use_doc then - longdesc = "Clocks are tools which shows the current time of day in the Overworld." - usagehelp = "The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol." + longdesc = S("Clocks are tools which shows the current time of day in the Overworld.") + usagehelp = S("The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.") + tt = S("Displays the time of day in the Overworld") end minetest.register_craftitem(name, { - description = "Clock", + description = S("Clock"), + _tt_help = tt, _doc_items_create_entry = use_doc, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, inventory_image = image, - groups = {not_in_creative_inventory=g, tool=1, clock=frame}, + groups = {not_in_creative_inventory=g, tool=1, clock=frame, disable_repair=1}, wield_image = "", stack_max = 64, }) @@ -65,6 +80,12 @@ local force_clock_update_timer = 0 minetest.register_globalstep(function(dtime) local now = watch.get_clock_frame() force_clock_update_timer = force_clock_update_timer + dtime + random_timer = random_timer + dtime + -- This causes the random spinning of the clock + if random_timer >= random_timer_trigger then + random_frame = (random_frame + math.random(-4, 4)) % clock_frames + random_timer = 0 + end if watch.old_time == now and force_clock_update_timer < 60 then return @@ -76,11 +97,19 @@ minetest.register_globalstep(function(dtime) local players = minetest.get_connected_players() for p, player in ipairs(players) do for s, stack in ipairs(player:get_inventory():get_list("main")) do + local dim = mcl_worlds.pos_to_dimension(player:get_pos()) + local frame + -- Clocks do not work in certain zones + if not mcl_worlds.clock_works(player:get_pos()) then + frame = random_frame + else + frame = now + end local count = stack:get_count() if stack:get_name() == mcl_clock.stereotype then - player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count) - elseif string.sub(stack:get_name(), 1, 16) == "mcl_clock:clock_" then - player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count) + player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..frame.." "..count) + elseif minetest.get_item_group(stack:get_name(), "clock") ~= 0 then + player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..frame.." "..count) end end end @@ -107,7 +136,7 @@ minetest.register_craft({ watch.register_item(mcl_clock.stereotype, watch.images[1], true, 1) -- Faces -for a=0,63,1 do +for a=0,clock_frames-1,1 do local b = a if b > 31 then b = b - 32 diff --git a/mods/ITEMS/mcl_clock/locale/mcl_clock.de.tr b/mods/ITEMS/mcl_clock/locale/mcl_clock.de.tr new file mode 100644 index 00000000..00c2529e --- /dev/null +++ b/mods/ITEMS/mcl_clock/locale/mcl_clock.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_clock +Clocks are tools which shows the current time of day in the Overworld.=Uhren sind Werkzeuge, die die Tageszeit in der Oberwelt anzeigen. +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=Die Uhr enthält eine rotierende Scheibe mit einem Sonnensymbol (gelbe Scheibe) und einem Mondsymbol, und sie hat einem kleinen „Pfeil“, der die jetzige Tageszeit anzeigt, indem die reale Position von Sonne und Mond im Himmel abgeschätzt wird. Die Sonne repräsentiert die Mittagszeit und der Mond repräsentiert Mitternacht. +Clock=Uhr +Displays the time of day in the Overworld=Zeigt die Tageszeit in der Oberwelt diff --git a/mods/ITEMS/mcl_clock/locale/mcl_clock.es.tr b/mods/ITEMS/mcl_clock/locale/mcl_clock.es.tr new file mode 100644 index 00000000..c8841fc6 --- /dev/null +++ b/mods/ITEMS/mcl_clock/locale/mcl_clock.es.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_clock +Clocks are tools which shows the current time of day in the Overworld.=Los relojes son herramientas que muestran la hora del día en el mundo. +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=El reloj contiene un disco giratorio con un símbolo del sol (disco amarillo) y un símbolo de la luna y un pequeño "puntero" que muestra la hora actual del día al estimar la posición real del sol y la luna en el cielo. El mediodía está representado por el símbolo del sol y la medianoche está representado por el símbolo de la luna. +Clock=Reloj \ No newline at end of file diff --git a/mods/ITEMS/mcl_clock/locale/mcl_clock.fr.tr b/mods/ITEMS/mcl_clock/locale/mcl_clock.fr.tr new file mode 100644 index 00000000..604f5085 --- /dev/null +++ b/mods/ITEMS/mcl_clock/locale/mcl_clock.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_clock +Clocks are tools which shows the current time of day in the Overworld.=Les horloges sont des outils qui indiquent l'heure actuelle dans l'Overworld. +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=L'horloge contient un disque rotatif avec un symbole du soleil (disque jaune) et un symbole de la lune et un petit "pointeur" qui montre l'heure actuelle en estimant la position réelle du soleil et de la lune dans le ciel. Midi est représenté par le symbole du soleil et minuit est représenté par le symbole de la lune. +Clock=Horloge +Displays the time of day in the Overworld=Affiche l'heure de la journée dans l'Overworld diff --git a/mods/ITEMS/mcl_clock/locale/template.txt b/mods/ITEMS/mcl_clock/locale/template.txt new file mode 100644 index 00000000..6589666c --- /dev/null +++ b/mods/ITEMS/mcl_clock/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_clock +Clocks are tools which shows the current time of day in the Overworld.= +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.= +Clock= +Displays the time of day in the Overworld= diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock.png deleted file mode 100644 index 101e341f..00000000 Binary files a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock.png and /dev/null differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_00.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_00.png new file mode 100644 index 00000000..3a8870c8 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_00.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_01.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_01.png new file mode 100644 index 00000000..e31b5411 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_01.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_02.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_02.png new file mode 100644 index 00000000..b2a2ea96 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_02.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_03.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_03.png new file mode 100644 index 00000000..87fca708 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_03.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_04.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_04.png new file mode 100644 index 00000000..0e16c349 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_04.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_05.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_05.png new file mode 100644 index 00000000..117034ed Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_05.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_06.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_06.png new file mode 100644 index 00000000..a2553bae Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_06.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_07.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_07.png new file mode 100644 index 00000000..ef1c59c7 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_07.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_08.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_08.png new file mode 100644 index 00000000..dcd2d52b Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_08.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_09.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_09.png new file mode 100644 index 00000000..069c11fc Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_09.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_10.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_10.png new file mode 100644 index 00000000..0bc5290b Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_10.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_11.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_11.png new file mode 100644 index 00000000..ef8b924e Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_11.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_12.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_12.png new file mode 100644 index 00000000..ec722730 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_12.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_13.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_13.png new file mode 100644 index 00000000..7125cde0 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_13.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_14.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_14.png new file mode 100644 index 00000000..8ac41660 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_14.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_15.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_15.png new file mode 100644 index 00000000..05ae6bb6 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_15.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_16.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_16.png new file mode 100644 index 00000000..2fa29478 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_16.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_17.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_17.png new file mode 100644 index 00000000..2c679d70 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_17.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_18.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_18.png new file mode 100644 index 00000000..49ae5e71 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_18.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_19.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_19.png new file mode 100644 index 00000000..7d014bbb Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_19.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_20.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_20.png new file mode 100644 index 00000000..11c33c96 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_20.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_21.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_21.png new file mode 100644 index 00000000..9129d556 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_21.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_22.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_22.png new file mode 100644 index 00000000..9c613ea8 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_22.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_23.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_23.png new file mode 100644 index 00000000..60a8986d Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_23.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_24.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_24.png new file mode 100644 index 00000000..15097454 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_24.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_25.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_25.png new file mode 100644 index 00000000..fcab7b20 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_25.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_26.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_26.png new file mode 100644 index 00000000..fa7ae197 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_26.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_27.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_27.png new file mode 100644 index 00000000..0acb19e2 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_27.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_28.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_28.png new file mode 100644 index 00000000..a9572fe6 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_28.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_29.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_29.png new file mode 100644 index 00000000..d670934a Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_29.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_30.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_30.png new file mode 100644 index 00000000..49c9ec98 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_30.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_31.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_31.png new file mode 100644 index 00000000..499ac149 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_31.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_32.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_32.png new file mode 100644 index 00000000..f54e771a Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_32.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_33.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_33.png new file mode 100644 index 00000000..eb893994 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_33.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_34.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_34.png new file mode 100644 index 00000000..87093e1c Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_34.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_35.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_35.png new file mode 100644 index 00000000..91ba320f Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_35.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_36.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_36.png new file mode 100644 index 00000000..e6b070dc Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_36.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_37.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_37.png new file mode 100644 index 00000000..b85d111f Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_37.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_38.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_38.png new file mode 100644 index 00000000..913bbecf Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_38.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_39.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_39.png new file mode 100644 index 00000000..33ae73c0 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_39.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_40.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_40.png new file mode 100644 index 00000000..72f0b83a Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_40.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_41.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_41.png new file mode 100644 index 00000000..f4113adf Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_41.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_42.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_42.png new file mode 100644 index 00000000..64ba1b49 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_42.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_43.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_43.png new file mode 100644 index 00000000..9ebe0d6f Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_43.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_44.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_44.png new file mode 100644 index 00000000..4fb756a4 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_44.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_45.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_45.png new file mode 100644 index 00000000..e3db7078 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_45.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_46.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_46.png new file mode 100644 index 00000000..d0377cc1 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_46.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_47.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_47.png new file mode 100644 index 00000000..0b84556a Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_47.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_48.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_48.png new file mode 100644 index 00000000..79416715 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_48.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_49.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_49.png new file mode 100644 index 00000000..054f7a4d Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_49.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_50.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_50.png new file mode 100644 index 00000000..5c33b2c4 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_50.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_51.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_51.png new file mode 100644 index 00000000..62285911 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_51.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_52.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_52.png new file mode 100644 index 00000000..e68f3c96 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_52.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_53.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_53.png new file mode 100644 index 00000000..f784e09c Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_53.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_54.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_54.png new file mode 100644 index 00000000..18962582 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_54.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_55.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_55.png new file mode 100644 index 00000000..b16c2a69 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_55.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_56.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_56.png new file mode 100644 index 00000000..f6412092 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_56.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_57.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_57.png new file mode 100644 index 00000000..e2f85ddb Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_57.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_58.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_58.png new file mode 100644 index 00000000..11d8f09a Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_58.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_59.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_59.png new file mode 100644 index 00000000..739b1261 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_59.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_60.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_60.png new file mode 100644 index 00000000..c44fca93 Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_60.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_61.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_61.png new file mode 100644 index 00000000..b607c06c Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_61.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_62.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_62.png new file mode 100644 index 00000000..f670354b Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_62.png differ diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_63.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_63.png new file mode 100644 index 00000000..029c964e Binary files /dev/null and b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_63.png differ diff --git a/mods/ITEMS/mcl_cocoas/init.lua b/mods/ITEMS/mcl_cocoas/init.lua index 463cf8fd..8b70c1ad 100644 --- a/mods/ITEMS/mcl_cocoas/init.lua +++ b/mods/ITEMS/mcl_cocoas/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_cocoas") + mcl_cocoas = {} -- Place cocoa @@ -41,7 +43,7 @@ function mcl_cocoas.place(itemstack, placer, pointed_thing, plantname) -- Add the node, set facedir and remove 1 item from the itemstack minetest.set_node(pt.above, {name = plantname, param2 = minetest.dir_to_facedir(clickdir)}) - minetest.sound_play("default_place_node", {pos = pt.above, gain = 1.0}) + minetest.sound_play("default_place_node", {pos = pt.above, gain = 1.0}, true) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() @@ -68,16 +70,11 @@ end -- Cocoa definition -- 1st stage ---[[ TODO (code quality): Turn the cocoa nodes into attached nodes and make use of wallmounted. This is much better -than the current ugly hacky check after digging a jungle tree (in mcl_core). -Problem: If we want to use wallmounted, we MUST use a mesh, since wallmounted does not support -nodeboxes with multiple boxes. :-( -Using meshes will also clean up the texture mess. -]] +--[[ TODO: Use a mesh for cocoas for perfect texture compability. ]] local crop_def = { - description = "Premature Cocoa", + description = S("Premature Cocoa Pod"), _doc_items_create_entry = true, - _doc_items_longdesc = "Cocoas are plants which grow on the side of jungle trees in 3 stages.", + _doc_items_longdesc = S("Cocoa pods grow on the side of jungle trees in 3 stages."), drawtype = "nodebox", tiles = { "[combine:16x16:6,1=mcl_cocoas_cocoa_stage_0.png", "[combine:16x16:6,11=mcl_cocoas_cocoa_stage_0.png", @@ -110,17 +107,18 @@ local crop_def = { }, }, groups = { - handy=1,axey=1, cocoa=1, not_in_creative_inventory=1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1 + handy=1,axey=1, cocoa=1, not_in_creative_inventory=1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1, attached_node_facedir=1, }, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 15, + on_rotate = false, + _mcl_blast_resistance = 3, _mcl_hardness = 0.2, } -- 2nd stage minetest.register_node("mcl_cocoas:cocoa_1", table.copy(crop_def)) -crop_def.description = "Medium Cocoa" +crop_def.description = S("Medium Cocoa Pod") crop_def._doc_items_create_entry = false crop_def.groups.cocoa = 2 crop_def.tiles = { @@ -151,8 +149,8 @@ crop_def.selection_box = { minetest.register_node("mcl_cocoas:cocoa_2", table.copy(crop_def)) -- Final stage -crop_def.description = "Mature Cocoa" -crop_def._doc_items_longdesc = "A mature cocoa is a plant which grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further." +crop_def.description = S("Mature Cocoa Pod") +crop_def._doc_items_longdesc = S("A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.") crop_def._doc_items_create_entry = true crop_def.groups.cocoa = 3 crop_def.tiles = { @@ -186,7 +184,7 @@ minetest.register_node("mcl_cocoas:cocoa_3", table.copy(crop_def)) minetest.register_abm({ - label = "Cocoa growth", + label = "Cocoa pod growth", nodenames = {"mcl_cocoas:cocoa_1", "mcl_cocoas:cocoa_2"}, -- Same as potatoes -- TODO: Tweak/balance the growth speed diff --git a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.de.tr b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.de.tr new file mode 100644 index 00000000..479e3845 --- /dev/null +++ b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.de.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_cocoas +Premature Cocoa Pod=Junge Kakaoschote +Cocoa pods grow on the side of jungle trees in 3 stages.=Kakaoschoten wachsen an der Seite von Dschungelbäumen in 3 Stufen. +Medium Cocoa Pod=Mittelgroße Kakaoschote +Mature Cocoa Pod=Ausgewachsene Kakaoschote +A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=Eine ausgewachsene Kakaoschote wuchs an einem Dschugelbaum zur vollen Größe heran. Sie ist erntereif und kann für Kakaobohnen geerntet werden. Sie wird nicht weiter wachsen. diff --git a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.es.tr b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.es.tr new file mode 100644 index 00000000..e1477c79 --- /dev/null +++ b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.es.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_cocoas +Premature Cocoa Pod=Vaina de cacao prematura +Cocoa pods grow on the side of jungle trees in 3 stages.=Las vainas de cacao crecen al lado de los árboles de jungla en 3 etapas. +Medium Cocoa Pod=Vaina de cacao mediana +Mature Cocoa Pod=Vaina de cacao madura +A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=Una vaina de cacao madura creció en un árbol de jungla a su tamaño completo y está lista para ser cosechada para los granos de cacao. No crecerá más. diff --git a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.fr.tr b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.fr.tr new file mode 100644 index 00000000..bf546895 --- /dev/null +++ b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.fr.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_cocoas +Premature Cocoa Pod=Gousse de cacao prématurée +Cocoa pods grow on the side of jungle trees in 3 stages.=Les cabosses de cacao poussent sur le côté des arbres d'Acajou en 3 étapes. +Medium Cocoa Pod=Gousse de cacao moyenne +Mature Cocoa Pod=Cabosse de cacao mature +A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=Une cabosse de cacao mature a poussé sur un arbre d'Acajou à sa pleine taille et elle est prête à être récoltée pour les fèves de cacao. Elle ne grandira plus. diff --git a/mods/ITEMS/mcl_cocoas/locale/template.txt b/mods/ITEMS/mcl_cocoas/locale/template.txt new file mode 100644 index 00000000..f68318ca --- /dev/null +++ b/mods/ITEMS/mcl_cocoas/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: mcl_cocoas +Premature Cocoa Pod= +Cocoa pods grow on the side of jungle trees in 3 stages.= +Medium Cocoa Pod= +Mature Cocoa Pod= +A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.= diff --git a/mods/ITEMS/mcl_colorblocks/depends.txt b/mods/ITEMS/mcl_colorblocks/depends.txt index e9446535..c9db3b28 100644 --- a/mods/ITEMS/mcl_colorblocks/depends.txt +++ b/mods/ITEMS/mcl_colorblocks/depends.txt @@ -1,3 +1,5 @@ mcl_core mcl_sounds mcl_dye +doc? +screwdriver? diff --git a/mods/ITEMS/mcl_colorblocks/init.lua b/mods/ITEMS/mcl_colorblocks/init.lua index 1d7e5e26..dad97f62 100644 --- a/mods/ITEMS/mcl_colorblocks/init.lua +++ b/mods/ITEMS/mcl_colorblocks/init.lua @@ -1,39 +1,42 @@ -local init = os.clock() +local S = minetest.get_translator("mcl_colorblocks") +local doc_mod = minetest.get_modpath("doc") local block = {} block.dyes = { - {"white", "White", "white"}, - {"grey", "Grey", "dark_grey"}, - {"silver", "Light Grey", "grey"}, - {"black", "Black", "black"}, - {"red", "Red", "red"}, - {"yellow", "Yellow", "yellow"}, - {"green", "Green", "dark_green"}, - {"cyan", "Cyan", "cyan"}, - {"blue", "Blue", "blue"}, - {"magenta", "Magenta", "magenta"}, - {"orange", "Orange", "orange"}, - {"purple", "Purple", "violet"}, - {"brown", "Brown", "brown"}, - {"pink", "Pink", "pink"}, - {"lime", "Lime", "green"}, - {"light_blue", "Light Blue", "lightblue"}, + {"white", S("White Terracotta"), S("White Glazed Terracotta"), S("White Concrete Powder"), S("White Concrete"), "white"}, + {"grey", S("Grey Terracotta"), S("Grey Glazed Terracotta"), S("Grey Concrete Powder"), S("Grey Concrete"), "dark_grey"}, + {"silver", S("Light Grey Terracotta"), S("Light Grey Glazed Terracotta"), S("Light Grey Concrete Powder"), S("Light Grey Concrete"), "grey"}, + {"black", S("Black Terracotta"), S("Black Glazed Terracotta"), S("Black Concrete Powder"), S("Black Concrete"), "black"}, + {"red", S("Red Terracotta"), S("Red Glazed Terracotta"), S("Red Concrete Powder"), S("Red Concrete"), "red"}, + {"yellow", S("Yellow Terracotta"), S("Yellow Glazed Terracotta"), S("Yellow Concrete Powder"), S("Yellow Concrete"), "yellow"}, + {"green", S("Green Terracotta"), S("Green Glazed Terracotta"), S("Green Concrete Powder"), S("Green Concrete"), "dark_green"}, + {"cyan", S("Cyan Terracotta"), S("Cyan Glazed Terracotta"), S("Cyan Concrete Powder"), S("Cyan Concrete"), "cyan"}, + {"blue", S("Blue Terracotta"), S("Blue Glazed Terracotta"), S("Blue Concrete Powder"), S("Blue Concrete"), "blue"}, + {"magenta", S("Magenta Terracotta"), S("Magenta Glazed Terracotta"), S("Magenta Concrete Powder"), S("Magenta Concrete"), "magenta"}, + {"orange", S("Orange Terracotta"), S("Orange Glazed Terracotta"), S("Orange Concrete Powder"), S("Orange Concrete"), "orange"}, + {"purple", S("Purple Terracotta"), S("Purple Glazed Terracotta"), S("Purple Concrete Powder"), S("Purple Concrete"), "violet"}, + {"brown", S("Brown Terracotta"), S("Brown Glazed Terracotta"), S("Brown Concrete Powder"), S("Brown Concrete"), "brown"}, + {"pink", S("Pink Terracotta"), S("Pink Glazed Terracotta"), S("Pink Concrete Powder"), S("Pink Concrete"), "pink"}, + {"lime", S("Lime Terracotta"), S("Lime Glazed Terracotta"), S("Lime Concrete Powder"), S("Lime Concrete"), "green"}, + {"light_blue", S("Light Blue Terracotta"), S("Light Blue Glazed Terracotta"), S("Light Blue Concrete Powder"), S("Light Blue Concrete"), "lightblue"}, } +local canonical_color = "yellow" -local hc_desc = "Terracotta is a basic building material. It comes in many different colors." -local gt_desc = "Glazed terracotta is a decorational block with a complex pattern. It can be rotated by placing it in different directions." -local cp_desc = "Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water." -local conc_desc = "Concrete is a decorational block which comes in many different colors. It is notable for having a very strong and clean color.", +local hc_desc = S("Terracotta is a basic building material. It comes in many different colors.") +local gt_desc = S("Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.") +local cp_desc = S("Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.") +local c_desc = S("Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.") +local cp_tt = S("Turns into concrete on water contact") minetest.register_node("mcl_colorblocks:hardened_clay", { - description = "Terracotta", - _doc_items_longdesc = "Terracotta is a basic building material.", + description = S("Terracotta"), + _doc_items_longdesc = S("Terracotta is a basic building material which comes in many different colors. This particular block is uncolored."), tiles = {"hardened_clay.png"}, stack_max = 64, groups = {pickaxey=1, hardened_clay=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 21, + _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) @@ -44,65 +47,129 @@ minetest.register_craft({ cooktime = 10, }) +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple +end for _, row in ipairs(block.dyes) do local name = row[1] - local desc = row[2] - local craft_color_group = row[3] + local is_canonical = name == canonical_color + local sdesc_hc = row[2] + local sdesc_gt = row[3] + local sdesc_cp = row[4] + local sdesc_c = row[5] + local ldesc_hc, ldesc_gt, ldesc_cp, ldesc_c + local create_entry + local ename_hc, ename_gt, ename_cp, ename_c + local ltt_cp = cp_tt + if is_canonical then + ldesc_hc = hc_desc + ldesc_gt = gt_desc + ldesc_cp = cp_desc + ldesc_c = c_desc + ename_hc = S("Colored Terracotta") + ename_gt = S("Glazed Terracotta") + ename_cp = S("Concrete Powder") + ename_c = S("Concrete") + else + create_entry = false + end + local craft_color_group = row[6] -- Node Definition minetest.register_node("mcl_colorblocks:hardened_clay_"..name, { - description = desc.." Terracotta", - _doc_items_longdesc = hc_desc, + description = sdesc_hc, + _doc_items_longdesc = ldesc_hc, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = ename_hc, tiles = {"hardened_clay_stained_"..name..".png"}, groups = {pickaxey=1, hardened_clay=1,building_block=1, material_stone=1}, stack_max = 64, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 21, + _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) minetest.register_node("mcl_colorblocks:concrete_powder_"..name, { - description = desc.." Concrete Powder", - _doc_items_longdesc = cp_desc, + description = sdesc_cp, + _tt_help = ltt_cp, + _doc_items_longdesc = ldesc_cp, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = ename_cp, tiles = {"mcl_colorblocks_concrete_powder_"..name..".png"}, groups = {handy=1,shovely=1, concrete_powder=1,building_block=1,falling_node=1, material_sand=1}, stack_max = 64, is_ground_content = false, sounds = mcl_sounds.node_sound_sand_defaults(), + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- Call on_rightclick if the pointed node defines it + local unode = minetest.get_node(pointed_thing.under) + if placer and not placer:get_player_control().sneak then + if minetest.registered_nodes[unode.name] and minetest.registered_nodes[unode.name].on_rightclick then + return minetest.registered_nodes[unode.name].on_rightclick(pointed_thing.under, unode, placer, itemstack) or itemstack + end + end + + -- If placed in water, immediately harden this node + local n = minetest.get_node(pointed_thing.above) + local oldname = itemstack:get_name() + if minetest.get_item_group(n.name, "water") ~= 0 then + itemstack:set_name(itemstack:get_definition()._mcl_colorblocks_harden_to) + end + itemstack = minetest.item_place_node(itemstack, placer, pointed_thing) + itemstack:set_name(oldname) + return itemstack + end, -- Specify the node to which this node will convert after getting in contact with water _mcl_colorblocks_harden_to = "mcl_colorblocks:concrete_"..name, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) minetest.register_node("mcl_colorblocks:concrete_"..name, { - description = desc.." Concrete", - _doc_items_longdesc = conc_desc, + description = sdesc_c, + _doc_items_longdesc = ldesc_c, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = ename_c, tiles = {"mcl_colorblocks_concrete_"..name..".png"}, groups = {handy=1,pickaxey=1, concrete=1,building_block=1, material_stone=1}, stack_max = 64, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 9, + _mcl_blast_resistance = 1.8, _mcl_hardness = 1.8, }) local tex = "mcl_colorblocks_glazed_terracotta_"..name..".png" local texes = { tex, tex, tex.."^[transformR180", tex, tex.."^[transformR270", tex.."^[transformR90" } minetest.register_node("mcl_colorblocks:glazed_terracotta_"..name, { - description = desc.." Glazed Terracotta", - _doc_items_longdesc = gt_desc, + description = sdesc_gt, + _doc_items_longdesc = ldesc_gt, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = ename_gt, tiles = texes, groups = {handy=1,pickaxey=1, glazed_terracotta=1,building_block=1, material_stone=1}, paramtype2 = "facedir", stack_max = 64, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 7, + _mcl_blast_resistance = 4.2, _mcl_hardness = 1.4, + on_rotate = on_rotate, }) + if not is_canonical and doc_mod then + doc.add_entry_alias("nodes", "mcl_colorblocks:hardened_clay_"..canonical_color, "nodes", "mcl_colorblocks:hardened_clay_"..name) + doc.add_entry_alias("nodes", "mcl_colorblocks:glazed_terracotta_"..canonical_color, "nodes", "mcl_colorblocks:glazed_terracotta_"..name) + doc.add_entry_alias("nodes", "mcl_colorblocks:concrete_"..canonical_color, "nodes", "mcl_colorblocks:concrete_"..name) + doc.add_entry_alias("nodes", "mcl_colorblocks:concrete_powder_"..canonical_color, "nodes", "mcl_colorblocks:concrete_powder_"..name) + end + -- Crafting recipes if craft_color_group then minetest.register_craft({ @@ -141,10 +208,11 @@ minetest.register_abm({ neighbors = {"group:water"}, action = function(pos, node) local harden_to = minetest.registered_nodes[node.name]._mcl_colorblocks_harden_to - minetest.swap_node(pos, { name = harden_to, param = node.param, param2 = node.param2 }) + -- It should be impossible for harden_to to be nil, but a Minetest bug might call + -- the ABM on the new concrete node, which isn't part of this ABM! + if harden_to then + node.name = harden_to + minetest.set_node(pos, node) + end end, }) - -local time_to_load= os.clock() - init -print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load)) - diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr new file mode 100644 index 00000000..359a2f7c --- /dev/null +++ b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr @@ -0,0 +1,76 @@ +# textdomain: mcl_colorblocks +White Terracotta=Weiße Terrakotta +White Glazed Terracotta=Weiße glasierte Terrakotta +White Concrete Powder=Weißes Betonpulver +White Concrete=Weißer Beton +Grey Terracotta=Graue Terrakotta +Grey Glazed Terracotta=Graue glasierte Terrakotta +Grey Concrete Powder=Graues Betonpulver +Grey Concrete=Grauer Beton +Light Grey Terracotta=Hellgraue Terrakotta +Light Grey Glazed Terracotta=Hellgraue glasierte Terrakotta +Light Grey Concrete Powder=Hellgraues Betonpulver +Light Grey Concrete=Hellgrauer Beton +Black Terracotta=Schwarze Terrakotta +Black Glazed Terracotta=Schwarze glasierte Terrakotta +Black Concrete Powder=Schwarzes Betonpulver +Black Concrete=Schwarzer Beton +Red Terracotta=Rote Terrakotta +Red Glazed Terracotta=Rote glasierte Terrakotta +Red Concrete Powder=Rotes Betonpulver +Red Concrete=Roter Beton +Yellow Terracotta=Gelbe Terrakotta +Yellow Glazed Terracotta=Gelbe glasierte Terrakotta +Yellow Concrete Powder=Gelbes Betonpulver +Yellow Concrete=Gelber Beton +Green Terracotta=Grüne Terrakotta +Green Glazed Terracotta=Grüne glasierte Terrakotta +Green Concrete Powder=Grünes Betonpulver +Green Concrete=Grüner Beton +Cyan Terracotta=Türkise Terrakotta +Cyan Glazed Terracotta=Türkise glasierte Terrakotta +Cyan Concrete Powder=Türkises Betonpulver +Cyan Concrete=Türkiser Beton +Blue Terracotta=Blaue Terrakotta +Blue Glazed Terracotta=Blaue glasierte Terrakotta +Blue Concrete Powder=Blaues Betonpulver +Blue Concrete=Blauer Beton +Magenta Terracotta=Magenta Terrakotta +Magenta Glazed Terracotta=Magenta glasierte Terrakotta +Magenta Concrete Powder=Magenta Betonpulver +Magenta Concrete=Magenta Beton +Orange Terracotta=Orange Terrakotta +Orange Glazed Terracotta=Orange glasierte Terrakotta +Orange Concrete Powder=Orange Betonpulver +Orange Concrete=Orange Beton +Purple Terracotta=Violette Terrakotta +Purple Glazed Terracotta=Violette glasierte Terrakotta +Purple Concrete Powder=Violettes Betonpulver +Purple Concrete=Violetter Beton +Brown Terracotta=Braune Terrakotta +Brown Glazed Terracotta=Braune glasierte Terrakotta +Brown Concrete Powder=Braunes Betonpulver +Brown Concrete=Brauner Beton +Pink Terracotta=Rosa Terrakotta +Pink Glazed Terracotta=Rosa glasierte Terrakotta +Pink Concrete Powder=Rosa Betonpulver +Pink Concrete=Rosa Beton +Lime Terracotta=Lindgrüne Terrakotta +Lime Glazed Terracotta=Lindgrüne glasierte Terrakotta +Lime Concrete Powder=Lindgrünes Betonpulver +Lime Concrete=Lindgrüner Beton +Light Blue Terracotta=Hellbaue Terrakotta +Light Blue Glazed Terracotta=Hellblaue glasierte Terrakotta +Light Blue Concrete Powder=Hellblaues Betonpulver +Light Blue Concrete=Hellblauer Beton +Terracotta is a basic building material. It comes in many different colors.=Terrakotta ist ein Baumaterial. Es gibt es in vielen verschiedenen Farben. +Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=Glasierte Terrakotta ist ein dekorativer Block mit einem komplexen Muster. Sie kann rotiert werden, indem man sie in verschiedene Richtungen platziert. +Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Betonpulver wird benutzt, um Beton herzustellen, aber es kann auch selbst als Dekoration benutzt werden. Es kommt in verschiedenen Farben daher. Betonpulver verwandelt sich in Beton der selben Farbe, wenn es mit Wasser in Berührung kommt. +Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Beton ist ein dekorativer Block, der in verschiedenen Farben daherkommt. Er hat eine besonders kräftige und klare Farbe. +Terracotta=Terrakotta +Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Terrakotta ist ein Baumaterial, welches in vielen verschiedenen Farben vorkommt. Diese Variante ist ungefärbt. +Colored Terracotta=Gefärbte Terrakotta +Glazed Terracotta=Glasierte Terrakotta +Concrete Powder=Betonpulver +Concrete=Beton +Turns into concrete on water contact=Wird zu Beton bei Wasserkontakt diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.es.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.es.tr new file mode 100644 index 00000000..cae96e62 --- /dev/null +++ b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.es.tr @@ -0,0 +1,75 @@ +# textdomain: mcl_colorblocks +White Terracotta=Terracota blanca +White Glazed Terracotta=Terracota cristalizada blanca +White Concrete Powder=Cemento blanco +White Concrete=Hormigón blanco +Grey Terracotta=Terracota gris +Grey Glazed Terracotta=Terracota cristalizada gris +Grey Concrete Powder=Cemento gris +Grey Concrete=Hormigón gris +Light Grey Terracotta=Terracota gris claro +Light Grey Glazed Terracotta=Terracota cristalizada gris claro +Light Grey Concrete Powder=Cemento gris claro +Light Grey Concrete=Hormigón gris claro +Black Terracotta=Terracota negra +Black Glazed Terracotta=Terracota cristalizada negra +Black Concrete Powder=Cemento negro +Black Concrete=Hormigón negro +Red Terracotta=Terracota roja +Red Glazed Terracotta=Terracota cristalizada roja +Red Concrete Powder=Cemento rojo +Red Concrete=Hormigón rojo +Yellow Terracotta=Terracota amarilla +Yellow Glazed Terracotta=Terracota cristalizada amarilla +Yellow Concrete Powder=Cemento amarillo +Yellow Concrete=Hormigón amarillo +Green Terracotta=Terracota verde +Green Glazed Terracotta=Terracota cristalizada verde +Green Concrete Powder=Cemento verde +Green Concrete=Hormigón verde +Cyan Terracotta=Terracota cian +Cyan Glazed Terracotta=Terracota cristalizada cian +Cyan Concrete Powder=Cemento cian +Cyan Concrete=Hormigón cian +Blue Terracotta=Terracota azul +Blue Glazed Terracotta=Terracota cristalizada azul +Blue Concrete Powder=Cemento azul +Blue Concrete=Hormigón azul +Magenta Terracotta=Terracota magenta +Magenta Glazed Terracotta=Terracota cristalizada magenta +Magenta Concrete Powder=Cemento magenta +Magenta Concrete=Hormigón magenta +Orange Terracotta=Terracota naranja +Orange Glazed Terracotta=Terracota cristalizada naranja +Orange Concrete Powder=Cemento naranja +Orange Concrete=Hormigón naranja +Purple Terracotta=Terracota morada +Purple Glazed Terracotta=Terracota cristalizada morada +Purple Concrete Powder=Cemento morado +Purple Concrete=Hormigón morado +Brown Terracotta=Terracota marrón +Brown Glazed Terracotta=Terracota cristalizada marrón +Brown Concrete Powder=Cemento marrón +Brown Concrete=Hormigón marrón +Pink Terracotta=Terracota rosa +Pink Glazed Terracotta=Terracota cristalizada rosa +Pink Concrete Powder=Cemento rosa +Pink Concrete=Hormigón rosa +Lime Terracotta=Terracota verde lima +Lime Glazed Terracotta=Terracota cristalizada verde lima +Lime Concrete Powder=Cemento verde lima +Lime Concrete=Hormigón verde lima +Light Blue Terracotta=Terracota azul claro +Light Blue Glazed Terracotta=Terracota cristalizada azul claro +Light Blue Concrete Powder=Cemento azul claro +Light Blue Concrete=Hormigón azul claro +Terracotta is a basic building material. It comes in many different colors.=La terracota es un material de construcción básico. Viene en muchos colores diferentes. +Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=La terracota cristalizada es un bloque decorativo con un patrón complejo. Se puede girar colocándolo en diferentes direcciones. +Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=La Cemento se usa para crear Hormigón, pero también se puede usar como decoración en sí. Viene en diferentes colores. La Cemento se convierte en Hormigón del mismo color cuando entra en contacto con el agua. +Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=El Hormigón es un bloque decorativo que viene en muchos colores diferentes. Es notable por tener un color muy fuerte y limpio. +Terracotta=Terracota +Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=La terracota es un material de construcción básico que viene en muchos colores diferentes. Este bloque en particular no tiene color. +Colored Terracotta=Terracota coloreada +Glazed Terracotta=Terracota vidriada +Concrete Powder=Cemento +Concrete=Hormigón diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr new file mode 100644 index 00000000..d457364e --- /dev/null +++ b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr @@ -0,0 +1,76 @@ +# textdomain: mcl_colorblocks +White Terracotta=Terre Cuite Blanche +White Glazed Terracotta=Terre Cuite Emaillée Blanche +White Concrete Powder=Béton en Poudre Blanc +White Concrete=Béton Blanc +Grey Terracotta=Terre Cuite Grise +Grey Glazed Terracotta=Terre Cuite Emaillée Grise +Grey Concrete Powder=Béton en Poudre Gris +Grey Concrete=Béton Gris +Light Grey Terracotta=Terre Cuite Gris Clair +Light Grey Glazed Terracotta=Terre Cuite Emaillée Gris Clair +Light Grey Concrete Powder=Béton en Poudre Gris Clair +Light Grey Concrete=Béton Gris Clair +Black Terracotta=Terre Cuite Noir +Black Glazed Terracotta=Terre Cuite Emaillée Noir +Black Concrete Powder=Béton en Poudre Noir +Black Concrete=Béton Noir +Red Terracotta=Terre Cuite Rouge +Red Glazed Terracotta=Terre Cuite Emaillée Rouge +Red Concrete Powder=Béton en Poudre Rouge +Red Concrete=Béton Rouge +Yellow Terracotta=Terre Cuite Jaune +Yellow Glazed Terracotta=Terre Cuite Emaillée Jaune +Yellow Concrete Powder=Béton en Poudre Jaune +Yellow Concrete=Béton Jaune +Green Terracotta=Terre Cuite Verte +Green Glazed Terracotta=Terre Cuite Emaillée Verte +Green Concrete Powder=Béton en Poudre Vert +Green Concrete=Béton Vert +Cyan Terracotta=Terre Cuite Cyan +Cyan Glazed Terracotta=Terre Cuite Emaillée Cyan +Cyan Concrete Powder=Béton en Poudre Cyan +Cyan Concrete=Béton Cyan +Blue Terracotta=Terre Cuite Bleue +Blue Glazed Terracotta=Terre Cuite Emaillée Bleue +Blue Concrete Powder=Béton en Poudre Bleu +Blue Concrete=Béton Bleu +Magenta Terracotta=Terre Cuite Magenta +Magenta Glazed Terracotta=Terre Cuite Emaillée Magenta +Magenta Concrete Powder=Béton en Poudre Magenta +Magenta Concrete=Béton Magenta +Orange Terracotta=Terre Cuite Orange +Orange Glazed Terracotta=Terre Cuite Emaillée Orange +Orange Concrete Powder=Béton en Poudre Orange +Orange Concrete=Béton Orange +Purple Terracotta=Terre Cuite Violette +Purple Glazed Terracotta=Terre Cuite Emaillée Violette +Purple Concrete Powder=Béton en Poudre Violet +Purple Concrete=Béton Violet +Brown Terracotta=Terre Cuite Marron +Brown Glazed Terracotta=Terre Cuite Emaillée Marron +Brown Concrete Powder=Béton en Poudre Marron +Brown Concrete=Béton Marron +Pink Terracotta=Terre Cuite Rose +Pink Glazed Terracotta=Terre Cuite Emaillée Rose +Pink Concrete Powder=Béton en Poudre Rose +Pink Concrete=Béton Rose +Lime Terracotta=Terre Cuite Verte Clair +Lime Glazed Terracotta=Terre Cuite Emaillée Verte Clair +Lime Concrete Powder=Béton en Poudre Vert Clair +Lime Concrete=Béton Vert Clair +Light Blue Terracotta=Terre Cuite Bleu Clair +Light Blue Glazed Terracotta=Terre Cuite Emaillée Bleu Clair +Light Blue Concrete Powder=Béton en Poudre Bleu Clair +Light Blue Concrete=Béton Bleu Clair +Terracotta is a basic building material. It comes in many different colors.=La terre cuite est un matériau de construction de base. Il est disponible dans de nombreuses couleurs différentes. +Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=La terre cuite émaillée est un bloc décoratif au motif complexe. Il peut être tourné en le plaçant dans différentes directions. +Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=La poudre de béton est utilisée pour créer du béton, mais elle peut également être utilisée comme décoration elle-même. Il est disponible en différentes couleurs. La poudre de béton se transforme en béton de la même couleur au contact de l'eau. +Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Le béton est un bloc décoratif qui se décline en de nombreuses couleurs différentes. Il est remarquable pour avoir une couleur très forte et propre. +Terracotta=Terre Cuite +Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=La terre cuite est un matériau de construction de base qui se décline en de nombreuses couleurs différentes. Ce bloc particulier n'est pas coloré. +Colored Terracotta=Terre Cuite Coloré +Glazed Terracotta=Terre Cuite Emaillée +Concrete Powder=Béton en Poudre +Concrete=Béton +Turns into concrete on water contact=Se transforme en béton au contact de l'eau diff --git a/mods/ITEMS/mcl_colorblocks/locale/template.txt b/mods/ITEMS/mcl_colorblocks/locale/template.txt new file mode 100644 index 00000000..ca1c059a --- /dev/null +++ b/mods/ITEMS/mcl_colorblocks/locale/template.txt @@ -0,0 +1,76 @@ +# textdomain: mcl_colorblocks +White Terracotta= +White Glazed Terracotta= +White Concrete Powder= +White Concrete= +Grey Terracotta= +Grey Glazed Terracotta= +Grey Concrete Powder= +Grey Concrete= +Light Grey Terracotta= +Light Grey Glazed Terracotta= +Light Grey Concrete Powder= +Light Grey Concrete= +Black Terracotta= +Black Glazed Terracotta= +Black Concrete Powder= +Black Concrete= +Red Terracotta= +Red Glazed Terracotta= +Red Concrete Powder= +Red Concrete= +Yellow Terracotta= +Yellow Glazed Terracotta= +Yellow Concrete Powder= +Yellow Concrete= +Green Terracotta= +Green Glazed Terracotta= +Green Concrete Powder= +Green Concrete= +Cyan Terracotta= +Cyan Glazed Terracotta= +Cyan Concrete Powder= +Cyan Concrete= +Blue Terracotta= +Blue Glazed Terracotta= +Blue Concrete Powder= +Blue Concrete= +Magenta Terracotta= +Magenta Glazed Terracotta= +Magenta Concrete Powder= +Magenta Concrete= +Orange Terracotta= +Orange Glazed Terracotta= +Orange Concrete Powder= +Orange Concrete= +Purple Terracotta= +Purple Glazed Terracotta= +Purple Concrete Powder= +Purple Concrete= +Brown Terracotta= +Brown Glazed Terracotta= +Brown Concrete Powder= +Brown Concrete= +Pink Terracotta= +Pink Glazed Terracotta= +Pink Concrete Powder= +Pink Concrete= +Lime Terracotta= +Lime Glazed Terracotta= +Lime Concrete Powder= +Lime Concrete= +Light Blue Terracotta= +Light Blue Glazed Terracotta= +Light Blue Concrete Powder= +Light Blue Concrete= +Terracotta is a basic building material. It comes in many different colors.= +Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.= +Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.= +Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.= +Terracotta= +Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.= +Colored Terracotta= +Glazed Terracotta= +Concrete Powder= +Concrete= +Turns into concrete on water contact= diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_blue.png index 530be050..bd3ef19a 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_blue.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_blue.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_brown.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_brown.png index 3344f075..1214e7c6 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_brown.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_brown.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_green.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_green.png index 5d1e5366..a7c54224 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_green.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_green.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_grey.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_grey.png index 885b62fc..bf4a8336 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_grey.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_grey.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_light_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_light_blue.png index a6afea9d..21ddec3d 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_light_blue.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_light_blue.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_lime.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_lime.png index d7ac2794..49067b6f 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_lime.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_lime.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_magenta.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_magenta.png index 258efb78..0732c0bc 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_magenta.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_magenta.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_pink.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_pink.png index 75dfa29a..3450015e 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_pink.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_pink.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_black.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_black.png index f3447237..caf718d0 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_black.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_black.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_blue.png index 12c64fc6..c71038df 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_blue.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_blue.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_brown.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_brown.png index 9e355c8a..af4f2381 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_brown.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_brown.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_grey.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_grey.png index 23d957a8..da8ffb6f 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_grey.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_grey.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_lime.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_lime.png index 536e5edc..d1b99029 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_lime.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_lime.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_pink.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_pink.png index 4a949719..4dd4dc9b 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_pink.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_pink.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_red.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_red.png index 32195ff4..959fb89a 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_red.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_red.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_silver.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_silver.png index 37edd79b..647c9e6d 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_silver.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_silver.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_yellow.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_yellow.png index 83d693e0..8e9562ea 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_yellow.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_yellow.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_red.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_red.png index a02379ed..35ab9b5c 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_red.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_red.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_white.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_white.png index 4561f653..abb66f20 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_white.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_white.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_yellow.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_yellow.png index 990a5d2d..eb8d6204 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_yellow.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_yellow.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_black.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_black.png index bd280e85..04eab439 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_black.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_black.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_blue.png index a97b8590..52b66b6d 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_blue.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_blue.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_brown.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_brown.png index 707d5b4f..4adcb671 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_brown.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_brown.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_cyan.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_cyan.png index f7fde442..6289015a 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_cyan.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_cyan.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_green.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_green.png index 67bdfeb5..61b7440a 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_green.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_green.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_grey.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_grey.png index 55418fb5..2f3813ad 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_grey.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_grey.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_light_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_light_blue.png index b5b9187a..079cfdd6 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_light_blue.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_light_blue.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_lime.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_lime.png index c0e23ff8..0cc61b37 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_lime.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_lime.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_magenta.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_magenta.png index f15df8ee..0673eab6 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_magenta.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_magenta.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_orange.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_orange.png index 5e9f1116..531e1f14 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_orange.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_orange.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_pink.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_pink.png index 56ce74c0..76264bef 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_pink.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_pink.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_purple.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_purple.png index b4e2347d..6912cd63 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_purple.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_purple.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_red.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_red.png index fd59d815..5f2fa718 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_red.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_red.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_silver.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_silver.png index e74f8ec9..c634af47 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_silver.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_silver.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_white.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_white.png index b7df95ae..65757aab 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_white.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_white.png differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_yellow.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_yellow.png index ff5a02f3..db5a3aa9 100644 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_yellow.png and b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_yellow.png differ diff --git a/mods/ITEMS/mcl_compass/depends.txt b/mods/ITEMS/mcl_compass/depends.txt index 0430af2c..53261d53 100644 --- a/mods/ITEMS/mcl_compass/depends.txt +++ b/mods/ITEMS/mcl_compass/depends.txt @@ -1,3 +1,4 @@ mcl_core +mcl_worlds mesecons doc? diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index b033c2b4..7a23cc50 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -1,9 +1,25 @@ +local S = minetest.get_translator("mcl_compass") + mcl_compass = {} +local compass_frames = 32 + local default_spawn_settings = minetest.settings:get("static_spawnpoint") +-- Timer for random compass spinning +local random_timer = 0 +local random_timer_trigger = 0.5 -- random compass spinning tick in seconds. Increase if there are performance problems + +local random_frame = math.random(0, compass_frames-1) + minetest.register_globalstep(function(dtime) + random_timer = random_timer + dtime local players = minetest.get_connected_players() + + if random_timer >= random_timer_trigger then + random_frame = (random_frame + math.random(-1, 1)) % compass_frames + random_timer = 0 + end for i,player in ipairs(players) do local function has_compass(player) for _,stack in ipairs(player:get_inventory():get_list("main")) do @@ -14,24 +30,28 @@ minetest.register_globalstep(function(dtime) return false end if has_compass(player) then - local spawn = {x=0,y=0,z=0} - local s = minetest.settings:get("static_spawnpoint") - if s then - local numbers = string.split(s, ",") - spawn.x = tonumber(numbers[1]) - spawn.y = tonumber(numbers[2]) - spawn.z = tonumber(numbers[3]) - if type(spawn.x) ~= "number" and type(spawn.y) ~= "number" and type(spawn.z) ~= "number" then - spawn = {x=0,y=0,z=0} + local pos = player:get_pos() + local dim = mcl_worlds.pos_to_dimension(pos) + local compass_image + -- Compasses do not work in certain zones + if not mcl_worlds.compass_works(pos) then + compass_image = random_frame + else + local spawn = {x=0,y=0,z=0} + local ssp = minetest.setting_get_pos("static_spawnpoint") + if ssp then + spawn = ssp + if type(spawn) ~= "table" or type(spawn.x) ~= "number" or type(spawn.y) ~= "number" or type(spawn.z) ~= "number" then + spawn = {x=0,y=0,z=0} + end end + local dir = player:get_look_horizontal() + local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) + if angle_north < 0 then angle_north = angle_north + 360 end + local angle_dir = -math.deg(dir) + local angle_relative = (angle_north - angle_dir + 180) % 360 + compass_image = math.floor((angle_relative/11.25) + 0.5) % compass_frames end - local pos = player:getpos() - local dir = player:get_look_horizontal() - local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) - if angle_north < 0 then angle_north = angle_north + 360 end - local angle_dir = -math.deg(dir) - local angle_relative = (angle_north - angle_dir + 180) % 360 - local compass_image = math.floor((angle_relative/11.25) + 0.5)%32 for j,stack in ipairs(player:get_inventory():get_list("main")) do if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and @@ -45,7 +65,7 @@ minetest.register_globalstep(function(dtime) end) local images = {} -for frame=0,31 do +for frame = 0, compass_frames-1 do local s = string.format("%02d", frame) table.insert(images, "mcl_compass_compass_"..s..".png") end @@ -58,21 +78,23 @@ for i,img in ipairs(images) do if i == stereotype_frame then inv = 0 end - local use_doc, longdesc, usagehelp + local use_doc, longdesc, usagehelp, tt use_doc = i == stereotype_frame if use_doc then - longdesc = "Compasses are tools which point to the world origin (X=0, Z=0) or the spawn point in the Overworld." + tt = S("Points to the world origin") + longdesc = S("Compasses are tools which point to the world origin (X=0, Z=0) or the spawn point in the Overworld.") end local itemstring = "mcl_compass:"..(i-1) minetest.register_craftitem(itemstring, { - description = "Compass", + description = S("Compass"), + _tt_help = tt, _doc_items_create_entry = use_doc, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, inventory_image = img, wield_image = img, stack_max = 64, - groups = {not_in_creative_inventory=inv, compass=i, tool=1} + groups = {not_in_creative_inventory=inv, compass=i, tool=1, disable_repair=1} }) -- Help aliases. Makes sure the lookup tool works correctly diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr new file mode 100644 index 00000000..a78b70c0 --- /dev/null +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_compass +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Kompasse sind Werkzeuge, die zum Ursprungspunkt der Welt (X@=0, Z@=0) oder den Einstiegspunkt der Welt zeigen. +Compass=Kompass +Points to the world origin=Zeigt zum Startpunkt der Welt diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr new file mode 100644 index 00000000..4f9fd529 --- /dev/null +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_compass +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Las brújulas son herramientas que apuntan al origen del mundo (X @ = 0, Z @ = 0) o al punto de generación en el mundo. +Compass=Brújula \ No newline at end of file diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr new file mode 100644 index 00000000..89299fde --- /dev/null +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_compass +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Les boussoles sont des outils qui pointent vers l'origine du monde (X@=0,Z@=0) ou le point d'apparition dans l'Overworld. +Compass=Boussole +Points to the world origin=Pointe vers l'origine mondiale diff --git a/mods/ITEMS/mcl_compass/locale/template.txt b/mods/ITEMS/mcl_compass/locale/template.txt new file mode 100644 index 00000000..462a08bc --- /dev/null +++ b/mods/ITEMS/mcl_compass/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_compass +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.= +Compass= +Points to the world origin= diff --git a/mods/ITEMS/mcl_compass/textures/mcl_compass_compass_00.png b/mods/ITEMS/mcl_compass/textures/mcl_compass_compass_00.png index 5ba59433..9eb285cf 100644 Binary files a/mods/ITEMS/mcl_compass/textures/mcl_compass_compass_00.png and b/mods/ITEMS/mcl_compass/textures/mcl_compass_compass_00.png differ diff --git a/mods/ITEMS/mcl_compass/textures/mcl_compass_compass_01.png b/mods/ITEMS/mcl_compass/textures/mcl_compass_compass_01.png index 4688db60..f4576800 100644 Binary files a/mods/ITEMS/mcl_compass/textures/mcl_compass_compass_01.png and b/mods/ITEMS/mcl_compass/textures/mcl_compass_compass_01.png differ diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index 6f4443ae..a0ad38a7 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -399,6 +399,8 @@ minetest.register_craft({ } }) +-- TODO: Add crafting recipe: 9 ice → 1 packed ice +-- Add it when silk touch tools work. -- -- Crafting (tool repair) @@ -426,6 +428,13 @@ minetest.register_craft({ cooktime = 10, }) +minetest.register_craft({ + type = "cooking", + output = "mcl_core:stone_smooth", + recipe = "mcl_core:stone", + cooktime = 10, +}) + minetest.register_craft({ type = "cooking", output = "mcl_core:stonebrickcracked", @@ -517,6 +526,12 @@ minetest.register_craft({ burntime = 15, }) +minetest.register_craft({ + type = "fuel", + recipe = "group:bark", + burntime = 15, +}) + minetest.register_craft({ type = "fuel", recipe = "mcl_core:ladder", diff --git a/mods/ITEMS/mcl_core/craftitems.lua b/mods/ITEMS/mcl_core/craftitems.lua index 7b456ff5..9dc9d370 100644 --- a/mods/ITEMS/mcl_core/craftitems.lua +++ b/mods/ITEMS/mcl_core/craftitems.lua @@ -1,12 +1,14 @@ -- mods/default/craftitems.lua +local S = minetest.get_translator("mcl_core") + -- -- Crafting items -- minetest.register_craftitem("mcl_core:stick", { - description = "Stick", - _doc_items_longdesc = "Sticks are a very versatile crafting material; used in countless crafting recipes.", + description = S("Stick"), + _doc_items_longdesc = S("Sticks are a very versatile crafting material; used in countless crafting recipes."), _doc_items_hidden = false, inventory_image = "default_stick.png", stack_max = 64, @@ -14,16 +16,16 @@ minetest.register_craftitem("mcl_core:stick", { }) minetest.register_craftitem("mcl_core:paper", { - description = "Paper", - _doc_items_longdesc = "Paper is used to craft books and maps.", + description = S("Paper"), + _doc_items_longdesc = S("Paper is used to craft books and maps."), inventory_image = "default_paper.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:coal_lump", { - description = "Coal", - _doc_items_longdesc = "“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.", + description = S("Coal"), + _doc_items_longdesc = S("“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things."), _doc_items_hidden = false, groups = { coal=1 }, inventory_image = "default_coal_lump.png", @@ -32,8 +34,8 @@ minetest.register_craftitem("mcl_core:coal_lump", { }) minetest.register_craftitem("mcl_core:charcoal_lump", { - description = "Charcoal", - _doc_items_longdesc = "Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.", + description = S("Charcoal"), + _doc_items_longdesc = S("Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks."), _doc_items_hidden = false, groups = { coal=1 }, inventory_image = "mcl_core_charcoal.png", @@ -42,32 +44,32 @@ minetest.register_craftitem("mcl_core:charcoal_lump", { }) minetest.register_craftitem("mcl_core:iron_nugget", { - description = "Iron Nugget", - _doc_items_longdesc = "Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.", + description = S("Iron Nugget"), + _doc_items_longdesc = S("Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots."), inventory_image = "mcl_core_iron_nugget.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:gold_nugget", { - description = "Gold Nugget", - _doc_items_longdesc = "Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.", + description = S("Gold Nugget"), + _doc_items_longdesc = S("Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots."), inventory_image = "mcl_core_gold_nugget.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:diamond", { - description = "Diamond", - _doc_items_longdesc = "Diamonds are precious minerals and useful to create the highest tier of armor and tools.", + description = S("Diamond"), + _doc_items_longdesc = S("Diamonds are precious minerals and useful to create the highest tier of armor and tools."), inventory_image = "default_diamond.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:clay_lump", { - description = "Clay", - _doc_items_longdesc = "Clay is a raw material.", + description = S("Clay Ball"), + _doc_items_longdesc = S("Clay balls are a raw material, mainly used to create bricks in the furnace."), _doc_items_hidden = false, inventory_image = "default_clay_lump.png", stack_max = 64, @@ -75,64 +77,64 @@ minetest.register_craftitem("mcl_core:clay_lump", { }) minetest.register_craftitem("mcl_core:iron_ingot", { - description = "Iron Ingot", - _doc_items_longdesc = "Molten iron. It is used to craft armor, tools, and whatnot.", + description = S("Iron Ingot"), + _doc_items_longdesc = S("Molten iron. It is used to craft armor, tools, and whatnot."), inventory_image = "default_steel_ingot.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:gold_ingot", { - description = "Gold Ingot", - _doc_items_longdesc = "Molten gold. It is used to craft armor, tools, and whatnot.", + description = S("Gold Ingot"), + _doc_items_longdesc = S("Molten gold. It is used to craft armor, tools, and whatnot."), inventory_image = "default_gold_ingot.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:emerald", { - description = "Emerald", - _doc_items_longdesc = "Emeralds are not very useful on their own, but many villagers have a love for emeralds and often use it as a currency in trading.", + description = S("Emerald"), + _doc_items_longdesc = S("Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting."), inventory_image = "mcl_core_emerald.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:brick", { - description = "Brick", - _doc_items_longdesc = "Bricks are used to craft brick blocks.", + description = S("Brick"), + _doc_items_longdesc = S("Bricks are used to craft brick blocks."), inventory_image = "default_clay_brick.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:flint", { - description = "Flint", - _doc_items_longdesc = "Flint is a raw material.", + description = S("Flint"), + _doc_items_longdesc = S("Flint is a raw material."), inventory_image = "default_flint.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:sugar", { - description = "Sugar", - _doc_items_longdesc = "Sugar comes from sugar canes and is used to make sweet foods.", + description = S("Sugar"), + _doc_items_longdesc = S("Sugar comes from sugar canes and is used to make sweet foods."), inventory_image = "mcl_core_sugar.png", stack_max = 64, groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_core:bowl",{ - description = "Bowl", - _doc_items_longdesc = "Bowls are mainly used to hold tasty soups.", + description = S("Bowl"), + _doc_items_longdesc = S("Bowls are mainly used to hold tasty soups."), inventory_image = "mcl_core_bowl.png", stack_max = 64, groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_core:apple", { - description = "Apple", - _doc_items_longdesc = "Apples are food items which can be eaten.", + description = S("Apple"), + _doc_items_longdesc = S("Apples are food items which can be eaten."), wield_image = "default_apple.png", inventory_image = "default_apple.png", stack_max = 64, @@ -144,14 +146,15 @@ minetest.register_craftitem("mcl_core:apple", { -- TODO: Status effects minetest.register_craftitem("mcl_core:apple_gold", { - description = core.colorize("#55FFFF", "Golden Apple"), - _doc_items_longdesc = "Golden apples are precious food items which can be eaten.", + -- TODO: Add special highlight color when this item is special + description = S("Golden Apple"), + _doc_items_longdesc = S("Golden apples are precious food items which can be eaten."), wield_image = "mcl_core_apple_golden.png", inventory_image = "mcl_core_apple_golden.png", stack_max = 64, -- TODO: Reduce to 4 when it's ready - on_place = minetest.item_eat(8), - on_secondary_use = minetest.item_eat(8), - groups = { food = 2, eatable = 8, can_eat_when_full = 1 }, + on_place = minetest.item_eat(20), + on_secondary_use = minetest.item_eat(20), + groups = { food = 2, eatable = 20, can_eat_when_full = 1 }, _mcl_saturation = 9.6, }) diff --git a/mods/ITEMS/mcl_core/depends.txt b/mods/ITEMS/mcl_core/depends.txt index 41997d06..9d0e5221 100644 --- a/mods/ITEMS/mcl_core/depends.txt +++ b/mods/ITEMS/mcl_core/depends.txt @@ -1,5 +1,6 @@ mcl_init mcl_sounds mcl_util +mcl_worlds doc_items doc? diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 5a181069..e8d7c2c2 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -2,6 +2,8 @@ -- Lava vs water interactions -- +local mg_name = minetest.get_mapgen_setting("mg_name") + minetest.register_abm({ label = "Lava cooling", nodenames = {"group:lava"}, @@ -19,21 +21,21 @@ minetest.register_abm({ -- Lava on top of water: Water turns into stone if water[w].y < pos.y and water[w].x == pos.x and water[w].z == pos.z then minetest.set_node(water[w], {name="mcl_core:stone"}) - minetest.sound_play("fire_extinguish_flame", {pos = water[w], gain = 0.25, max_hear_distance = 16}) + minetest.sound_play("fire_extinguish_flame", {pos = water[w], gain = 0.25, max_hear_distance = 16}, true) -- Flowing lava vs water on same level: Lava turns into cobblestone elseif lavatype == "flowing" and water[w].y == pos.y and (water[w].x == pos.x or water[w].z == pos.z) then minetest.set_node(pos, {name="mcl_core:cobble"}) - minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}) - -- Still lava vs flowing water above or horizontally neighbored: Lava turns into obsidian + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + -- Lava source vs flowing water above or horizontally neighbored: Lava turns into obsidian elseif lavatype == "source" and ((water[w].y > pos.y and water[w].x == pos.x and water[w].z == pos.z) or (water[w].y == pos.y and (water[w].x == pos.x or water[w].z == pos.z))) then minetest.set_node(pos, {name="mcl_core:obsidian"}) - minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}) + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) -- Flowing water above flowing lava: Lava turns into cobblestone elseif watertype == "flowing" and lavatype == "flowing" and water[w].y > pos.y and water[w].x == pos.x and water[w].z == pos.z then minetest.set_node(pos, {name="mcl_core:cobble"}) - minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}) + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) end end end, @@ -65,7 +67,7 @@ end mcl_core.grow_reeds = function(pos, node) pos.y = pos.y-1 local name = minetest.get_node(pos).name - if minetest.get_node_group(name, "soil_sugarcane") ~= 0 then + if minetest.get_item_group(name, "soil_sugarcane") ~= 0 then if minetest.find_node_near(pos, 1, {"group:water"}) == nil and minetest.find_node_near(pos, 1, {"group:frosted_ice"}) == nil then return end @@ -88,6 +90,9 @@ end local function drop_attached_node(p) local nn = minetest.get_node(p).name + if nn == "air" or nn == "ignore" then + return + end minetest.remove_node(p) for _, item in pairs(minetest.get_node_drops(nn, "")) do local pos = { @@ -95,7 +100,9 @@ local function drop_attached_node(p) y = p.y + math.random()/2 - 0.25, z = p.z + math.random()/2 - 0.25, } - minetest.add_item(pos, item) + if item ~= "" then + minetest.add_item(pos, item) + end end end @@ -159,7 +166,7 @@ minetest.register_abm({ action = function(pos, node, active_object_count, active_object_count_wider) liquid_flow_action(pos, "lava", function(pos) minetest.remove_node(pos) - minetest.sound_play("builtin_item_lava", {pos = pos, gain = 0.25, max_hear_distance = 16}) + minetest.sound_play("builtin_item_lava", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) core.check_for_falling(pos) end) end, @@ -188,7 +195,7 @@ minetest.register_abm({ }) -- --- Papyrus and cactus drop +-- Sugar canes drop -- local timber_nodenames={"mcl_core:reeds"} @@ -196,15 +203,11 @@ local timber_nodenames={"mcl_core:reeds"} minetest.register_on_dignode(function(pos, node) local i=1 while timber_nodenames[i]~=nil do - if node.name==timber_nodenames[i] then - local np={x=pos.x, y=pos.y+1, z=pos.z} - while minetest.get_node(np).name==timber_nodenames[i] do - minetest.remove_node(np) - if not minetest.settings:get_bool("creative_mode") then - minetest.add_item(np, timber_nodenames[i]) - end - np={x=np.x, y=np.y+1, z=np.z} - end + local np={x=pos.x, y=pos.y+1, z=pos.z} + while minetest.get_node(np).name==timber_nodenames[i] do + minetest.remove_node(np) + minetest.add_item(np, timber_nodenames[i]) + np={x=np.x, y=np.y+1, z=np.z} end i=i+1 end @@ -218,7 +221,7 @@ local function air_leaf(leaftype) end end -function mcl_core.generate_tree(pos, trunk, leaves, typearbre) +function mcl_core.generate_tree(pos, tree_type, two_by_two) pos.y = pos.y-1 local nodename = minetest.get_node(pos).name @@ -227,206 +230,145 @@ function mcl_core.generate_tree(pos, trunk, leaves, typearbre) return end local node - if typearbre == nil or typearbre == 1 then - node = {name = ""} - for dy=1,4 do - pos.y = pos.y+dy - if minetest.get_node(pos).name ~= "air" then - return - end - pos.y = pos.y-dy - end - node = {name = trunk} - for dy=0,4 do - pos.y = pos.y+dy - if minetest.get_node(pos).name == "air" then - minetest.add_node(pos, node) - end - pos.y = pos.y-dy - end - node = {name = leaves} - pos.y = pos.y+3 - local rarity = 0 - if math.random(0, 10) == 3 then - rarity = 1 + if tree_type == nil or tree_type == 1 then + if mg_name == "v6" then + mcl_core.generate_v6_oak_tree(pos) + else + mcl_core.generate_oak_tree(pos) end - for dx=-2,2 do - for dz=-2,2 do - for dy=0,3 do - pos.x = pos.x+dx - pos.y = pos.y+dy - pos.z = pos.z+dz - - if dx == 0 and dz == 0 and dy==3 then - if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then - minetest.add_node(pos, node) - minetest.add_node(pos, air_leaf(leaves)) - end - elseif dx == 0 and dz == 0 and dy==4 then - if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then - minetest.add_node(pos, node) - minetest.add_node(pos, air_leaf(leaves)) - end - elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then - if minetest.get_node(pos).name == "air" then - minetest.add_node(pos, node) - minetest.add_node(pos, air_leaf(leaves)) - end - else - if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then - if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then - minetest.add_node(pos, node) - minetest.add_node(pos, air_leaf(leaves)) - end - end - end - pos.x = pos.x-dx - pos.y = pos.y-dy - pos.z = pos.z-dz - end + elseif tree_type == 2 and two_by_two then + mcl_core.generate_dark_oak_tree(pos) + elseif tree_type == 3 then + if two_by_two then + mcl_core.generate_huge_spruce_tree(pos) + else + if mg_name == "v6" then + mcl_core.generate_v6_spruce_tree(pos) + else + mcl_core.generate_spruce_tree(pos) end end - elseif typearbre == 2 then - node = {name = ""} - - -- can place big tree ? - local tree_size = math.random(15, 25) - for dy=1,4 do - pos.y = pos.y+dy - if minetest.get_node(pos).name ~= "air" then - return - end - pos.y = pos.y-dy - end - - --Cheak for placing big tree - pos.y = pos.y-1 - for dz=0,1 do - pos.z = pos.z + dz - --> 0 - local name = minetest.get_node(pos).name - if name == "mcl_core:dirt_with_grass" - or name == "mcl_core:dirt_with_grass_snow" - or name == "mcl_core:dirt" then else - return - end - pos.x = pos.x+1 - --> 1 - if name == "mcl_core:dirt_with_grass" - or name == "mcl_core:dirt_with_grass_snow" - or name == "mcl_core:dirt" then else - return - end - pos.x = pos.x-1 - pos.z = pos.z - dz - end - pos.y = pos.y+1 - - - -- Make tree with vine - node = {name = trunk} - for dy=0,tree_size do - pos.y = pos.y+dy - - for dz=-1,2 do - if dz == -1 then - pos.z = pos.z + dz - if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then - minetest.add_node(pos, {name = "mcl_core:vine", param2 = 4}) - end - pos.x = pos.x+1 - if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then - minetest.add_node(pos, {name = "mcl_core:vine", param2 = 4}) - end - pos.x = pos.x-1 - pos.z = pos.z - dz - elseif dz == 2 then - pos.z = pos.z + dz - if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air"then - minetest.add_node(pos, {name = "mcl_core:vine", param2 = 5}) - end - pos.x = pos.x+1 - if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then - minetest.add_node(pos, {name = "mcl_core:vine", param2 = 5}) - end - pos.x = pos.x-1 - pos.z = pos.z - dz - else - pos.z = pos.z + dz - pos.x = pos.x-1 - if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then - minetest.add_node(pos, {name = "mcl_core:vine", param2 = 2}) - end - pos.x = pos.x+1 - if minetest.get_node(pos).name == "air" then - minetest.add_node(pos, {name = trunk, param2=2}) - end - pos.x = pos.x+1 - if minetest.get_node(pos).name == "air" then - minetest.add_node(pos, {name = trunk, param2=2}) - end - pos.x = pos.x+1 - if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then - minetest.add_node(pos, {name = "mcl_core:vine", param2 = 3}) - end - pos.x = pos.x-2 - pos.z = pos.z - dz - end - end - - pos.y = pos.y-dy - end - - -- make leaves - node = {name = leaves} - pos.y = pos.y+tree_size-4 - for dx=-4,4 do - for dz=-4,4 do - for dy=0,3 do - pos.x = pos.x+dx - pos.y = pos.y+dy - pos.z = pos.z+dz - - if dx == 0 and dz == 0 and dy==3 then - if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" and math.random(1, 2) == 1 then - minetest.add_node(pos, node) - end - elseif dx == 0 and dz == 0 and dy==4 then - if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" and math.random(1, 5) == 1 then - minetest.add_node(pos, node) - minetest.add_node(pos, air_leaf(leaves)) - end - elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then - if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" then - minetest.add_node(pos, node) - end - else - if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then - if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" and math.random(1, 3) == 1 then - minetest.add_node(pos, node) - end - else - if math.random(1, 5) == 1 and minetest.get_node(pos).name == "air" then - minetest.add_node(pos, node) - end - end - end - pos.x = pos.x-dx - pos.y = pos.y-dy - pos.z = pos.z-dz - end + elseif tree_type == 4 then + mcl_core.generate_acacia_tree(pos) + elseif tree_type == 5 then + if two_by_two then + mcl_core.generate_huge_jungle_tree(pos) + else + if mg_name == "v6" then + mcl_core.generate_v6_jungle_tree(pos) + else + mcl_core.generate_jungle_tree(pos) end end - elseif typearbre == 3 then - mcl_core.generate_spruce_tree(pos) - elseif typearbre == 4 then - mcl_core.grow_new_acacia_tree(pos) - elseif typearbre == 5 then - mcl_core.generate_jungle_tree(pos) + elseif tree_type == 6 then + mcl_core.generate_birch_tree(pos) end end +-- Classic oak in v6 style +function mcl_core.generate_v6_oak_tree(pos) + local trunk = "mcl_core:tree" + local leaves = "mcl_core:leaves" + local node = {name = ""} + for dy=1,4 do + pos.y = pos.y+dy + if minetest.get_node(pos).name ~= "air" then + return + end + pos.y = pos.y-dy + end + node = {name = trunk} + for dy=0,4 do + pos.y = pos.y+dy + if minetest.get_node(pos).name == "air" then + minetest.add_node(pos, node) + end + pos.y = pos.y-dy + end + + node = {name = leaves} + pos.y = pos.y+3 + local rarity = 0 + if math.random(0, 10) == 3 then + rarity = 1 + end + for dx=-2,2 do + for dz=-2,2 do + for dy=0,3 do + pos.x = pos.x+dx + pos.y = pos.y+dy + pos.z = pos.z+dz + + if dx == 0 and dz == 0 and dy==3 then + if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then + minetest.add_node(pos, node) + minetest.add_node(pos, air_leaf(leaves)) + end + elseif dx == 0 and dz == 0 and dy==4 then + if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then + minetest.add_node(pos, node) + minetest.add_node(pos, air_leaf(leaves)) + end + elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then + if minetest.get_node(pos).name == "air" then + minetest.add_node(pos, node) + minetest.add_node(pos, air_leaf(leaves)) + end + else + if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then + if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then + minetest.add_node(pos, node) + minetest.add_node(pos, air_leaf(leaves)) + end + end + end + pos.x = pos.x-dx + pos.y = pos.y-dy + pos.z = pos.z-dz + end + end + end +end + +-- Oak +function mcl_core.generate_oak_tree(pos) + local r = math.random(1, 12) + local path + local offset + -- Balloon oak + if r == 1 then + local s = math.random(1, 12) + if s == 1 then + -- Small balloon oak + path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_oak_balloon.mts" + offset = { x = -2, y = -1, z = -2 } + else + -- Large balloon oak + local t = math.random(1, 4) + path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_oak_large_"..t..".mts" + if t == 1 or t == 3 then + offset = { x = -3, y = -1, z = -3 } + elseif t == 2 or t == 4 then + offset = { x = -4, y = -1, z = -4 } + end + end + -- Classic oak + else + path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_oak_classic.mts" + offset = { x = -2, y = -1, z = -2 } + + end + minetest.place_schematic(vector.add(pos, offset), path, "random", nil, false) +end + +-- Birch +function mcl_core.generate_birch_tree(pos) + local path = minetest.get_modpath("mcl_core") .. + "/schematics/mcl_core_birch.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, path, "random", nil, false) +end + -- BEGIN of spruce tree generation functions -- -- Copied from Minetest Game 0.4.15 from the pine tree (default.generate_pine_tree) @@ -438,7 +380,7 @@ local function add_spruce_leaves(data, vi, c_air, c_ignore, c_snow, c_spruce_lea end end -function mcl_core.generate_spruce_tree(pos) +function mcl_core.generate_v6_spruce_tree(pos) local x, y, z = pos.x, pos.y, pos.z local maxy = y + math.random(9, 13) -- Trunk top @@ -532,16 +474,55 @@ function mcl_core.generate_spruce_tree(pos) vm:set_data(data) vm:write_to_map() - vm:update_map() +end + +mcl_core.generate_spruce_tree = function(pos) + local r = math.random(1, 3) + local path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_spruce_"..r..".mts" + minetest.place_schematic({ x = pos.x - 3, y = pos.y - 1, z = pos.z - 3 }, path, "0", nil, false) +end + +mcl_core.generate_huge_spruce_tree = function(pos) + local r1 = math.random(1, 2) + local r2 = math.random(1, 4) + local path + local offset = { x = -4, y = -1, z = -5 } + if r1 <= 2 then + -- Mega Spruce Taiga (full canopy) + path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_spruce_huge_"..r2..".mts" + else + -- Mega Taiga (leaves only at top) + if r2 == 1 or r2 == 3 then + offset = { x = -3, y = -1, z = -4} + end + path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_spruce_huge_up_"..r2..".mts" + end + minetest.place_schematic(vector.add(pos, offset), path, "0", nil, false) end -- END of spruce tree functions -- --- Acacia tree grow function from Minetest Game 0.4.15 -function mcl_core.grow_new_acacia_tree(pos) +-- Acacia tree (multiple variants) +function mcl_core.generate_acacia_tree(pos) + local r = math.random(1, 7) + local offset = vector.new() + if r == 2 or r == 3 then + offset = { x = -4, y = -1, z = -4 } + elseif r == 4 or r == 6 or r == 7 then + offset = { x = -3, y = -1, z = -3 } + elseif r == 1 or r == 5 then + offset = { x = -5, y = -1, z = -5 } + end + local path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_acacia_"..r..".mts" + minetest.place_schematic(vector.add(pos, offset), path, "random", nil, false) +end + +-- Generate dark oak tree with 2×2 trunk. +-- With pos being the lower X and the higher Z value of the trunk +function mcl_core.generate_dark_oak_tree(pos) local path = minetest.get_modpath("mcl_core") .. - "/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) + "/schematics/mcl_core_dark_oak.mts" + minetest.place_schematic({x = pos.x - 3, y = pos.y - 1, z = pos.z - 4}, path, "random", nil, false) end -- Helper function for jungle tree, form Minetest Game 0.4.15 @@ -594,7 +575,7 @@ local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, end -- Old jungle tree grow function from Minetest Game 0.4.15, imitating v6 jungle trees -function mcl_core.generate_jungle_tree(pos) +function mcl_core.generate_v6_jungle_tree(pos) --[[ NOTE: Jungletree-placing code is currently duplicated in the engine and in games that have saplings; both are deprecated but not @@ -637,12 +618,41 @@ function mcl_core.generate_jungle_tree(pos) vm:set_data(data) vm:write_to_map() - vm:update_map() +end + +function mcl_core.generate_jungle_tree(pos) + local path = minetest.get_modpath("mcl_core") .. + "/schematics/mcl_core_jungle_tree.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, path, "random", nil, false) +end + +-- Generate huge jungle tree with 2×2 trunk. +-- With pos being the lower X and the higher Z value of the trunk. +function mcl_core.generate_huge_jungle_tree(pos) + -- 2 variants + local r = math.random(1, 2) + local path = minetest.get_modpath("mcl_core") .. + "/schematics/mcl_core_jungle_tree_huge_"..r..".mts" + minetest.place_schematic({x = pos.x - 6, y = pos.y - 1, z = pos.z - 7}, path, "random", nil, false) end +local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed")) -local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_params().seed) +-- Return appropriate grass block node for pos +function mcl_core.get_grass_block_type(pos) + local biome_data = minetest.get_biome_data(pos) + local index = 0 + if biome_data then + local biome = biome_data.biome + local biome_name = minetest.get_biome_name(biome) + local reg_biome = minetest.registered_biomes[biome_name] + if reg_biome then + index = reg_biome._mcl_palette_index + end + end + return {name="mcl_core:dirt_with_grass", param2=index} +end ------------------------------ -- Spread grass blocks and mycelium on neighbor dirt @@ -650,7 +660,7 @@ local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_params().seed) minetest.register_abm({ label = "Grass Block and Mycelium spread", nodenames = {"mcl_core:dirt"}, - neighbors = {"air", "mcl_core:dirt_with_grass", "mcl_core:mycelium"}, + neighbors = {"air", "group:grass_block_no_snow", "mcl_core:mycelium"}, interval = 30, chance = 20, catch_up = false, @@ -686,6 +696,9 @@ minetest.register_abm({ if light_self >= 4 and light_source >= 9 then -- All checks passed! Let's spread the grass/mycelium! local n2 = minetest.get_node(p2) + if minetest.get_item_group(n2.name, "grass_block") ~= 0 then + n2 = mcl_core.get_grass_block_type(pos) + end minetest.set_node(pos, {name=n2.name}) -- If this was mycelium, uproot plant above @@ -718,7 +731,8 @@ minetest.register_abm({ -- Turn Grass Path and similar nodes to Dirt if a solid node is placed above it minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) - if minetest.get_item_group(newnode.name, "solid") ~= 0 then + if minetest.get_item_group(newnode.name, "solid") ~= 0 or + minetest.get_item_group(newnode.name, "dirtifier") ~= 0 then local below = {x=pos.x, y=pos.y-1, z=pos.z} local belownode = minetest.get_node(below) if minetest.get_item_group(belownode.name, "dirtifies_below_solid") == 1 then @@ -743,25 +757,120 @@ minetest.register_abm({ end, }) +local SAVANNA_INDEX = 1 +minetest.register_lbm({ + label = "Replace legacy dry grass", + name = "mcl_core:replace_legacy_dry_grass_0_65_0", + nodenames = {"mcl_core:dirt_with_dry_grass", "mcl_core:dirt_with_dry_grass_snow"}, + action = function(pos, node) + local biome_data = minetest.get_biome_data(pos) + if biome_data then + local biome = biome_data.biome + local biome_name = minetest.get_biome_name(biome) + local reg_biome = minetest.registered_biomes[biome_name] + if reg_biome then + if node.name == "mcl_core:dirt_with_dry_grass_snow" then + node.name = "mcl_core:dirt_with_grass_snow" + else + node.name = "mcl_core:dirt_with_grass" + end + node.param2 = reg_biome._mcl_palette_index + -- Fall back to savanna palette index + if not node.param2 then + node.param2 = SAVANNA_INDEX + end + minetest.set_node(pos, node) + return + end + end + node.param2 = SAVANNA_INDEX + minetest.set_node(pos, node) + return + end, +}) + -------------------------- -- Try generate tree --- -------------------------- local treelight = 9 -local sapling_grow_action = function(trunknode, leafnode, tree_id, soil_needed) +local sapling_grow_action = function(tree_id, soil_needed, one_by_one, two_by_two, sapling) return function(pos) - local light = minetest.get_node_light(pos) - local soilnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - local soiltype = minetest.get_item_group(soilnode.name, "soil_sapling") - if soiltype >= soil_needed and light and light >= treelight then + -- Checks if the sapling at pos has enough light and the correct soil + local sapling_is_growable = function(pos) + local light = minetest.get_node_light(pos) + local soilnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + local soiltype = minetest.get_item_group(soilnode.name, "soil_sapling") + return soiltype >= soil_needed and light and light >= treelight + end + if sapling_is_growable(pos) then -- Increase and check growth stage local meta = minetest.get_meta(pos) local stage = meta:get_int("stage") if stage == nil then stage = 0 end stage = stage + 1 if stage >= 3 then - minetest.set_node(pos, {name="air"}) - mcl_core.generate_tree(pos, trunknode, leafnode, tree_id) + -- This sapling grows in a special way when there are 4 saplings in a 2×2 pattern + if two_by_two then + -- Check 8 surrounding saplings and try to find a 2×2 pattern + local is_sapling = function(pos, sapling) + return minetest.get_node(pos).name == sapling + end + local p2 = {x=pos.x+1, y=pos.y, z=pos.z} + local p3 = {x=pos.x, y=pos.y, z=pos.z-1} + local p4 = {x=pos.x+1, y=pos.y, z=pos.z-1} + local p5 = {x=pos.x-1, y=pos.y, z=pos.z-1} + local p6 = {x=pos.x-1, y=pos.y, z=pos.z} + local p7 = {x=pos.x-1, y=pos.y, z=pos.z+1} + local p8 = {x=pos.x, y=pos.y, z=pos.z+1} + local p9 = {x=pos.x+1, y=pos.y, z=pos.z+1} + local s2 = is_sapling(p2, sapling) + local s3 = is_sapling(p3, sapling) + local s4 = is_sapling(p4, sapling) + local s5 = is_sapling(p5, sapling) + local s6 = is_sapling(p6, sapling) + local s7 = is_sapling(p7, sapling) + local s8 = is_sapling(p8, sapling) + local s9 = is_sapling(p9, sapling) + -- In a 9×9 field there are 4 possible 2×2 squares. We check them all. + if s2 and s3 and s4 then + -- Success: Remove saplings and place tree + minetest.remove_node(pos) + minetest.remove_node(p2) + minetest.remove_node(p3) + minetest.remove_node(p4) + mcl_core.generate_tree(pos, tree_id, true) + return + elseif s3 and s5 and s6 then + minetest.remove_node(pos) + minetest.remove_node(p3) + minetest.remove_node(p5) + minetest.remove_node(p6) + mcl_core.generate_tree(p6, tree_id, true) + return + elseif s6 and s7 and s8 then + minetest.remove_node(pos) + minetest.remove_node(p6) + minetest.remove_node(p7) + minetest.remove_node(p8) + mcl_core.generate_tree(p7, tree_id, true) + return + elseif s2 and s8 and s9 then + minetest.remove_node(pos) + minetest.remove_node(p2) + minetest.remove_node(p8) + minetest.remove_node(p9) + mcl_core.generate_tree(p8, tree_id, true) + return + end + end + -- If this sapling can grow alone + if one_by_one then + -- Single sapling + minetest.set_node(pos, {name="air"}) + mcl_core.generate_tree(pos, tree_id) + return + end else meta:set_int("stage", stage) end @@ -769,6 +878,13 @@ local sapling_grow_action = function(trunknode, leafnode, tree_id, soil_needed) end end +local grow_oak = sapling_grow_action(1, 1, true, false) +local grow_dark_oak = sapling_grow_action(2, 2, false, true, "mcl_core:darksapling") +local grow_jungle_tree = sapling_grow_action(5, 1, true, true, "mcl_core:junglesapling") +local grow_acacia = sapling_grow_action(4, 2, true, false) +local grow_spruce = sapling_grow_action(3, 1, true, true, "mcl_core:sprucesapling") +local grow_birch = sapling_grow_action(6, 1, true, false) + -- Attempts to grow the sapling at the specified position -- pos: Position -- node: Node table of the node at this position, from minetest.get_node @@ -776,17 +892,17 @@ end mcl_core.grow_sapling = function(pos, node) local grow if node.name == "mcl_core:sapling" then - grow = sapling_grow_action("mcl_core:tree", "mcl_core:leaves", 1, 1) + grow = grow_oak elseif node.name == "mcl_core:darksapling" then - grow = sapling_grow_action("mcl_core:darktree", "mcl_core:darkleaves", 1, 2) + grow = grow_dark_oak elseif node.name == "mcl_core:junglesapling" then - grow = sapling_grow_action("mcl_core:jungletree", "mcl_core:jungleleaves", 5, 1) + grow = grow_jungle_tree elseif node.name == "mcl_core:acaciasapling" then - grow = sapling_grow_action("mcl_core:acaciatree", "mcl_core:acacialeaves", 4, 2) + grow = grow_acacia elseif node.name == "mcl_core:sprucesapling" then - grow = sapling_grow_action("mcl_core:sprucetree", "mcl_core:spruceleaves", 3, 1) + grow = grow_spruce elseif node.name == "mcl_core:birchsapling" then - grow = sapling_grow_action("mcl_core:birchtree", "mcl_core:birchleaves", 1, 1) + grow = grow_birch end if grow then grow(pos) @@ -806,7 +922,7 @@ minetest.register_abm({ neighbors = {"group:soil_sapling"}, interval = 25, chance = 2, - action = sapling_grow_action("mcl_core:tree", "mcl_core:leaves", 1, 1), + action = grow_oak, }) -- Dark oak tree @@ -816,7 +932,7 @@ minetest.register_abm({ neighbors = {"group:soil_sapling"}, interval = 25, chance = 2, - action = sapling_grow_action("mcl_core:darktree", "mcl_core:darkleaves", 1, 2), + action = grow_dark_oak, }) -- Jungle Tree @@ -826,7 +942,7 @@ minetest.register_abm({ neighbors = {"group:soil_sapling"}, interval = 25, chance = 2, - action = sapling_grow_action("mcl_core:jungletree", "mcl_core:jungleleaves", 5, 1) + action = grow_jungle_tree, }) -- Spruce tree @@ -836,7 +952,7 @@ minetest.register_abm({ neighbors = {"group:soil_sapling"}, interval = 25, chance = 2, - action = sapling_grow_action("mcl_core:sprucetree", "mcl_core:spruceleaves", 3, 1), + action = grow_spruce }) -- Birch tree @@ -846,7 +962,7 @@ minetest.register_abm({ neighbors = {"group:soil_sapling"}, interval = 25, chance = 2, - action = sapling_grow_action("mcl_core:birchtree", "mcl_core:birchleaves", 1, 1), + action = grow_birch, }) -- Acacia tree @@ -856,7 +972,7 @@ minetest.register_abm({ neighbors = {"group:soil_sapling"}, interval = 20, chance = 2, - action = sapling_grow_action("mcl_core:acaciatree", "mcl_core:acacialeaves", 4, 2), + action = grow_acacia, }) --------------------- @@ -869,75 +985,75 @@ minetest.register_abm({ chance = 4, action = function(pos, node, active_object_count, active_object_count_wider) - local neighbor_offsets = { - { x=1, y=0, z=0 }, - { x=-1, y=0, z=0 }, - { x=0, y=0, z=1 }, - { x=0, y=0, z=-1 }, - } - - -- Add vines below pos (if empty) - local spread_down = function(pos, node) - local down = vector.add(pos, {x=0, y=-1, z=0}) - if minetest.get_node(down).name == "air" then - minetest.add_node(down, {name = "mcl_core:vine", param2 = node.param2}) - end + -- First of all, check if we are even supported, otherwise, let's die! + if not mcl_core.check_vines_supported(pos, node) then + minetest.remove_node(pos) + core.check_for_falling(pos) + return end - -- Add vines above pos if it is backed up - local spread_up = function(pos, node) - local up = vector.add(pos, {x=0, y=1, z=0}) - if minetest.get_node(up).name == "air" then - local backup_dir = minetest.facedir_to_dir(node.param2) - local backup = vector.add(up, backup_dir) - local backupnodename = minetest.get_node(backup).name - - -- Check if the block above is supported - if mcl_core.supports_vines(backupnodename) then - minetest.add_node(up, {name = "mcl_core:vine", param2 = node.param2}) + -- Add vines below pos (if empty) + local spread_down = function(origin, target, dir, node) + if math.random(1, 2) == 1 then + if minetest.get_node(target).name == "air" then + minetest.add_node(target, {name = "mcl_core:vine", param2 = node.param2}) end end end - -- Try to spread vines from the 4 horizontal neighbors - local spread_neighbors = function(pos, node, spread_dir) - for n=1, #neighbor_offsets do - if math.random(1,2) == 1 then - local neighbor = vector.add(pos, neighbor_offsets[n]) - local neighbornode = minetest.get_node(neighbor) - if neighbornode.name == "mcl_core:vine" then - if spread_dir == "up" then - spread_up(neighbor, neighbornode) - elseif spread_dir == "down" then - spread_down(neighbor, neighbornode) + -- Add vines above pos if it is backed up + local spread_up = function(origin, target, dir, node) + local vines_in_area = minetest.find_nodes_in_area({x=origin.x-4, y=origin.y-1, z=origin.z-4}, {x=origin.x+4, y=origin.y+1, z=origin.z+4}, "mcl_core:vine") + -- Less then 4 vines blocks around the ticked vines block (remember the ticked block is counted by above function as well) + if #vines_in_area < 5 then + if math.random(1, 2) == 1 then + if minetest.get_node(target).name == "air" then + local backup_dir = minetest.wallmounted_to_dir(node.param2) + local backup = vector.subtract(target, backup_dir) + local backupnodename = minetest.get_node(backup).name + + -- Check if the block above is supported + if mcl_core.supports_vines(backupnodename) then + minetest.add_node(target, {name = "mcl_core:vine", param2 = node.param2}) end end end end end - -- Spread down - local down = {x=pos.x, y=pos.y-1, z=pos.z} - local down_node = minetest.get_node(down) - if down_node.name == "air" then - spread_neighbors(pos, node, "down") - elseif down_node.name == "mcl_core:vine" then - spread_neighbors(down, down_node, "down") - end - - -- Spread up - local up = {x=pos.x, y=pos.y+1, z=pos.z} - local up_node = minetest.get_node(up) - if up_node.name == "air" then - local vines_in_area = minetest.find_nodes_in_area({x=pos.x-4, y=pos.y-1, z=pos.z-4}, {x=pos.x+4, y=pos.y+1, z=pos.z+4}, "mcl_core:vine") + local spread_horizontal = function(origin, target, dir, node) + local vines_in_area = minetest.find_nodes_in_area({x=origin.x-4, y=origin.y-1, z=origin.z-4}, {x=origin.x+4, y=origin.y+1, z=origin.z+4}, "mcl_core:vine") -- Less then 4 vines blocks around the ticked vines block (remember the ticked block is counted by above function as well) if #vines_in_area < 5 then - spread_neighbors(pos, node, "up") + -- Spread horizontally + local backup_dir = minetest.wallmounted_to_dir(node.param2) + if not vector.equals(backup_dir, dir) then + local target_node = minetest.get_node(target) + if target_node.name == "air" then + local backup = vector.add(target, backup_dir) + local backupnodename = minetest.get_node(backup).name + if mcl_core.supports_vines(backupnodename) then + minetest.add_node(target, {name = "mcl_core:vine", param2 = node.param2}) + end + end + end end end - -- TODO: Spread horizontally + local directions = { + { { x= 1, y= 0, z= 0 }, spread_horizontal }, + { { x=-1, y= 0, z= 0 }, spread_horizontal }, + { { x= 0, y= 1, z= 0 }, spread_up }, + { { x= 0, y=-1, z= 0 }, spread_down }, + { { x= 0, y= 0, z= 1 }, spread_horizontal }, + { { x= 0, y= 0, z=-1 }, spread_horizontal }, + } + local d = math.random(1, #directions) + local dir = directions[d][1] + local spread = directions[d][2] + + spread(pos, vector.add(pos, dir), dir, node) end }) @@ -945,7 +1061,9 @@ minetest.register_abm({ mcl_core.supports_vines = function(nodename) local def = minetest.registered_nodes[nodename] -- Rules: 1) walkable 2) full cube - return def.walkable and ((not def.node_box) or def.node_box.type == "regular") + return def.walkable and + (def.node_box == nil or def.node_box.type == "regular") and + (def.collision_box == nil or def.collision_box.type == "regular") end -- Leaf Decay @@ -958,8 +1076,6 @@ end -- If param2 of the node is ~= 0, the node will always be preserved. Thus, if -- the player places a node of that kind, you will want to set param2=1 or so. -- --- If the node is in the leafdecay_drop group then the it will always be dropped --- as an item mcl_core.leafdecay_trunk_cache = {} mcl_core.leafdecay_enable_cache = true @@ -1025,20 +1141,247 @@ minetest.register_abm({ -- Drop stuff other than the node itself local itemstacks = minetest.get_node_drops(n0.name) for _, itemname in ipairs(itemstacks) do - if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or - itemname ~= n0.name then - local p_drop = { - x = p0.x - 0.5 + math.random(), - y = p0.y - 0.5 + math.random(), - z = p0.z - 0.5 + math.random(), - } - minetest.add_item(p_drop, itemname) - end + local p_drop = { + x = p0.x - 0.5 + math.random(), + y = p0.y - 0.5 + math.random(), + z = p0.z - 0.5 + math.random(), + } + minetest.add_item(p_drop, itemname) end -- Remove node minetest.remove_node(p0) core.check_for_falling(p0) + + -- Kill depending vines immediately to skip the vines decay delay + local surround = { + { x = 0, y = 0, z = -1 }, + { x = 0, y = 0, z = 1 }, + { x = -1, y = 0, z = 0 }, + { x = 1, y = 0, z = 0 }, + { x = 0, y = -1, z = -1 }, + } + for s=1, #surround do + local spos = vector.add(p0, surround[s]) + local maybe_vine = minetest.get_node(spos) + local surround_inverse = vector.multiply(surround[s], -1) + if maybe_vine.name == "mcl_core:vine" and (not mcl_core.check_vines_supported(spos, maybe_vine)) then + minetest.remove_node(spos) + core.check_for_falling(spos) + end + end + end + end +}) + +-- Remove vines which are not supported by anything, similar to leaf decay. +--[[ TODO: Vines are supposed to die immediately when they supporting block is destroyed. +But doing this in Minetest would be too complicated / hacky. This vines decay is a simple +way to make sure that all floating vines are destroyed eventually. ]] +minetest.register_abm({ + label = "Vines decay", + nodenames = {"mcl_core:vine"}, + neighbors = {"air"}, + -- A low interval and a high inverse chance spreads the load + interval = 4, + chance = 8, + action = function(p0, node, _, _) + if not mcl_core.check_vines_supported(p0, node) then + -- Vines must die! + minetest.remove_node(p0) + -- Just in case a falling node happens to float above vines + core.check_for_falling(p0) end end }) +-- Melt snow +minetest.register_abm({ + label = "Top snow and ice melting", + nodenames = {"mcl_core:snow", "mcl_core:ice"}, + interval = 16, + chance = 8, + action = function(pos, node) + if minetest.get_node_light(pos, 0) >= 12 then + if node.name == "mcl_core:ice" then + mcl_core.melt_ice(pos) + else + minetest.remove_node(pos) + end + end + end +}) + +--[[ Call this for vines nodes only. +Given the pos and node of a vines node, this returns true if the vines are supported +and false if the vines are currently floating. +Vines are considered “supported” if they face a walkable+solid block or “hang” from a vines node above. ]] +function mcl_core.check_vines_supported(pos, node) + local supported = false + local dir = minetest.wallmounted_to_dir(node.param2) + local pos1 = vector.add(pos, dir) + local node_neighbor = minetest.get_node(pos1) + -- Check if vines are attached to a solid block. + -- If ignore, we assume its solid. + if node_neighbor.name == "ignore" or mcl_core.supports_vines(node_neighbor.name) then + supported = true + elseif dir.y == 0 then + -- Vines are not attached, now we check if the vines are “hanging” below another vines block + -- of equal orientation. + local pos2 = vector.add(pos, {x=0, y=1, z=0}) + local node2 = minetest.get_node(pos2) + -- Again, ignore means we assume its supported + if node2.name == "ignore" or (node2.name == "mcl_core:vine" and node2.param2 == node.param2) then + supported = true + end + end + return supported +end + +-- Melt ice at pos. mcl_core:ice MUST be a post if you call this! +function mcl_core.melt_ice(pos) + -- Create a water source if ice is destroyed and there was something below it + local below = {x=pos.x, y=pos.y-1, z=pos.z} + local belownode = minetest.get_node(below) + local dim = mcl_worlds.pos_to_dimension(below) + if dim ~= "nether" and belownode.name ~= "air" and belownode.name ~= "ignore" and belownode.name ~= "mcl_core:void" then + minetest.set_node(pos, {name="mcl_core:water_source"}) + else + minetest.remove_node(pos) + end +end + +---- FUNCTIONS FOR SNOWED NODES ---- +-- These are nodes which change their appearence when they are below a snow cover +-- and turn back into “normal” when the snow cover is removed. + +-- Registers a snowed variant of a node (e.g. grass block, podzol, mycelium). +-- * itemstring_snowed: Itemstring of the snowed node to add +-- * itemstring_clear: Itemstring of the original “clear” node without snow +-- * tiles: Optional custom tiles +-- * sounds: Optional custom sounds +-- * clear_colorization: Optional. If true, will clear all paramtype2="color" related node def. fields +-- +-- The snowable nodes also MUST have _mcl_snowed defined to contain the name +-- of the snowed node. +mcl_core.register_snowed_node = function(itemstring_snowed, itemstring_clear, tiles, sounds, clear_colorization) + local def = table.copy(minetest.registered_nodes[itemstring_clear]) + local create_doc_alias + if def.description then + create_doc_alias = true + else + create_doc_alias = false + end + -- Just some group clearing + def.description = nil + def._doc_items_longdesc = nil + def._doc_items_usagehelp = nil + def._doc_items_create_entry = false + def.groups.not_in_creative_inventory = 1 + if def.groups.grass_block == 1 then + def.groups.grass_block_no_snow = nil + def.groups.grass_block_snow = 1 + end + + -- Enderman must never take this because this block is supposed to be always buried below snow. + def.groups.enderman_takable = nil + + -- Snowed blocks never spread + def.groups.spreading_dirt_type = nil + + -- Add the clear node to the item definition for easy lookup + def._mcl_snowless = itemstring_clear + + -- Note: _mcl_snowed must be added to the clear node manually! + + if not tiles then + def.tiles = {"default_snow.png", "default_dirt.png", {name="mcl_core_grass_side_snowed.png", tileable_vertical=false}} + else + def.tiles = tiles + end + if clear_colorization then + def.paramtype2 = nil + def.palette = nil + def.palette_index = nil + def.color = nil + def.overlay_tiles = nil + end + if not sounds then + def.sounds = mcl_sounds.node_sound_dirt_defaults({ + footstep = { name = "pedology_snow_soft_footstep", gain = 0.5 } + }) + else + def.sounds = sounds + end + + -- Register stuff + minetest.register_node(itemstring_snowed, def) + + if create_doc_alias and minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", itemstring_clear, "nodes", itemstring_snowed) + end +end + +-- Reverts a snowed dirtlike node at pos to its original snow-less form. +-- This function assumes there is no snow cover node above. This function +-- MUST NOT be called if there is a snow cover node above pos. +mcl_core.clear_snow_dirt = function(pos, node) + local def = minetest.registered_nodes[node.name] + if def._mcl_snowless then + minetest.swap_node(pos, {name = def._mcl_snowless, param2=node.param2}) + end +end + +---- [[[[[ Functions for snowable nodes (nodes that can become snowed). ]]]]] ---- +-- Always add these for snowable nodes. + +-- on_construct +-- Makes constructed snowable node snowed if placed below a snow cover node. +mcl_core.on_snowable_construct = function(pos) + -- Myself + local node = minetest.get_node(pos) + + -- Above + local apos = {x=pos.x, y=pos.y+1, z=pos.z} + local anode = minetest.get_node(apos) + + -- Make snowed if needed + if minetest.get_item_group(anode.name, "snow_cover") == 1 then + local def = minetest.registered_nodes[node.name] + if def._mcl_snowed then + minetest.swap_node(pos, {name = def._mcl_snowed, param2=node.param2}) + end + end +end + + +---- [[[[[ Functions for snow cover nodes. ]]]]] ---- + +-- A snow cover node is a node which turns a snowed dirtlike -- +-- node into its snowed form while it is placed above. +-- MCL2's snow cover nodes are Top Snow (mcl_core:snow) and Snow (mcl_core:snowblock). + +-- Always add the following functions to snow cover nodes: + +-- on_construct +-- Makes snowable node below snowed. +mcl_core.on_snow_construct = function(pos) + local npos = {x=pos.x, y=pos.y-1, z=pos.z} + local node = minetest.get_node(npos) + local def = minetest.registered_nodes[node.name] + if def._mcl_snowed then + minetest.swap_node(npos, {name = def._mcl_snowed, param2=node.param2}) + end +end +-- after_destruct +-- Clears snowed dirtlike node below. +mcl_core.after_snow_destruct = function(pos) + local nn = minetest.get_node(pos).name + -- No-op if snow was replaced with snow + if minetest.get_item_group(nn, "snow_cover") == 1 then + return + end + local npos = {x=pos.x, y=pos.y-1, z=pos.z} + local node = minetest.get_node(npos) + mcl_core.clear_snow_dirt(npos, node) +end + diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr new file mode 100644 index 00000000..2092fa33 --- /dev/null +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -0,0 +1,257 @@ +# textdomain: mcl_core +@1 could not survive in lava.=@1 konnte nicht in Lava überleben. +@1 died in lava.=@1 starb in Lava. +@1 melted in lava.=@1 schmolz in der Lava. +@1 took a bath in a hot lava tub.=@1 nahm ein Bad in einer heißen Lavawanne. +A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Ein Diamantblock ist hauptsächlich ein schicker Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Diamanten. +A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Ein Smaragdblock ist hauptsächlich ein schicker Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Smaragden. +A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=Ein Goldblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Goldbarren. +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Ein Eisenblock ist hauptsächlich ein Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Eisenbarren. +A cactus can only be placed on top of another cactus or any sand.=Ein Kaktus kann nur auf einem anderen Kaktus oder auf beliebigem Sand platziert werden. +A decorative and mostly transparent block.=Ein Dekoblock, der größtenteils transparent ist. +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Ein Grasblock ist Erde mit einer Grasschicht. Grasblöcke sind vielseitige Blöcke, die das Wachstum aller möglichen Pflanzen fördern. Mit einer Hacke kann man das Land bestellen und einen Ackerboden machen. Mit einer Schaufel verwandelt man ihn in einen Graspfad. Im Licht wird das Gras sich langsam auf benachbarte Erde ausbreiten. Unter einem lichtundurchlässigen Block kann sich dieser Block wieder zurück zu Erde verwandeln. +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Ein Lapislazuliblock ist hauptsächlich ein Deko-Block aber er ist auch nützlich zur kompakten Aufbewahrung von Lapislazuli. +A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Eine Lavaquelle zündet einige Luftblöcke über ihr an, wenn sie sich neben einem entzündlichen Block befinden. +A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Ein Leiterstück, mit dem Sie vertikal klettern können. Leitern können nur an der Seite fester Blöcke und nicht an Glas, Blättern, Eis, Platten, Leuchtsteinen oder Ozeanlaternen platziert werden. +Acacia Bark=Akazienrinde +Acacia Leaves=Akazienblätter +Acacia Sapling=Akaziensetzling +Acacia Wood=Akazienholz +Acacia Wood Planks=Akazienholzplanken +Acacia leaves are grown from acacia trees.=Akazienblätter wachsen an Akazienbäumen. +Andesite=Andesit +Andesite is an igneous rock.=Andesit ist ein magmatisches Gestein. +Apple=Apfel +Apples are food items which can be eaten.=Äpfel sind essbare Gegenstände. +Barrier=Barriere +Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Barrieren sind unsichtbare feste Blöcke. Sie sind nützlich, um Grenzen für Abenteuerkarten und ähnliches zu bauen. Monster und Tiere werden auf Barrieren nicht auftauchen, und Zäune verbinden sich nicht mit Barrieren. Andere Blöcke können an Barrieren gebaut werden, wie bei allen anderen Blöcken. +Bedrock=Grundgestein +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Grundgestein ist ein sehr harter Gesteinstyp. Er kann unter normalen Umständen nicht abgebaut, zerstört, aufgesammelt oder verschoben werden, außer im Kreativmodus. +Birch Bark=Birkenrinde +Birch Leaves=Birkenblätter +Birch Sapling=Birkensetzling +Birch Wood=Birkenholz +Birch Wood Planks=Birkenholzplanken +Birch leaves are grown from birch trees.=Birkenblätter wachsen an Birken. +Black Stained Glass=Schwarzes Buntglas +Block of Coal=Kohleblock +Block of Diamond=Diamantblock +Block of Emerald=Smaragdblock +Block of Gold=Goldblock +Block of Iron=Eisenblock +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Kohleblöcke sind für eine kompakte Aufbewahrung von Kohle nützlich und sehr nützlich als Ofenbrennstoff. Ein Kohleblock ist so effizient wie 10 mal Kohle. +Blue Stained Glass=Blaues Buntglas +Bone Block=Knockenblock +Bone blocks are decorative blocks and a compact storage of bone meal.=Knochenblöcke sind Deko-Blöcke und geeignet zur kompakten Aufbewahrung von Knochenmehl. +Bowl=Schale +Bowls are mainly used to hold tasty soups.=Schalen werden hauptsächlich für leckere Suppen gebraucht. +Brick=Ziegel +Brick Block=Ziegelblock +Brick blocks are a good building material for building solid houses and can take quite a punch.=Ziegelblöcke sind ein gutes Baumaterial für den Bau stabiler Gebäude und halten einiges aus. +Bricks are used to craft brick blocks.=Ziegel werden zur Herstellung von Ziegelblöcken benötigt. +Brown Stained Glass=Braunes Buntglas +Cactus=Kaktus +Charcoal=Holzkohle +Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Holzkohle ist ein alternativer Brennstoff. Er entsteht, wenn Holz im Ofen verkohlt wird. Er brennt genau so lange wie Kohle und hat fast identische Herstellungsrezepte, aber es können keine Kohleblöcke damit gemacht werden. +Chiseled Stone Bricks=Gemeißelte Steinziegel +Chiseled Red Sandstone=Gemeißelter roter Sandstein +Chiseled Sandstone=Gemeißelter Sandstein +Chiseled red sandstone is a decorative building block.=Gemeißelter roter Sandstein ist ein dekorativer Block zum Bauen. +Chiseled sandstone is a decorative building block.=Gemeißelter Sandstein ist ein dekorativer Block zum Bauen. +Clay=Ton +Clay Ball=Tonklumpen +Clay balls are a raw material, mainly used to create bricks in the furnace.=Tonklumpen sind ein Rohstoff, sie werden hauptsächlich zur Ziegelherstellung im Ofen benutzt. +Clay is a versatile kind of earth commonly found at beaches underwater.=Ton ist eine vielseitige Art Erde, die oft an Stränden unter dem Wasser gefunden werden kann. +Coal=Kohle +Coal Ore=Kohleerz +Coarse Dirt=Grobe Erde +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=Grobe Erde ist für einige Pflanzen ein Erdboden und ähnlich wie Erde, aber auf ihr wird nie eine Grasschicht oder ähnliches wachsen. +Cobblestone=Kopfsteinpflaster +Cobweb=Spinnennetz +Cobwebs can be walked through, but significantly slow you down.=Spinnennetze können passiert werden, aber sie verlangsamen Sie beträchtlich. +Cracked Stone Bricks=Rissige Steinziegel +Cut Red Sandstone=Geschliffener roter Sandstein +Cut Sandstone=Geschliffener Sandstein +Cut red sandstone is a decorative building block.=Geschliffener roter Sandstein ist ein dekorativer Block zum Bauen. +Cut sandstone is a decorative building block.=Geschliffener Sandstein ist ein dekorativer Block zum Bauen. +Cyan Stained Glass=Türkises Buntglas +Dark Oak Bark=Schwarzeichenrinde +Dark Oak Leaves=Schwarzeichenblätter +Dark Oak Sapling=Schwarzeichensetzling +Dark Oak Wood=Schwarzeichenholz +Dark Oak Wood Planks=Schwarzeichenholzplanken +Dark oak leaves are grown from dark oak trees.=Schwarzeichenblätter wachsen an Schwarzeichen. +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Schwarzeichensetzlinge können zu Schwarzeichen heranwachsen, aber nur in Gruppen. Ein einsamer Schwarzeichensetzling wird nicht wachsen. Eine Gruppe aus vier Schwarzeichensetzlingen werden nach etwas Zeit zu einer Schwarzeiche heranwachen, wenn sie auf einem Erdboden (wie Erde) in einem 2×2-Quadrat platziert wurden und genügend Licht ausgesetzt sind. +Dead Bush=Toter Busch +Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Tote Büsche sind uninteressante Pflanzen, die oft in trockenen Gebieten vorkommen. +Diamond=Diamant +Diamond Ore=Diamanterz +Diamond ore is rare and can be found in clusters near the bottom of the world.=Diamanterz ist selten und kann in kleinen Ansammlungen in der Nähe des Weltbodens gefunden werden. +Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Diamanten sind kostbare Mineralien, die für die hochwertigsten Rüstungen und Werkzeuge gebraucht werden. +Diorite=Diorit +Diorite is an igneous rock.=Diorit ist ein vulkanisches Gestein. +Dirt=Erde +Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=Erde dient als Nährboden für einige Pflanzen. Im Licht könnte auf diesem Block eine Gras- oder Myzelschicht wachsen, wenn solche Blöcke in der Nähe sind. +Emerald=Smaragd +Emerald Ore=Smaragderz +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Smaragderz ist das Erz von Smaragden. Es ist sehr selten und kann nur einzeln gefunden werden, nicht in Ansammlungen. +Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen. +Flint=Feuerstein +Flint is a raw material.=Feuerstein ist ein Rohstoff. +Flowing Lava=Fließende Lava +Flowing Water=Fließendes Wasser +Frosted Ice=Brüchiges Eis +Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=Brüchiges Eis ist ein kurzlebiger durchscheinender Block. Er wird sich in einigen Sekunden zu einer Wasserquelle verwandeln. +Glass=Glas +Gold Ingot=Goldbarren +Gold Nugget=Goldklumpen +Gold Ore=Golderz +Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Goldklumpen sind sehr kleine Stücke geschmolzenes Gold; ihr Hauptzweck besteht darin, Goldbarren herzustellen. +Golden Apple=Goldener Apfel +Golden apples are precious food items which can be eaten.=Goldene Äpfel sind kostbare Lebensmittel. +Granite=Granit +Grass Block=Grasblock +Grass Path=Graspfad +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Graspfade sind eine dekorative Variante von Grasblöcken. Ihre Oberseite hat eine andere Farbe und sie sind etwas niedriger als Grasblöcke, wodurch sie nützlich sind, um Fußwege zu errichten. Graspfade werden mit einer Schaufel errichtet. Ein Graspfad verwandelt sich in Erde, wenn er sich unter einem festen Block befindet. +Gravel=Kies +Green Stained Glass=Grünes Buntglas +Grey Stained Glass=Graues Buntglas +Ice=Eis +Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Eis ist ein durchscheinender fester Block, der oft in kalten Gebieten gefunden werden kann. Er schmilzt in der Nähe von Block-Lichtquellen bei einer Helligkeit von 12 oder höher. Wenn es schmilzt oder abgebaut wird, und darunter ein anderer Block war, wird er sich in eine Wasserquelle verwandeln. +In the End dimension, starting a fire on this block will create an eternal fire.=In der Ende-Dimension wird Feuer auf diesem Block ewig brennen. +Iron Ingot=Eisenbarren +Iron Nugget=Eisenklumpen +Iron Ore=Eisenerz +Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Eisenklumpen sind sehr kleine Brocken aus geschmolzenem Eisen; ihr Hauptzweck besteht darin, Eisenbarren herzustellen. +Jungle Bark=Dschungelrinde +Jungle Leaves=Dschungelblätter +Jungle Sapling=Dschungelsetzling +Jungle Wood=Dschungelholz +Jungle Wood Planks=Dschungelholzplanken +Jungle leaves are grown from jungle trees.=Dschungelblätter wachsen an Dschungelbäumen. +Ladder=Leiter +Lapis Lazuli Block=Lapislazuliblock +Lapis Lazuli Ore=Lapislazulierz +Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Lapislazulierz ist das Erz von Lapislazuli. Es kann relativ selten in Ansammlungen in der Nähe des Weltbodens gefunden werden. +Lava Source=Lavaquelle +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=Lava ist heiß und ziemlich gefährlich. Berühren Sie sie nicht, es wird Sie verletzen und es ist schwierig, ihr zu entkommen. +Light Blue Stained Glass=Hellblaues Buntglas +Light Grey Stained Glass=Hellgraues Buntglas +Lime Stained Glass=Lindgrünes Buntglas +Lit Redstone Ore=Leuchtendes Redstoneerz +Magenta Stained Glass=Magenta Buntglas +Molten gold. It is used to craft armor, tools, and whatnot.=Geschmolzenes Gold. Es wird benutzt, um Rüstungen, Werkzeuge, und anderes herzustellen. +Molten iron. It is used to craft armor, tools, and whatnot.=Geschmolzenes Eisen. Es wird benutzt, um Rüstungen, Werkzeuge, und vieles mehr herzustellen. +Mossy Cobblestone=Moosiges Kopfsteinpflaster +Mossy Stone Bricks=Moosige Steinziegel +Mycelium=Myzel +Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=Myzel ist eine Art Erde und der perfekte Nährboden für Pilze. Anders als bei anderen erdähnlichen Blöcken kann es mit einer Hacke nicht zu Ackerboden verwandelt werden. Im Licht wird sich Myzel langsam auf benachbarte Erde ausbreiten. Unter einem lichtundurchlässigen Block oder einer Flüssigkeit wird es sich früher oder später zurück zu Erde verwandeln. +Oak Bark=Eichenrinde +Oak Leaves=Eichenblätter +Oak Sapling=Eichensetzling +Oak Wood=Eichenholz +Oak Wood Planks=Eichenholzplanken +Oak leaves are grown from oak trees.=Eichenblätter wachsen von Eichen. +Obsidian=Obsidian +Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=Obsidian ist ein extrem hartes Mineral mit einem enormen Sprengwiderstand. +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Eines der häufigsten Blöcke der Welt, fast der ganze Untergrund besteht aus Stein. Er enthält manchmal Erze. Stein kann entstehen, wenn Wasser auf Lava trifft. +Orange Stained Glass=Orange Buntglas +Packed Ice=Packeis +Packed ice is a compressed form of ice. It is opaque and solid.=Packeis ist eine kompakte Eisform. Es ist undurchsichtig und fest. +Paper=Papier +Paper is used to craft books and maps.=Papier wird benutzt, um Bücher und Karten herzustellen. +Pink Stained Glass=Rosa Buntglas +Podzol=Podsol +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Podsol ist eine Art Erde, die man in Taigawäldern finden kann. Nur wenige Pflanzen können hierauf wachsen. +Polished Andesite=Polierter Andesit +Polished Diorite=Polierter Diorit +Polished Granite=Polierter Granit +Polished Stone=Polierter Stein +Polished andesite is a decorative building block made from andesite.=Polierter Andesit ist ein dekorativer Block zum Bauen, der aus Andesit gemacht wurde. +Polished diorite is a decorative building block made from diorite.=Polierter Diorit ist ein dekorativer Block zum Bauen, der aus Diorit gemacht wurde. +Polished granite is a decorative building block made from granite.=Polierter Granit ist ein dekorativer Block zum Bauen, der aus Granit gemacht wurde. +Purple Stained Glass=Violettes Buntglas +Realm Barrier=Reichsbarriere +Red Sand=Roter Sand +Red Sandstone=Roter Sandstein +Red Stained Glass=Rotes Buntglas +Red sand is found in large quantities in mesa biomes.=Roter Sand kommt in großen Mengen bei Tafelbergbiomen vor. +Red sandstone is compressed red sand and is a rather soft kind of stone.=Roter Sandstein ist komprimierter roter Sand und ein relativ weiches Gestein. +Redstone Ore=Redstone-Erz +Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=Redstone-Erz kommt oft in der Nähe des Weltbodens vor. Er leuchtet, wenn er berührt wird. +Sand=Sand +Sand is found in large quantities at beaches and deserts.=Sand kommt in großen Mengen an Stränden und in Wüsten vor. +Sandstone=Sandstein +Sandstone is compressed sand and is a rather soft kind of stone.=Sandstein ist komprimierter Sand und ein relativ weiches Gestein. +Slime Block=Schleimblock +Slime blocks are very bouncy and prevent fall damage.=Schleimblöcke sind sehr sprunghaft und verhindern Fallschaden. +Smooth Red Sandstone=Glatter roter Sandstein +Smooth Sandstone=Glatter Sandstein +Smooth red sandstone is a decorative building block.=Glatter roter Sandstein ist ein decorativer Block zum Bauen. +Smooth sandstone is compressed sand and is a rather soft kind of stone.=Glatter Sandstein ist komprimierter Sand und ein relativ weiches Gestein. +Snow=Schnee +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Etwas Kohle im Stein, es kommt sehr häufig vor und kann in mittelgroßen bis großen Ansammlungen im Stein bei fast jeder Höhe gefunden werden. +Some iron contained in stone, it is prety common and can be found below sea level.=Etwas Eisen umschlossen von Stein, es ist recht verbreitet und kann unter dem Meeresspiegel gefunden werden. +Spruce Bark=Fichtenrinde +Spruce Leaves=Fichtenblätter +Spruce Sapling=Fichtensetzling +Spruce Wood=Fichtenholz +Spruce Wood Planks=Fichtenholzplanken +Spruce leaves are grown from spruce trees.=Fichtenblätter wachsen an Fichten. +Stained glass is a decorative and mostly transparent block which comes in various different colors.=Buntglas ist ein dekorativer und größtenteils durchsichtiger Block, der in verschiedenen Farben daherkommt. +Stick=Stock +Sticks are a very versatile crafting material; used in countless crafting recipes.=Stöcke sind ein vielseitiges Material, sie werden in zahllosen Fertigungsrezepten gebraucht. +Stone=Stein +Stone Bricks=Steinziegel +Sugar=Zucker +Sugar Canes=Zuckerrohr +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Zuckerrohr ist eine Pflanze, die in der Herstellung gebraucht wird. Zuckerrohr wird in der Nähe von Wasser bis zu 3 zusätzliche Blöcke wachsen lassen, wenn sie sich neben Wasser befinden und auf einem Grasblock, auf Erde, Sand, roten Sand, Podsol oder grobe Erde platziert wurden. Wird ein Zuckerrohr abgebrochen, werden alle verbundenen Zuckerrohrblöcke ebenfalls abbrechen. +Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Zuckerrohr kann nur auf Zuckerrohr platziert werden und auf Blöcken, auf denen Zuckerrohr wachsen würde. +Sugar comes from sugar canes and is used to make sweet foods.=Zucker kommt von Zuckerrohr und wird benutzt, um süße Lebensmittel zu machen. +The trunk of a birch tree.=Der Baumstamm einer Birke. +The trunk of a dark oak tree.=Der Baumstamm einer Schwarzeiche. +The trunk of a jungle tree.=Der Baumstamm eines Dschungelbaums. +The trunk of a spruce tree.=Der Baumstamm einer Fichte. +The trunk of an acacia.=Der Baumstamm einer Akazie. +The trunk of an oak tree.=Der Baumstamm einer Eiche. +This block consists of a couple of loose stones and can't support itself.=Diser Block besteht aus ein paar losen Steinchen und kann sich nicht selbst tragen. +This is a decorative block surrounded by the bark of a tree trunk.=Dies ist ein dekorativer Block, der von der Rinde eines Baumstamms umgeben ist. +This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Ein ganzer Block aus Schnee. Schnee von dieser Dicke wird üblicherweise in Gebieten extremer Kälte gefunden. +This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Dies ist ein Teil eines Kaktus, der für gewöhnlich in trockenen Gebieten wächst, vorallem Wüsten. Im Laufe der Zeit werden Kakteen auf bis zu 3 Blöcke hoch auf Sand oder rotem Sand wachsen. Ein Kaktus verletzt Lebewesen, die ihn berühren, er richtet jede halbe Sekunden 1 Schaden an. Wenn ein Kaktusblock bricht, werden alle Kaktusblöcke darüber auch abbrechen. +This stone contains pure gold, a rare metal.=Dieser Stein enthält pures Gold, ein seltenes Metall. +Top Snow=Schneeschicht +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=Eine Schneeschicht. Sie schmilzt in der Näche von Lichtquellen außer der Sonne bei einer Helligkeit von 12 oder höher. +Vines=Lianen +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Lianen sind erkletterbare Blöcke, die an den Seiten von festen ganzen Blöcken platziert werden können. Lianen wachsen langsam und breiten sich aus. +Void=Leere +Water=Wasser +Water Source=Wasserquelle +Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.=Wasser gibt es reichlich in Ozeanen und es kommt im Untergrund auch in einigen Quellen vor. Sie können im Wasser mit Leichtigkeit schwimmen, aber Sie müssen gelegentlich Luft holen. +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Birkensetzling langsam zu einer Birke nach etwas Zeit heranwachsen. +When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Dschungelsetzling langsam zu einem Dschungelbaum nach etwas Zeit heranwachsen. Gibt es 4 Dschungelsetzlinge in einem 2×2-Quadrat, werden sie zu einem riesigen Dschungelbaum heranwachsen. +When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Fichtensetzling langsam zu einer Fichte nach etwas Zeit heranwachsen. Gibt es 4 Fichtensetzlinge in einem 2×2-Quadrat, werden sie zu einer Riesenfichte heranwachsen. +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Akaziensetzling langsam zu einer Akazie nach etwas Zeit heranwachsen. +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Eichensetzling langsam zu einer Eiche nach etwas Zeit heranwachsen. +When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Wenn Sie eine Barriere in der Hand halten, legen Sie alle Barrieren in Ihrer Nähe offen. +White Stained Glass=Weißes Buntglas +Yellow Stained Glass=Gelbes Buntglas +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=„Kohle“ meint Kohleklumpen, die herausfallen, wenn Kohleerz gegraben wird, was im Untergrund gefunden werden kann. Kohle ist der klassische Brennstoff für den Ofen, aber er kann auch benutzt werden, um Fackeln, Kohleblöcke und einige andere Dinge herzustellen. +Water interacts with lava in various ways:=Wasser reagiert mit Lava auf unterschiedliche Arten: +• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Wenn sich Wasser direkt über oder horizontal neben einer Wasserquelle befindet, verwandelt sich die Lava zu Obsidian. +• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Wenn fließendes Wasser fließende Lava von oben oder horizontal berührt, verwandelt sich die Lava zu Kopfsteinpflaster. +• When water is directly below lava, the water turns into stone.=• Wenn sich Wasser direkt unter Lava befindet, verwandelt sich das Wasser zu Stein. +Lava interacts with water various ways:=Lava reagiert mit Wasser auf verschiedene Arten: +• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Wenn sich eine Lavaquelle direkt unter oder horizontal neben Wasser befindet, verwandelt sich die Lava zu Obsidian. +• When lava is directly above water, the water turns into stone.=• Wenn sich Lava direkt über Wasser befindet, verwandelt sich das Wasser zu Stein. +Stained Glass=Buntglas +Granite is an igneous rock.=Granit ist ein magmatisches Gestein. +Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=Eine Schneeschicht kann gestapelt werden und hat eine von 8 verschiedenen Höhestufen. Bei den Höhestufen 2-8 ist die Schneeschnicht kollidierbar. Schneeschichten werfen 2-9 Schneebälle ab, abhängig von ihrer Höhe. +This block can only be placed on full solid blocks and on another top snow (which increases its height).=Dieser Block kann nur auf ganzen festen Blöcken und auf anderen Schneeschichten (was die Höhe erhöht) platziert werden. +Needs soil and light to grow=Benötigt Boden und Licht zum Wachsen +Grows on sand=Wächst auf Sand +Contact damage: @1 per half second=Kontaktschaden: @1 jede halbe Sekunde +Slows down movement=Verlangsamt die Fortbewegung +2×2 saplings required=2×2 Setzlinge benötigt +2×2 saplings @= large tree=2×2 Setzlinge @= großer Baum +Grows on sand or dirt next to water=Wächst auf Sand oder Erde neben Wasser +Stackable=Stapelbar diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr new file mode 100644 index 00000000..1e1029c0 --- /dev/null +++ b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr @@ -0,0 +1,249 @@ +# textdomain: mcl_core +@1 could not survive in lava.=@1 no pudo sobrevivir en la lava. +@1 died in lava.=@1 murió en la lava. +@1 melted in lava.=@1 fue derretido en la lava. +@1 took a bath in a hot lava tub.=@1 se bañó en lava caliente. +A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Un bloque de diamantes es principalmente un bloque decorativo brillante, pero también es útil como un almacenamiento compacto de diamantes. +A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Un bloque de esmeraldas es principalmente un bloque decorativo brillante pero también es útil como un almacenamiento compacto de esmeraldas. +A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=Un bloque de oro es principalmente un bloque decorativo brillante, pero también es útil como almacenamiento compacto de lingotes de oro. +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Un bloque de hierro es principalmente un bloque decorativo, pero también es útil como almacenamiento compacto de lingotes de hierro. +A cactus can only be placed on top of another cactus or any sand.=Un cactus solo se puede colocar encima de otro cactus o arena. +A decorative and mostly transparent block.=Un bloque decorativo y mayormente transparente. +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Un bloque de hierba es tierra con una cubierta de hierba. Los bloques de hierba son bloques ingeniosos que permiten el crecimiento de todo tipo de plantas. Pueden convertirse en tierras de cultivo con una azada y convertirse en caminos de hierba con una pala. A la luz, la hierba se extiende lentamente sobre la tierra cercana. Debajo de un bloque opaco o un líquido, un bloque de hierba puede ensuciarse. +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Un bloque de lapislázuli es principalmente un bloque decorativo, pero también es útil como un almacenamiento compacto de lapislázuli. +A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Una fuente de lava prende fuego a un par de bloques de aire arriba cuando están al lado de un bloque inflamable. +A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Un pedazo de escalera que te permite subir verticalmente. Las escaleras solo se pueden colocar al lado de bloques sólidos y no en vidrio, hojas, hielo, losas, piedra luminosa ni linternas marinas. +Acacia Bark=Madera de acacia sin corteza +Acacia Leaves=Hojas de acacia +Acacia Sapling=Brote de acacia +Acacia Wood=Tronco de acacia +Acacia Wood Planks=Madera de acacia +Acacia leaves are grown from acacia trees.=Las hojas de acacia se cultivan a partir de acacias. +Andesite=Andesita +Andesite is an igneous rock.=La andesita es una roca ígnea. +Apple=Manzana +Apples are food items which can be eaten.=Las manzanas son alimentos que se pueden comer. +Barrier=Barrera +Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Las barreras son bloques transitables invisibles. Se utilizan para crear límites de mapas de aventura y similares. Los monstruos y los animales no aparecerán en las barreras, y las cercas no se conectan a las barreras. Otros bloques pueden construirse sobre barreras como en cualquier otro bloque. +Bedrock=Lecho de roca +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=El lecho de roca es un tipo de roca muy duro. No se puede romper, destruir, recoger o mover por medios normales, a menos que esté en modo creativo. +Birch Bark=Madera de abedul sin corteza +Birch Leaves=Hojas de abedul +Birch Sapling=Brote de abedul +Birch Wood=Tronco de abedul +Birch Wood Planks=Madera de abedul +Birch leaves are grown from birch trees.=Las hojas de abedul se cultivan a partir de abedules. +Black Stained Glass=Cristal negro +Block of Coal=Bloque de carbón +Block of Diamond=Bloque de diamante +Block of Emerald=Bloque de esmeralda +Block of Gold=Bloque de oro +Block of Iron=Bloque de hierro +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Los bloques de carbón son útiles como almacenamiento compacto de carbón y son muy útiles como combustible de horno. Un bloque de carbón es tan eficiente como 10 de carbón. +Blue Stained Glass=Cristal azul +Bone Block=Bloque de hueso +Bone blocks are decorative blocks and a compact storage of bone meal.=Los bloques óseos son bloques decorativos y un almacenamiento compacto de harina de huesos. +Bowl=Cuenco +Bowls are mainly used to hold tasty soups.=Los cuencos se usan principalmente para contener sabrosas sopas. +Brick=Ladrillo +Brick Block=Bloque de ladrillo +Brick blocks are a good building material for building solid houses and can take quite a punch.=Los bloques de ladrillo son un buen material de construcción para construir casas sólidas y pueden recibir un gran golpe. +Bricks are used to craft brick blocks.=Los ladrillos se utilizan para fabricar bloques de ladrillos. +Brown Stained Glass=Cristal marrón +Cactus=Cactus +Charcoal=Carbón vegetal +Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=El carbón vegetal es un combustible alternativo para hornos creado al cocinar leña en un horno. Tiene el mismo tiempo de combustión que el carbón y también comparte muchas de sus recetas de elaboración, pero no se puede usar para crear bloques de carbón. +Chiseled Stone Bricks=Ladrillo de piedra cincelado +Chiseled Red Sandstone=Arenisca Roja Cincelada +Chiseled Sandstone=Arenisca cincelada +Chiseled red sandstone is a decorative building block.=La piedra arenisca roja cincelada es un elemento decorativo. +Chiseled sandstone is a decorative building block.=La piedra arenisca cincelada es un bloque de construcción decorativo. +Clay=Arcilla +Clay Ball=Bola de arcilla +Clay balls are a raw material, mainly used to create bricks in the furnace.=Las bolas de arcilla son una materia prima, utilizada principalmente para crear ladrillos en el horno. +Clay is a versatile kind of earth commonly found at beaches underwater.=La arcilla es un tipo de tierra versátil que se encuentra comúnmente en las playas bajo el agua. +Coal=Carbón +Coal Ore=Mena de Carbón +Coarse Dirt=Tierra estéril +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=La tierra gruesa actúa como un suelo para algunas plantas y es similar a la tierra, pero nunca crecerá una cubierta. +Cobblestone=Roca +Cobweb=Telaraña +Cobwebs can be walked through, but significantly slow you down.=Las telarañas se pueden atravesar, pero disminuyen significativamente la velocidad. +Cracked Stone Bricks=Ladrillo de piedra agrietado +Cut Red Sandstone=Arenisca roja cortada +Cut Sandstone=Arenisca cortada +Cut red sandstone is a decorative building block.=La arenisca roja cortada es un elemento decorativo. +Cut sandstone is a decorative building block.=La arenisca cortada es un elemento decorativo. +Cyan Stained Glass=Cristal cian +Dark Oak Bark=Madera de roble oscuro sin corteza +Dark Oak Leaves=Hojas de roble oscuro +Dark Oak Sapling=Brote de roble oscuro +Dark Oak Wood=Tronco de roble oscuro +Dark Oak Wood Planks=Madera de roble oscuro +Dark oak leaves are grown from dark oak trees.=Las hojas de roble oscuro se cultivan a partir de robles oscuros. +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Los brotes de roble oscuro pueden convertirse en robles oscuros, pero solo en grupos. Un árbol solitario de roble oscuro no crecerá. Un grupo de cuatro árboles jóvenes de roble oscuro se convierte en un roble oscuro después de un tiempo cuando se colocan en el suelo (como la tierra) en un cuadrado de 2 × 2 y se exponen a la luz. +Dead Bush=Arbusto muerto +Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Los arbustos muertos son plantas poco comunes que a menudo se encuentran en áreas secas. Se pueden cosechar para obtener palos. +Diamond=Diamante +Diamond Ore=Mena de diamante +Diamond ore is rare and can be found in clusters near the bottom of the world.=El mineral de diamante es raro y se puede encontrar en grupos cerca del fondo del mundo. +Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Los diamantes son minerales preciosos y útiles para crear el nivel más alto de armadura y herramientas. +Diorite=Diorita +Diorite is an igneous rock.=La diorita es una roca ígnea. +Dirt=Tierra +Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=La tierra actúa como un suelo para algunas plantas. Cuando está a la luz, este bloque puede crecer una cubierta de hierba o micelio si tales bloques están cerca. +Emerald=Esmeralda +Emerald Ore=Mena de esmeralda +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=El mineral esmeralda es el mineral de las esmeraldas. Es muy raro y se puede encontrar solo, no en grupos. +Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Las esmeraldas no son muy útiles por sí mismas, pero pueden cambiarse por lingotes de oro haciendo artesanías. +Flint=Pedernal +Flint is a raw material.=El pedernal es una materia prima. +Flowing Lava=Lava que fluye +Flowing Water=Agua que fluye +Frosted Ice=Hielo helado +Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=El hielo helado es un bloque sólido de corta duración. Se derrite en una fuente de agua en unos pocos segundos. +Glass=Cristal +Gold Ingot=Lingote de oro +Gold Nugget=Pepita de oro +Gold Ore=Mena de oro +Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Las pepitas de oro son piezas muy pequeñas de oro fundido; El objetivo principal es crear lingotes de oro. +Golden Apple=Manzana dorada +Golden apples are precious food items which can be eaten.=Las manzanas doradas son alimentos preciosos que se pueden comer. +Granite=Granito +Grass Block=Bloque de césped +Grass Path=Camino de hierba +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Los caminos de hierba son una variante decorativa de bloques de hierba. Su parte superior tiene un color diferente y son un poco más bajos que los bloques de hierba, lo que los hace útiles para construir senderos. Los caminos de hierba se pueden crear con una pala. Un camino de hierba se convierte en tierra cuando está debajo de un bloque sólido. +Gravel=Grava +Green Stained Glass=Cristal verde +Grey Stained Glass=Cristal gris +Ice=Hielo +Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=El hielo es un bloque sólido que generalmente se encuentra en áreas frías. Se funde cerca de bloques de luz, a un nivel de luz de 12 o más. Cuando se derrite o se rompe mientras posa sobre otro bloque, se convertirá en una fuente de agua. +In the End dimension, starting a fire on this block will create an eternal fire.=En la dimensión final, iniciar un incendio en este bloque creará un fuego eterno. +Iron Ingot=Lingote de hierro +Iron Nugget=Pepita de hierro +Iron Ore=Mena de hierro +Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Las pepitas de hierro son piezas muy pequeñas de hierro fundido; El objetivo principal es crear lingotes de hierro. +Jungle Bark=Madera de jungla sin corteza +Jungle Leaves=Hojas de jungla +Jungle Sapling=Brote de jungla +Jungle Wood=Tronco de jungla +Jungle Wood Planks=Madera de jungla +Jungle leaves are grown from jungle trees.=Las hojas de jungla se cultivan de los árboles de jungla. +Ladder=Escalera +Lapis Lazuli Block=Bloque de lapislázuli +Lapis Lazuli Ore=Mena de lapislázuli +Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=El mineral de lapislázuli es el mineral de lapislázuli. Rara vez se puede encontrar en grupos, se encuentra cerca del fondo del mundo. +Lava Source=Fuente de lava +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=La lava es caliente y bastante peligrosa. No lo toques, te dolerá mucho y es difícil salir. +Light Blue Stained Glass=Cristal azul claro +Light Grey Stained Glass=Cristal gris claro +Lime Stained Glass=Cristal amarillo verdoso +Lit Redstone Ore=Mena de redstone encendida +Magenta Stained Glass=Cristal magenta +Molten gold. It is used to craft armor, tools, and whatnot.=Oro fundido Se utiliza para fabricar armaduras, herramientas y otras cosas. +Molten iron. It is used to craft armor, tools, and whatnot.=Hierro fundido. Se utiliza para fabricar armaduras, herramientas y otras cosas. +Mossy Cobblestone=Roca musgosa +Mossy Stone Bricks=Ladrillo de piedra musgoso +Mycelium=Micelio +Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=El micelio es un tipo de tierra y el suelo ideal para los hongos. A diferencia de otros bloques de tipo de tierra, no se puede convertir en tierras de cultivo con una azada. A la luz, el micelio se extiende lentamente sobre la tierra cercana. Debajo de un bloque opaco o un líquido, eventualmente se convierte nuevamente en tierra. +Oak Bark=Madera de roble sin corteza +Oak Leaves=Hojas de roble +Oak Sapling=Brote de roble +Oak Wood=Tronco de roble +Oak Wood Planks=Madera de roble +Oak leaves are grown from oak trees.=Las hojas de roble se cultivan a partir de robles. +Obsidian=Obsidiana +Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=La obsidiana es un mineral extremadamente duro con una enorme resistencia a la explosión. La obsidiana se forma cuando el agua se encuentra con la lava. +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Uno de los bloques más comunes en el mundo, casi todo el subsuelo consiste en piedra. A veces contiene minerales. Se puede crear piedra cuando el agua se encuentra con la lava. +Orange Stained Glass=Cristal Naranja +Packed Ice=Hielo envasado +Packed ice is a compressed form of ice. It is opaque and solid.=El hielo empaquetado es una forma comprimida de hielo. Es opaco y sólido. +Paper=Papel +Paper is used to craft books and maps.=El papel se usa para crear libros y mapas. +Pink Stained Glass=Cristal rosa +Podzol=Podzol +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=El podzol es un tipo de tierra que se encuentra en los bosques de taiga. Solo unas pocas plantas pueden sobrevivir en él. +Polished Andesite=Andesita pulida +Polished Diorite=Diorita pulida +Polished Granite=Granito pulido +Polished Stone=Piedra pulida +Polished andesite is a decorative building block made from andesite.=La andesita pulida es un bloque de construcción decorativo hecho de andesita. +Polished diorite is a decorative building block made from diorite.=La diorita pulida es un bloque de construcción decorativo hecho de diorita. +Polished granite is a decorative building block made from granite.=El granito pulido es un bloque decorativo hecho de granito. +Purple Stained Glass=Cristal morado +Realm Barrier=Barrera del reino +Red Sand=Arena roja +Red Sandstone=Arenisca roja +Red Stained Glass=Cristal rojo +Red sand is found in large quantities in mesa biomes.=La arena roja se encuentra en grandes cantidades en los desiertos. +Red sandstone is compressed red sand and is a rather soft kind of stone.=La arenisca roja es arena roja comprimida y es un tipo de piedra bastante suave. +Redstone Ore=Mena de redstone +Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=El mineral redstone se encuentra comúnmente cerca del fondo del mundo. Brilla cuando es golpeado o pisado. +Sand=Arena +Sand is found in large quantities at beaches and deserts.=La arena se encuentra en grandes cantidades en playas y desiertos. +Sandstone=Arenisca +Sandstone is compressed sand and is a rather soft kind of stone.=La arenisca es arena comprimida y es un tipo de piedra bastante suave. +Slime Block=Bloque de Slime +Slime blocks are very bouncy and prevent fall damage.=Los bloques de limo son muy hinchables y evitan el daño por caída. +Smooth Red Sandstone=Arenisca roja lisa +Smooth Sandstone=Arenisca lisa +Smooth red sandstone is a decorative building block.=La piedra arenisca roja lisa es un elemento decorativo. +Smooth sandstone is compressed sand and is a rather soft kind of stone.=La arenisca lisa es arena comprimida y es un tipo de piedra bastante blanda. +Snow=Bloque de Nieve +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Algo de carbón contenido en la piedra, es muy común y se puede encontrar dentro de la piedra en grupos medianos a grandes en casi todas las alturas. +Some iron contained in stone, it is prety common and can be found below sea level.=Algo de hierro contenido en piedra, es bastante común y se puede encontrar debajo del nivel del mar. +Spruce Bark=Madera de abeto sin corteza +Spruce Leaves=Hojas de abeto +Spruce Sapling=Brote de abeto +Spruce Wood=Tronco de abeto +Spruce Wood Planks=Madera de abeto +Spruce leaves are grown from spruce trees.=Las hojas de abeto se cultivan a partir de abetos. +Stained glass is a decorative and mostly transparent block which comes in various different colors.=El vitral es un bloque decorativo y en su mayoría transparente que viene en varios colores diferentes. +Stick=Palo +Sticks are a very versatile crafting material; used in countless crafting recipes.=Los palos son un material de elaboración muy versátil; utilizado en innumerables recetas de elaboración. +Stone=Piedra +Stone Bricks=Ladrillos de piedra +Sugar=Azúcar +Sugar Canes=Caña de azúcar +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Las cañas de azúcar son una planta que tiene algunos usos en la elaboración. Las cañas de azúcar crecerán lentamente hasta 3 bloques cuando estén cerca del agua y se colocan en un bloque de césped, tierra, arena, arena roja, podzol o tierra gruesa. Cuando se rompe una caña de azúcar, todas las cañas de azúcar conectadas arriba también se romperán. +Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Las cañas de azúcar solo se pueden colocar encima de otras cañas de azúcar y encima de los bloques en los que crecerían. +Sugar comes from sugar canes and is used to make sweet foods.=El azúcar proviene de las cañas de azúcar y se usa para hacer alimentos dulces. +The trunk of a birch tree.=El tronco de un abedul. +The trunk of a dark oak tree.=El tronco de un roble oscuro. +The trunk of a jungle tree.=El tronco de un árbol de jungla. +The trunk of a spruce tree.=El tronco de un árbol de abeto. +The trunk of an acacia.=El tronco de una acacia. +The trunk of an oak tree.=El tronco de un roble. +This block consists of a couple of loose stones and can't support itself.=Este bloque consta de un par de piedras sueltas y no puede sostenerse. +This is a decorative block surrounded by the bark of a tree trunk.=Este es un bloque decorativo rodeado por la corteza del tronco de un árbol. +This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Este es un bloque lleno de nieve. La nieve de este espesor generalmente se encuentra en áreas de frío extremo. +This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Este es un pedazo de cactus que se encuentra comúnmente en áreas secas, especialmente en los desiertos. Con el tiempo, los cactus crecerán hasta 3 bloques de altura en arena o arena roja. Un cactus lastima a los seres vivos al tocarlo con un daño de 1 HP cada medio segundo. Cuando un bloque de cactus se rompe, todos los bloques de cactus conectados encima también se romperán. +This stone contains pure gold, a rare metal.=Esta piedra contiene oro puro, un metal raro. +Top Snow=Nieve +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=La nieve es una capa de nieve. Se derrite cerca de fuentes de luz distintas al sol con un nivel 12 de luz o más. +Vines=Enredadera +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Las enredaderas son bloques escalables que se pueden colocar a los lados de bloques sólidos de cubo completo. Las enredaderas crecen y se extienden lentamente +Void=Vacío +Water=Agua +Water Source=Fuente de agua +Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.=El agua es abundante en los océanos y también aparece en algunas fuentes en el suelo. Puede nadar fácilmente en el agua, pero necesita recuperar el aliento de vez en cuando. +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=Cuando se coloca en el suelo (como tierra) y se expone a la luz, un brote de abedul se convertirá en abedul después de un tiempo. +When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=Cuando se coloca en el suelo (como la tierra) y se expone a la luz, un brote de jungla se convertirá en un árbol de jungla después de un tiempo. Cuando hay 4 árboles jóvenes de jungla en un cuadrado de 2×2, crecerán hasta convertirse en un enorme árbol de jungla. +When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=Cuando se coloca en el suelo (como tierra) y se expone a la luz, un brote de abeto se convertirá en un abeto después de un tiempo. Cuando hay 4 brotes de abeto en un cuadrado de 2×2, crecerán hasta convertirse en un abeto enorme. +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=Cuando se coloca en el suelo (como tierra) y se expone a la luz, un brote de acacia se convertirá en una acacia después de un tiempo. +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=Cuando se coloca en el suelo (como tierra) y se expone a la luz, un brote de roble se convertirá en un roble después de un tiempo. +When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Cuando sostienes una barrera en la mano, revelas todas las barreras colocadas a corta distancia a tu alrededor. +White Stained Glass=Cristal blanco +Yellow Stained Glass=Cristal amarillo +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.="Carbón" se refiere a trozos de carbón obtenidos al excavar mineral de carbón que se puede encontrar bajo tierra. El carbón es el combustible estándar de su horno, pero también se puede usar para hacer antorchas, bloques de carbón y algunas otras cosas. +Water interacts with lava in various ways:=El agua interactúa con la lava de varias maneras: +• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Cuando el agua está directamente arriba u horizontalmente al lado de una fuente de lava, la lava se convierte en obsidiana. +• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Cuando el agua que fluye toca la lava que fluye desde arriba u horizontalmente, la lava se convierte en roca. +• When water is directly below lava, the water turns into stone.=• Cuando el agua está directamente debajo de la lava, el agua se convierte en piedra. +Lava interacts with water various ways:=La lava interactúa con el agua de varias maneras: +• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Cuando una fuente de lava está directamente debajo u horizontalmente al lado del agua, la lava se convierte en obsidiana. +• When lava is directly above water, the water turns into stone.=• Cuando la lava está directamente sobre el agua, el agua se convierte en piedra. +Stained Glass=Vitral +Granite is an igneous rock.=El granito es una roca ígnea. +Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=La nieve se puede apilar y tiene unos 8 niveles de altura diferentes. En los niveles 2-8, la nieve es colisionable. La nieve cae de 2 a 9 bolas de nieve, dependiendo de su altura. +This block can only be placed on full solid blocks and on another top snow (which increases its height).=Este bloque solo se puede colocar en bloques sólidos completos y en otra nieve (lo que aumenta su altura). diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr new file mode 100644 index 00000000..4d97fe22 --- /dev/null +++ b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr @@ -0,0 +1,258 @@ +# textdomain: mcl_core +@1 could not survive in lava.=@1 n'a pas pu survivre dans la lave. +@1 died in lava.=@1 est mort dans la lave. +@1 melted in lava.=@1 a fondu dans la lave. +@1 took a bath in a hot lava tub.=@1 a pris un bain dans une cuve de lave chaude. +A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Un bloc de diamant est principalement un bloc décoratif brillant mais également utile comme stockage compact de diamants. +A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Un bloc d'émeraude est principalement un bloc décoratif brillant mais également utile comme stockage compact d'émeraudes. +A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=Un bloc d'or est principalement un bloc décoratif brillant mais également utile comme stockage compact de lingots d'or. +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Un bloc de fer est principalement un bloc décoratif mais également utile comme stockage compact de lingots de fer. +A cactus can only be placed on top of another cactus or any sand.=Un cactus ne peut être placé que sur un autre cactus ou du sable. +A decorative and mostly transparent block.=Un bloc décoratif et surtout transparent. +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Un bloc d'herbe est de la terre avec une couverture d'herbe. Les blocs d'herbe sont des blocs ingénieux qui permettent la croissance de toutes sortes de plantes. Ils peuvent être transformés en terres agricoles avec une houe et transformés en chemins d'herbe avec une pelle. À la lumière, l'herbe se propage lentement sur la terre à proximité. Sous un bloc opaque ou un liquide, un bloc d'herbe peut redevenir terre. +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Un bloc de lapis-lazuli est principalement un bloc décoratif mais également utile comme stockage compact de lapis-lazuli. +A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Une source de lave met le feu à quelques blocs d'air au-dessus lorsqu'ils sont à côté d'un bloc inflammable. +A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Un morceau d'échelle qui vous permet de grimper verticalement. Les échelles ne peuvent être placées que sur le côté de blocs solides et non sur du verre, des feuilles, de la glace, des dalles, des pierres incandescentes ou des lanternes marines. +Acacia Bark=Écorce d'Acacia +Acacia Leaves=Feuilles d'Acacia +Acacia Sapling=Pousse d'Acacia +Acacia Wood=Bois d'Acacia +Acacia Wood Planks=Planches d'Acacia +Acacia leaves are grown from acacia trees.=Les feuilles d'acacia sont cultivées à partir d'acacias. +Andesite=Andésite +Andesite is an igneous rock.=L'andésite est une roche ignée. +Apple=Pomme +Apples are food items which can be eaten.=Les pommes sont des aliments qui peuvent être consommés. +Barrier=Barrière invisible +Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Les barrières sont des blocs accessibles à pied. Ils sont utilisés pour créer des limites de cartes d'aventure et similaires. Les monstres et les animaux n'apparaissent pas sur les barrières, et les clôtures ne se connectent pas aux barrières. D'autres blocs peuvent être construits sur des barrières comme sur n'importe quel autre bloc. +Bedrock=Bedrock +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Le bedrock est un type de roche très dur. Il ne peut pas être brisé, détruit, collecté ou déplacé par des moyens normaux, sauf en mode créatif. +Birch Bark=Écorce de Bouleau +Birch Leaves=Feuilles de Bouleau +Birch Sapling=Pousse de Bouleau +Birch Wood=Bois de Bouleau +Birch Wood Planks=Planches de Bouleau +Birch leaves are grown from birch trees.=Les feuilles de bouleau sont cultivées à partir de bouleaux. +Black Stained Glass=Verre Noir +Block of Coal=Bloc de Charbon +Block of Diamond=Bloc de Diamant +Block of Emerald=Bloc d'Emeraude +Block of Gold=Bloc d'Or +Block of Iron=Bloc de Fer +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Les blocs de charbon sont utiles comme stockage compact de charbon et très utiles comme combustible de four. Un bloc de charbon est aussi efficace que 10 charbon. +Blue Stained Glass=Verre Bleu +Bone Block=Bloc d'Os +Bone blocks are decorative blocks and a compact storage of bone meal.=Les blocs d'os sont des blocs décoratifs et un stockage compact de poudre d'os. +Bowl=Bol +Bowls are mainly used to hold tasty soups.=Les bols sont principalement utilisés pour contenir de délicieuses soupes. +Brick=Brique +Brick Block=Bloc de Brique +Brick blocks are a good building material for building solid houses and can take quite a punch.=Les blocs de briques sont un bon matériau de construction pour la construction de maisons solides et peuvent resite au coup. +Bricks are used to craft brick blocks.=Les briques sont utilisées pour fabriquer des blocs de briques. +Brown Stained Glass=Verre Marron +Cactus=Cactus +Charcoal=Charbon de Bois +Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Le charbon de bois est un combustible de four alternatif créé par la cuisson du bois dans un four. Il a le même temps de combustion que le charbon et partage également bon nombre de ses recettes d'artisanat, mais il ne peut pas être utilisé pour créer des blocs de charbon. +Chiseled Stone Bricks=Pierre Sculptée +Chiseled Red Sandstone=Grès Rouge Sculptée +Chiseled Sandstone=Grès Sculptée +Chiseled red sandstone is a decorative building block.=Le grès rouge ciselé est un bloc de construction décoratif. +Chiseled sandstone is a decorative building block.=Le grès ciselé est un bloc de construction décoratif. +Clay=Argile +Clay Ball=Boule d'Argile +Clay balls are a raw material, mainly used to create bricks in the furnace.=Les boules d'argile sont une matière première, principalement utilisée pour créer des briques dans le four. +Clay is a versatile kind of earth commonly found at beaches underwater.=L'argile est une terre polyvalente que l'on trouve couramment sur les plages sous-marines. +Coal=Charbon +Coal Ore=Minerai de Charbon +Coarse Dirt=Terre Stérile +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=La terre stérile agit comme un sol pour certaines plantes et est similaire à la terre, mais elle ne fera jamais pousser grand chose. +Cobblestone=Pierre +Cobweb=Toile d'Araignée +Cobwebs can be walked through, but significantly slow you down.=Les toiles d'araignée peuvent être parcourues, mais vous ralentissent considérablement. +Cracked Stone Bricks=Pierre Taillée Craquelée +Cut Red Sandstone=Grès Rouge Taillé +Cut Sandstone=Grès Taillé +Cut red sandstone is a decorative building block.=Le grès rouge taillé est un bloc de construction décoratif. +Cut sandstone is a decorative building block.=Le grès taillé est un bloc de construction décoratif. +Cyan Stained Glass=Vitre Cyan +Dark Oak Bark=Écorce de Chêne Noir +Dark Oak Leaves=Feuilles de Chêne Noir +Dark Oak Sapling=Pousse de Chêne Noir +Dark Oak Wood=Bois de Chêne Noir +Dark Oak Wood Planks=Planche de Chêne Noir +Dark oak leaves are grown from dark oak trees.=Les feuilles de chêne noir sont issues de chênes noirs. +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Les pousses de chêne noir peuvent devenir des chênes noirs, mais seulement en groupes. Une pousse de chêne noir solitaire ne poussera pas. Un groupe de quatre pousses de chêne noir se transforme en chêne noir après un certain temps lorsqu'ils sont placés sur le sol (comme la terre) dans un carré 2×2 et exposés à la lumière. +Dead Bush=Arbuste mort +Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Les buissons morts sont des plantes inhabituelles que l'on trouve souvent dans les zones sèches. Ils peuvent être récoltés avec des bâtons. +Diamond=Diamamnt +Diamond Ore=Minerai de Diamant +Diamond ore is rare and can be found in clusters near the bottom of the world.=Le minerai de diamant est rare et peut être trouvé en filons près du fond du monde. +Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Les diamants sont des minéraux précieux et utiles pour créer le plus haut niveau d'armure et d'outils. +Diorite=Diorite +Diorite is an igneous rock.=La diorite est une roche ignée. +Dirt=Terre +Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=La terre agit comme un sol pour quelques plantes. Lorsqu'il est à la lumière, ce bloc peut faire pousser une couverture d'herbe ou de mycélium si ces blocs sont à proximité. +Emerald=Emeraude +Emerald Ore=Minerai d'Emeraude +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et peut être trouvé seul, pas en filons. +Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Les émeraudes ne sont pas très utiles seules, mais elles peuvent être échangées contre des lingots d'or. +Flint=Silex +Flint is a raw material.=Le silex est une matière première. +Flowing Lava=Lave qui coule +Flowing Water=Eau qui coule +Frosted Ice=Glace Givrée +Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=La glace givrée est un bloc solide de courte durée. Il fond dans une source d'eau en quelques secondes. +Glass=Verre +Gold Ingot=Lingot d'Or +Gold Nugget=Pépite d'Or +Gold Ore=Minerai d'Or +Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Les pépites d'or sont de très petites pièces d'or en fusion; le but principal est de créer des lingots d'or. +Golden Apple=Pomme Dorée +Golden apples are precious food items which can be eaten.=Les pommes dorrées sont des aliments précieux qui peuvent être consommés. +Granite=Granite +Grass Block=Bloc d'Herbe +Grass Path=Chemin d'Herbe +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Les chemins d'herbe sont une variante décorative des blocs d'herbe. Leur sommet a une couleur différente et ils sont un peu plus bas que les blocs d'herbe, ce qui les rend utiles pour construire des sentiers. Les chemins d'herbe peuvent être créés avec une pelle. Un chemin d'herbe se transforme en terre quand il est en dessous d'un bloc solide. +Gravel=Gravier +Green Stained Glass=Verre Vert +Grey Stained Glass=Verre Gris +Ice=Glace +Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=La glace est un bloc solide que l'on trouve généralement dans les régions froides. Il fond près des sources de lumière de bloc à un niveau de lumière de 12 ou plus. Lorsqu'il fond ou se casse en se reposant sur un autre bloc, il se transforme en source d'eau. +In the End dimension, starting a fire on this block will create an eternal fire.=Dans la dimension End, démarrer un feu sur ce bloc créera un feu éternel. +Iron Ingot=Lingot de Fer +Iron Nugget=Pépite de Fer +Iron Ore=Minerai de Fer +Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Les pépites de fer sont de très petits morceaux de fer fondu; le but principal est de créer des lingots de fer. +Jungle Bark=Écorce d'Acajou +Jungle Leaves=Feuilles d'Acajou +Jungle Sapling=Pousse d'Acajou +Jungle Wood=Bois d'Acajou +Jungle Wood Planks=Planches d'Acajou +Jungle leaves are grown from jungle trees.=Les feuilles d'Acajou sont cultivées à partir d'arbres d'Acajou. +Ladder=Échelle +Lapis Lazuli Block=Bloc de Lapis-Lazuli +Lapis Lazuli Ore=Minerai de Lapis-Lazuli +Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Le minerai de lapis-lazuli produit du lapis-lazuli. Il peut être rarement trouvé dans des filons près du fond du monde. +Lava Source=Source de Lave +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=La lave est chaude et plutôt dangereuse. Ne le touchez pas, cela vous fera beaucoup de mal et il est difficile d'en sortir. +Light Blue Stained Glass=Verre Bleu Clair +Light Grey Stained Glass=Verre Gris Clair +Lime Stained Glass=Verre Vert Clair +Lit Redstone Ore=Minerai de Redstone +Magenta Stained Glass=Verre Magenta +Molten gold. It is used to craft armor, tools, and whatnot.=L'Or. Il est utilisé pour fabriquer des armures, des outils et ainsi de suite. +Molten iron. It is used to craft armor, tools, and whatnot.=Le Fer. Il est utilisé pour fabriquer des armures, des outils et ainsi de suite. +Mossy Cobblestone=Pierre Moussue +Mossy Stone Bricks=Pierre Taillée Moussue +Mycelium=Mycélium +Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=Le mycélium est un type de terre et le sol idéal pour les champignons. Contrairement à d'autres blocs de terre, il ne peut pas être transformé en terres agricoles avec une houe. À la lumière, le mycélium se répand lentement sur la terre voisine. Sous un bloc opaque ou un liquide, il finit par redevenir de la terre. +Oak Bark=Écorce de Chêne +Oak Leaves=Feuilles de Chêne +Oak Sapling=Pousse de Chêne +Oak Wood=Bois de Chêne +Oak Wood Planks=Planches de Chêne +Oak leaves are grown from oak trees.=Les feuilles de chêne sont cultivées à partir de chênes. +Obsidian=Obsidienne +Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=L'obsidienne est un minéral extrêmement dur avec une énorme résistance à l'explosion. L'obsidienne se forme lorsque l'eau rencontre la lave. +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=L'un des blocs les plus courants au monde, presque tout le sous-sol est en pierre. Il contient parfois des minerais. La pierre peut être créée lorsque l'eau rencontre la lave. +Orange Stained Glass=Verre Orange +Packed Ice=Glace Compactée +Packed ice is a compressed form of ice. It is opaque and solid.=La glace compactée est une forme de glace comprimée. Elle est opaque et solide. +Paper=Papier +Paper is used to craft books and maps.=Le papier est utilisé pour créer des livres et des cartes. +Pink Stained Glass=Verre Rose +Podzol=Podzol +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Le podzol est un type de terre trouvé dans les forêts de la taïga. Seules quelques plantes peuvent y survivre. +Polished Andesite=Andrésite Polie +Polished Diorite=Diorite Polie +Polished Granite=Granite Polie +Polished Stone=Roche Polie +Polished andesite is a decorative building block made from andesite.=L'andésite polie est un bloc de construction décoratif en andésite. +Polished diorite is a decorative building block made from diorite.=La diorite polie est un bloc de construction décoratif en diorite. +Polished granite is a decorative building block made from granite.=Le granit poli est un bloc de construction décoratif en granit. +Purple Stained Glass=Verre Violet +Realm Barrier=Barrière du royaume +Red Sand=Sable Rouge +Red Sandstone=Grès Rouge +Red Stained Glass=Verre Rouge +Red sand is found in large quantities in mesa biomes.=Le sable rouge se trouve en grande quantité dans les biomes mesa. +Red sandstone is compressed red sand and is a rather soft kind of stone.=Le grès rouge est du sable rouge comprimé et est une pierre plutôt tendre. +Redstone Ore=Minerai de Redstone +Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=Le minerai de Redstone se trouve généralement près du bas du monde. Il brille lorsqu'il est frappé ou piétiné. +Sand=Sable +Sand is found in large quantities at beaches and deserts.=Le sable se trouve en grande quantité sur les plages et les déserts. +Sandstone=Grès +Sandstone is compressed sand and is a rather soft kind of stone.=Le grès est du sable comprimé et est un type de pierre plutôt tendre. +Slime Block=Bloc de Slime +Slime blocks are very bouncy and prevent fall damage.=Les blocs de slime sont gonflables et empêchent les dommages de chute. +Smooth Red Sandstone=Grès Rouge Lisse +Smooth Sandstone=Grès Lisse +Smooth red sandstone is a decorative building block.=Le grès rouge lisse est un bloc de construction décoratif. +Smooth sandstone is compressed sand and is a rather soft kind of stone.=Le grès lisse est du sable comprimé et est un type de pierre plutôt tendre. +Snow=Neige +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Du charbon contenu dans la pierre, il est très commun et peut être trouvé à l'intérieur de la pierre en grappes moyennes à grandes à presque toutes les hauteurs. +Some iron contained in stone, it is prety common and can be found below sea level.=Du fer contenu dans la pierre, il est assez courant et se trouve sous le niveau de la mer. +Spruce Bark=Écorce de Sapin +Spruce Leaves=Feuilles de Sapin +Spruce Sapling=Pousse de Sapin +Spruce Wood=Bois de Sapin +Spruce Wood Planks=Planches de Sapin +Spruce leaves are grown from spruce trees.=Les feuilles de sapin sont cultivées à partir de sapin. +Stained glass is a decorative and mostly transparent block which comes in various different colors.=Le verre est un bloc décoratif et principalement transparent qui se décline en différentes couleurs. +Stick=Bâton +Sticks are a very versatile crafting material; used in countless crafting recipes.=Les bâtons sont un matériau d'artisanat très polyvalent; utilisé dans d'innombrables recettes d'artisanat. +Stone=Roche +Stone Bricks=Pierre Taillée +Sugar=Sucre +Sugar Canes=Canne à Sucre +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Les cannes à sucre sont une plante qui a certaines utilisations dans l'artisanat. Les cannes à sucre poussent lentement jusqu'à 3 blocs lorsqu'elles sont à côté de l'eau et sont placées sur un bloc d'herbe, de saleté, de sable, de sable rouge, de podzol ou de saleté grossière. Lorsqu'une canne à sucre est cassée, toutes les cannes à sucre connectées ci-dessus se brisent également. +Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Les cannes à sucre ne peuvent être placées que sur d'autres cannes à sucre et sur des blocs sur lesquels elles poussent. +Sugar comes from sugar canes and is used to make sweet foods.=Le sucre provient des cannes à sucre et est utilisé pour fabriquer des aliments sucrés. +The trunk of a birch tree.=Le tronc d'un bouleau. +The trunk of a dark oak tree.=Le tronc d'un chêne noir. +The trunk of a jungle tree.=Le tronc d'un acajou. +The trunk of a spruce tree.=Le tronc d'un sapin. +The trunk of an acacia.=Le tronc d'un acacia +The trunk of an oak tree.=Le tronc d'un chêne. +This block consists of a couple of loose stones and can't support itself.=Ce bloc se compose de quelques pierres lâches et ne peut pas se soutenir. +This is a decorative block surrounded by the bark of a tree trunk.=Il s'agit d'un bloc décoratif entouré par l'écorce d'un tronc d'arbre. +This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Ceci est un bloc de neige complet. La neige de cette épaisseur se trouve généralement dans les zones de froid extrême. +This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Il s'agit d'un morceau de cactus que l'on trouve couramment dans les zones sèches, en particulier dans les déserts. Au fil du temps, les cactus pousseront jusqu'à 3 blocs de haut sur le sable ou le sable rouge. Un cactus blesse les êtres vivants qui le touchent avec des dégâts de 1 HP toutes les demi-secondes. Lorsqu'un bloc de cactus est brisé, tous les blocs de cactus connectés au-dessus se brisent également. +This stone contains pure gold, a rare metal.=Cette pierre contient de l'or pur, un métal rare. +Top Snow=neige +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=La neige est une couche de neige. Il fond près de sources lumineuses autres que le soleil avec un niveau de lumière de 12 ou plus. +Vines=Lianes +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Les lianes sont des blocs grimpants qui peuvent être placés sur les côtés de blocs pleins. Les lianes poussent et s'étendent lentement. +Void=Néant +Water=Eau +Water Source=Source d'Eau +Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.=L'eau est abondante dans les océans et apparaît également dans quelques sources dans le sol. Vous pouvez nager facilement dans l'eau, mais vous devez de temps en temps reprendre votre souffle. +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, un jeune arbre de bouleau se transforme en bouleau après un certain temps. +When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, une pousse d'Acajou se transforme en arbre d'Acajou après un certain temps. Quand il y a 4 pousses d'Acajou dans un carré 2×2, ils deviendront un énorme arbre d'Acajou. +When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, un pousse de sapin se transforme en sapin après un certain temps. Lorsqu'il y a 4 pousses de sapin dans un carré 2×2, elles deviendront un énorme sapin. +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, un pousse d'acacia se développera en un acacia après un certain temps. +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, une pousse de chêne se transforme en chêne après un certain temps. +When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Lorsque vous tenez une barrière en main, vous révélez toutes les barrières placées à une courte distance autour de vous. +White Stained Glass=Verre Blanc +Yellow Stained Glass=Verre Jaune +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=Le "charbon" fait référence aux morceaux de charbon obtenus en creusant du minerai de charbon qui peut être trouvé sous terre. Le charbon est votre combustible de four standard, mais il peut également être utilisé pour fabriquer des torches, des blocs de charbon et quelques autres choses. +Water interacts with lava in various ways:=L'eau interagit avec la lave de différentes manières: +• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Lorsque l'eau est directement au-dessus ou horizontalement à côté d'une source de lave, la lave se transforme en obsidienne. +• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Lorsque l'eau qui coule touche la lave qui coule par le haut ou horizontalement, la lave se transforme en pierre. +• When water is directly below lava, the water turns into stone.=• Lorsque l'eau est directement sous la lave, l'eau se transforme en pierre. +Lava interacts with water various ways:=La lave interagit avec l'eau de différentes manières: +• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Lorsqu'une source de lave se trouve directement sous ou horizontalement à côté de l'eau, la lave se transforme en obsidienne. +• When lava is directly above water, the water turns into stone.=• Lorsque la lave est directement au-dessus de l'eau, l'eau se transforme en pierre. +Stained Glass=Verre teinté +Granite is an igneous rock.=Le granit est une roche ignée. +Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=La neige peut être empilée et a l'un des 8 niveaux de hauteur différents. Aux niveaux 2 à 8, la neige provoque des collisions. La neige laisse tomber 2-9 boules de neige, selon sa hauteur. +This block can only be placed on full solid blocks and on another top snow (which increases its height).=Ce bloc ne peut être placé que sur des blocs pleins et sur une autre neige (ce qui augmente sa hauteur). +Needs soil and water to grow=A besoin de terre et d'eau pour se développer +Needs soil and light to grow=A besoin de terre et de lumière pour se développer +Grows on sand=Pousse sur le sable +Contact damage: @1 per half second=Dommages de contact: @1 par demi-seconde +Slows down movement=Ralentit le mouvement +2×2 saplings required=2×2 pousses requis +2×2 saplings @= large tree=2×2 pousses @= grand arbre +Grows on sand or dirt next to water=Pousse sur le sable ou la terre près de l'eau +Stackable=Empilable diff --git a/mods/ITEMS/mcl_core/locale/template.txt b/mods/ITEMS/mcl_core/locale/template.txt new file mode 100644 index 00000000..f988435a --- /dev/null +++ b/mods/ITEMS/mcl_core/locale/template.txt @@ -0,0 +1,258 @@ +# textdomain: mcl_core +@1 could not survive in lava.= +@1 died in lava.= +@1 melted in lava.= +@1 took a bath in a hot lava tub.= +A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.= +A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.= +A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.= +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.= +A cactus can only be placed on top of another cactus or any sand.= +A decorative and mostly transparent block.= +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.= +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.= +A lava source sets fire to a couple of air blocks above when they're next to a flammable block.= +A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.= +Acacia Bark= +Acacia Leaves= +Acacia Sapling= +Acacia Wood= +Acacia Wood Planks= +Acacia leaves are grown from acacia trees.= +Andesite= +Andesite is an igneous rock.= +Apple= +Apples are food items which can be eaten.= +Barrier= +Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.= +Bedrock= +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.= +Birch Bark= +Birch Leaves= +Birch Sapling= +Birch Wood= +Birch Wood Planks= +Birch leaves are grown from birch trees.= +Black Stained Glass= +Block of Coal= +Block of Diamond= +Block of Emerald= +Block of Gold= +Block of Iron= +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.= +Blue Stained Glass= +Bone Block= +Bone blocks are decorative blocks and a compact storage of bone meal.= +Bowl= +Bowls are mainly used to hold tasty soups.= +Brick= +Brick Block= +Brick blocks are a good building material for building solid houses and can take quite a punch.= +Bricks are used to craft brick blocks.= +Brown Stained Glass= +Cactus= +Charcoal= +Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.= +Chiseled Stone Bricks= +Chiseled Red Sandstone= +Chiseled Sandstone= +Chiseled red sandstone is a decorative building block.= +Chiseled sandstone is a decorative building block.= +Clay= +Clay Ball= +Clay balls are a raw material, mainly used to create bricks in the furnace.= +Clay is a versatile kind of earth commonly found at beaches underwater.= +Coal= +Coal Ore= +Coarse Dirt= +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.= +Cobblestone= +Cobweb= +Cobwebs can be walked through, but significantly slow you down.= +Cracked Stone Bricks= +Cut Red Sandstone= +Cut Sandstone= +Cut red sandstone is a decorative building block.= +Cut sandstone is a decorative building block.= +Cyan Stained Glass= +Dark Oak Bark= +Dark Oak Leaves= +Dark Oak Sapling= +Dark Oak Wood= +Dark Oak Wood Planks= +Dark oak leaves are grown from dark oak trees.= +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.= +Dead Bush= +Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.= +Diamond= +Diamond Ore= +Diamond ore is rare and can be found in clusters near the bottom of the world.= +Diamonds are precious minerals and useful to create the highest tier of armor and tools.= +Diorite= +Diorite is an igneous rock.= +Dirt= +Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.= +Emerald= +Emerald Ore= +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.= +Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.= +Flint= +Flint is a raw material.= +Flowing Lava= +Flowing Water= +Frosted Ice= +Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.= +Glass= +Gold Ingot= +Gold Nugget= +Gold Ore= +Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.= +Golden Apple= +Golden apples are precious food items which can be eaten.= +Granite= +Grass Block= +Grass Path= +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.= +Gravel= +Green Stained Glass= +Grey Stained Glass= +Ice= +Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.= +In the End dimension, starting a fire on this block will create an eternal fire.= +Iron Ingot= +Iron Nugget= +Iron Ore= +Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.= +Jungle Bark= +Jungle Leaves= +Jungle Sapling= +Jungle Wood= +Jungle Wood Planks= +Jungle leaves are grown from jungle trees.= +Ladder= +Lapis Lazuli Block= +Lapis Lazuli Ore= +Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.= +Lava Source= +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.= +Light Blue Stained Glass= +Light Grey Stained Glass= +Lime Stained Glass= +Lit Redstone Ore= +Magenta Stained Glass= +Molten gold. It is used to craft armor, tools, and whatnot.= +Molten iron. It is used to craft armor, tools, and whatnot.= +Mossy Cobblestone= +Mossy Stone Bricks= +Mycelium= +Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.= +Oak Bark= +Oak Leaves= +Oak Sapling= +Oak Wood= +Oak Wood Planks= +Oak leaves are grown from oak trees.= +Obsidian= +Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.= +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.= +Orange Stained Glass= +Packed Ice= +Packed ice is a compressed form of ice. It is opaque and solid.= +Paper= +Paper is used to craft books and maps.= +Pink Stained Glass= +Podzol= +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.= +Polished Andesite= +Polished Diorite= +Polished Granite= +Polished Stone= +Polished andesite is a decorative building block made from andesite.= +Polished diorite is a decorative building block made from diorite.= +Polished granite is a decorative building block made from granite.= +Purple Stained Glass= +Realm Barrier= +Red Sand= +Red Sandstone= +Red Stained Glass= +Red sand is found in large quantities in mesa biomes.= +Red sandstone is compressed red sand and is a rather soft kind of stone.= +Redstone Ore= +Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.= +Sand= +Sand is found in large quantities at beaches and deserts.= +Sandstone= +Sandstone is compressed sand and is a rather soft kind of stone.= +Slime Block= +Slime blocks are very bouncy and prevent fall damage.= +Smooth Red Sandstone= +Smooth Sandstone= +Smooth red sandstone is a decorative building block.= +Smooth sandstone is compressed sand and is a rather soft kind of stone.= +Snow= +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.= +Some iron contained in stone, it is prety common and can be found below sea level.= +Spruce Bark= +Spruce Leaves= +Spruce Sapling= +Spruce Wood= +Spruce Wood Planks= +Spruce leaves are grown from spruce trees.= +Stained glass is a decorative and mostly transparent block which comes in various different colors.= +Stick= +Sticks are a very versatile crafting material; used in countless crafting recipes.= +Stone= +Stone Bricks= +Sugar= +Sugar Canes= +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.= +Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.= +Sugar comes from sugar canes and is used to make sweet foods.= +The trunk of a birch tree.= +The trunk of a dark oak tree.= +The trunk of a jungle tree.= +The trunk of a spruce tree.= +The trunk of an acacia.= +The trunk of an oak tree.= +This block consists of a couple of loose stones and can't support itself.= +This is a decorative block surrounded by the bark of a tree trunk.= +This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.= +This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.= +This stone contains pure gold, a rare metal.= +Top Snow= +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.= +Vines= +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.= +Void= +Water= +Water Source= +Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.= +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.= +When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.= +When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.= +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.= +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.= +When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.= +White Stained Glass= +Yellow Stained Glass= +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.= +Water interacts with lava in various ways:= +• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.= +• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.= +• When water is directly below lava, the water turns into stone.= +Lava interacts with water various ways:= +• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.= +• When lava is directly above water, the water turns into stone.= +Stained Glass= +Granite is an igneous rock.= +Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.= +This block can only be placed on full solid blocks and on another top snow (which increases its height).= +Needs soil and water to grow= +Needs soil and light to grow= +Grows on sand= +Contact damage: @1 per half second= +Slows down movement= +2×2 saplings required= +2×2 saplings @= large tree= +Grows on sand or dirt next to water= +Stackable= diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index a4c2f94f..5ea76bcd 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -1,8 +1,18 @@ +local S = minetest.get_translator("mcl_core") + -- Simple solid cubic nodes, most of them are the ground materials and simple building blocks +local translucent_ice = minetest.settings:get_bool("mcl_translucent_ice", false) +local ice_drawtype +if translucent_ice then + ice_drawtype = "glasslike" +else + ice_drawtype = "normal" +end + minetest.register_node("mcl_core:stone", { - description = "Stone", - _doc_items_longdesc = "One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.", + description = S("Stone"), + _doc_items_longdesc = S("One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava."), _doc_items_hidden = false, tiles = {"default_stone.png"}, is_ground_content = true, @@ -10,13 +20,13 @@ minetest.register_node("mcl_core:stone", { groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, drop = 'mcl_core:cobble', sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) minetest.register_node("mcl_core:stone_with_coal", { - description = "Coal Ore", - _doc_items_longdesc = "Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.", + description = S("Coal Ore"), + _doc_items_longdesc = S("Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height."), _doc_items_hidden = false, tiles = {"mcl_core_coal_ore.png"}, is_ground_content = true, @@ -24,34 +34,34 @@ minetest.register_node("mcl_core:stone_with_coal", { groups = {pickaxey=1, building_block=1, material_stone=1}, drop = 'mcl_core:coal_lump', sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) minetest.register_node("mcl_core:stone_with_iron", { - description = "Iron Ore", - _doc_items_longdesc = "Some iron contained in stone, it is prety common and can be found below sea level.", + description = S("Iron Ore"), + _doc_items_longdesc = S("Some iron contained in stone, it is prety common and can be found below sea level."), tiles = {"mcl_core_iron_ore.png"}, is_ground_content = true, stack_max = 64, groups = {pickaxey=3, building_block=1, material_stone=1}, drop = 'mcl_core:stone_with_iron', sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) minetest.register_node("mcl_core:stone_with_gold", { - description = "Gold Ore", - _doc_items_longdesc = "This stone contains pure gold, a rare metal.", + description = S("Gold Ore"), + _doc_items_longdesc = S("This stone contains pure gold, a rare metal."), tiles = {"mcl_core_gold_ore.png"}, is_ground_content = true, stack_max = 64, groups = {pickaxey=4, building_block=1, material_stone=1}, drop = "mcl_core:stone_with_gold", sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) @@ -62,8 +72,8 @@ local redstone_ore_activate = function(pos) t:start(redstone_timer) end minetest.register_node("mcl_core:stone_with_redstone", { - description = "Redstone Ore", - _doc_items_longdesc = "Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.", + description = S("Redstone Ore"), + _doc_items_longdesc = S("Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon."), tiles = {"mcl_core_redstone_ore.png"}, is_ground_content = true, stack_max = 64, @@ -83,7 +93,7 @@ minetest.register_node("mcl_core:stone_with_redstone", { sounds = mcl_sounds.node_sound_stone_defaults(), on_punch = redstone_ore_activate, on_walk_over = redstone_ore_activate, -- Uses walkover mod - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) @@ -93,7 +103,7 @@ local redstone_ore_reactivate = function(pos) end -- Light the redstone ore up when it has been touched minetest.register_node("mcl_core:stone_with_redstone_lit", { - description = "Lit Redstone Ore", + description = S("Lit Redstone Ore"), _doc_items_create_entry = false, tiles = {"mcl_core_redstone_ore.png"}, paramtype = "light", @@ -121,13 +131,13 @@ minetest.register_node("mcl_core:stone_with_redstone_lit", { on_timer = function(pos, elapsed) minetest.swap_node(pos, {name="mcl_core:stone_with_redstone"}) end, - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) minetest.register_node("mcl_core:stone_with_lapis", { - description = "Lapis Lazuli Ore", - _doc_items_longdesc = "Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.", + description = S("Lapis Lazuli Ore"), + _doc_items_longdesc = S("Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world."), tiles = {"mcl_core_lapis_ore.png"}, is_ground_content = true, stack_max = 64, @@ -143,125 +153,135 @@ minetest.register_node("mcl_core:stone_with_lapis", { } }, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) minetest.register_node("mcl_core:stone_with_emerald", { - description = "Emerald Ore", - _doc_items_longdesc = "Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.", + description = S("Emerald Ore"), + _doc_items_longdesc = S("Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters."), tiles = {"mcl_core_emerald_ore.png"}, is_ground_content = true, stack_max = 64, groups = {pickaxey=4, building_block=1, material_stone=1}, drop = "mcl_core:emerald", sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) minetest.register_node("mcl_core:stone_with_diamond", { - description = "Diamond Ore", - _doc_items_longdesc = "Diamond ore is rare and can be found in clusters near the bottom of the world.", + description = S("Diamond Ore"), + _doc_items_longdesc = S("Diamond ore is rare and can be found in clusters near the bottom of the world."), tiles = {"mcl_core_diamond_ore.png"}, is_ground_content = true, stack_max = 64, groups = {pickaxey=4, building_block=1, material_stone=1}, drop = "mcl_core:diamond", sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) minetest.register_node("mcl_core:stonebrick", { - description = "Stone Bricks", + description = S("Stone Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) minetest.register_node("mcl_core:stonebrickcarved", { - description = "Chiseled Stone Bricks", + description = S("Chiseled Stone Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, - is_ground_content = false, stack_max = 64, groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) minetest.register_node("mcl_core:stonebrickcracked", { - description = "Cracked Stone Bricks", + description = S("Cracked Stone Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_cracked.png"}, - is_ground_content = false, stack_max = 64, groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) minetest.register_node("mcl_core:stonebrickmossy", { - description = "Mossy Stone Bricks", + description = S("Mossy Stone Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_mossy.png"}, stack_max = 64, groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, +}) + +minetest.register_node("mcl_core:stone_smooth", { + description = S("Polished Stone"), + _doc_items_longdesc = doc.sub.items.temp.build, + tiles = {"mcl_stairs_stone_slab_top.png"}, + stack_max = 64, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + is_ground_content = false, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) minetest.register_node("mcl_core:granite", { - description = "Granite", - _doc_items_longdesc = "Granite is an igneous rock.", + description = S("Granite"), + _doc_items_longdesc = S("Granite is an igneous rock."), tiles = {"mcl_core_granite.png"}, is_ground_content = true, stack_max = 64, groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) minetest.register_node("mcl_core:granite_smooth", { - description = "Polished Granite", - _doc_items_longdesc = "Polished granite is a decorational building block made from granite.", + description = S("Polished Granite"), + _doc_items_longdesc = S("Polished granite is a decorative building block made from granite."), tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) minetest.register_node("mcl_core:andesite", { - description = "Andesite", - _doc_items_longdesc = "Andesite is an igneous rock.", + description = S("Andesite"), + _doc_items_longdesc = S("Andesite is an igneous rock."), tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) minetest.register_node("mcl_core:andesite_smooth", { - description = "Polished Andesite", - _doc_items_longdesc = "Polished andesite is a decorational building block made from andesite.", + description = S("Polished Andesite"), + _doc_items_longdesc = S("Polished andesite is a decorative building block made from andesite."), tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, @@ -272,66 +292,67 @@ minetest.register_node("mcl_core:andesite_smooth", { }) minetest.register_node("mcl_core:diorite", { - description = "Diorite", - _doc_items_longdesc = "Diorite is an igneous rock.", + description = S("Diorite"), + _doc_items_longdesc = S("Diorite is an igneous rock."), tiles = {"mcl_core_diorite.png"}, is_ground_content = true, stack_max = 64, groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) minetest.register_node("mcl_core:diorite_smooth", { - description = "Polished Diorite", - _doc_items_longdesc = "Polished diorite is a decorational building block made from diorite.", + description = S("Polished Diorite"), + _doc_items_longdesc = S("Polished diorite is a decorative building block made from diorite."), tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) +-- Grass Block minetest.register_node("mcl_core:dirt_with_grass", { - description = "Grass Block", - _doc_items_longdesc = "A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.", + description = S("Grass Block"), + _doc_items_longdesc = S("A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt."), _doc_items_hidden = false, - tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + paramtype2 = "color", + tiles = {"mcl_core_grass_block_top.png", { name="default_dirt.png", color="white" }}, + overlay_tiles = {"mcl_core_grass_block_top.png", "", {name="mcl_core_grass_block_side_overlay.png", tileable_vertical=false}}, + palette = "mcl_core_palette_grass.png", + palette_index = 0, + color = "#55aa60", is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=1,dirt=2,grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1}, drop = 'mcl_core:dirt', sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4}, }), - _mcl_blast_resistance = 3, - _mcl_hardness = 0.6, -}) - --- NOTE: This block is to be considered equivalent to the grass block -minetest.register_node("mcl_core:dirt_with_grass_snow", { - description = "Snowy Grass Block", - _doc_items_create_entry = false, - tiles = {"default_snow.png", "default_dirt.png", "mcl_core_grass_side_snowed.png"}, - is_ground_content = true, - stack_max = 64, - groups = {handy=1,shovely=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, building_block=1, not_in_creative_inventory=1}, - drop = 'mcl_core:dirt', - sounds = mcl_sounds.node_sound_snow_defaults({ - dug = {name="default_dirt_footstep", gain=1.5}, - dig = {name="default_dig_crumbly", gain=1.0} - }), - _mcl_blast_resistance = 3, + on_construct = function(pos) + local node = minetest.get_node(pos) + if node.param2 == 0 then + local new_node = mcl_core.get_grass_block_type(pos) + if new_node.param2 ~= 0 or new_node.name ~= "mcl_core:dirt_with_grass" then + minetest.set_node(pos, new_node) + end + end + return mcl_core.on_snowable_construct(pos) + end, + _mcl_snowed = "mcl_core:dirt_with_grass_snow", + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.6, }) +mcl_core.register_snowed_node("mcl_core:dirt_with_grass_snow", "mcl_core:dirt_with_grass", nil, nil, true) minetest.register_node("mcl_core:grass_path", { tiles = {"mcl_core_grass_path_top.png", "default_dirt.png", "mcl_core_grass_path_side.png"}, - description = "Grass Path", - _doc_items_longdesc = "Grass paths are a decorational variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.", + description = S("Grass Path"), + _doc_items_longdesc = S("Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block."), drop = "mcl_core:dirt", is_ground_content = true, drawtype = "nodebox", @@ -343,106 +364,78 @@ minetest.register_node("mcl_core:grass_path", { {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, } }, - groups = {handy=1,shovely=1, cultivatable=2, dirtifies_below_solid=1, not_in_creative_inventory=1, }, + groups = {handy=1,shovely=1, cultivatable=2, dirtifies_below_solid=1, dirtifier=1, deco_block=1 }, sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4}, }), - _mcl_blast_resistance = 3.25, + _mcl_blast_resistance = 0.65, _mcl_hardness = 0.6, }) -- TODO: Add particles minetest.register_node("mcl_core:mycelium", { - description = "Mycelium", - _doc_items_longdesc = "Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.", - tiles = {"mcl_core_mycelium_top.png", "default_dirt.png", "mcl_core_mycelium_side.png"}, + description = S("Mycelium"), + _doc_items_longdesc = S("Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt."), + tiles = {"mcl_core_mycelium_top.png", "default_dirt.png", {name="mcl_core_mycelium_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, spreading_dirt_type=1, building_block=1}, + groups = {handy=1,shovely=1, dirt=2,spreading_dirt_type=1, building_block=1}, drop = 'mcl_core:dirt', sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4}, }), - _mcl_blast_resistance = 2.5, - _mcl_hardness = 0.6, -}) --- NOTE: This block is to be considered equivalent to mycelium -minetest.register_node("mcl_core:mycelium_snow", { - description = "Snowy Mycelium", - _doc_items_create_entry = false, - -- CHECKME: Are the sides of snowy mycelium supposed to look like this? - tiles = {"default_snow.png", "default_dirt.png", "mcl_core_grass_side_snowed.png"}, - is_ground_content = true, - stack_max = 64, - groups = {handy=1,shovely=1, building_block=1, not_in_creative_inventory=1}, - drop = 'mcl_core:dirt', - sounds = mcl_sounds.node_sound_snow_defaults({ - dug = {name="default_dirt_footstep", gain=1.5}, - dig = {name="default_dig_crumbly", gain=1.0} - }), - _mcl_blast_resistance = 2.5, + on_construct = mcl_core.on_snowable_construct, + _mcl_snowed = "mcl_core:mycelium_snow", + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.6, }) +mcl_core.register_snowed_node("mcl_core:mycelium_snow", "mcl_core:mycelium") minetest.register_node("mcl_core:podzol", { - description = "Podzol", - _doc_items_longdesc = "Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.", - tiles = {"mcl_core_dirt_podzol_top.png", "default_dirt.png", "mcl_core_dirt_podzol_side.png"}, + description = S("Podzol"), + _doc_items_longdesc = S("Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it."), + tiles = {"mcl_core_dirt_podzol_top.png", "default_dirt.png", {name="mcl_core_dirt_podzol_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=3, soil=1, soil_sapling=2, soil_sugarcane=1, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=3, dirt=2,soil=1, soil_sapling=2, soil_sugarcane=1, enderman_takable=1, building_block=1}, drop = 'mcl_core:dirt', sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_blast_resistance = 2.5, - _mcl_hardness = 0.6, -}) - --- NOTE: This block is to be considered equivalent to podzol -minetest.register_node("mcl_core:podzol_snow", { - description = "Snowy Podzol", - _doc_items_create_entry = false, - tiles = {"default_snow.png", "default_dirt.png", "mcl_core_grass_side_snowed.png"}, - is_ground_content = true, - stack_max = 64, - groups = {handy=1,shovely=3, soil=1, soil_sapling=2, soil_sugarcane=1, building_block=1, not_in_creative_inventory=1}, - drop = 'mcl_core:dirt', - sounds = mcl_sounds.node_sound_snow_defaults({ - dug = {name="default_dirt_footstep", gain=1.5}, - dig = {name="default_dig_crumbly", gain=1.0} - }), - _mcl_blast_resistance = 2.5, + on_construct = mcl_core.on_snowable_construct, + _mcl_snowed = "mcl_core:podzol_snow", + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.6, }) +mcl_core.register_snowed_node("mcl_core:podzol_snow", "mcl_core:podzol") minetest.register_node("mcl_core:dirt", { - description = "Dirt", - _doc_items_longdesc = "Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.", + description = S("Dirt"), + _doc_items_longdesc = S("Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby."), _doc_items_hidden = false, tiles = {"default_dirt.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=1, dirt=1,soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, enderman_takable=1, building_block=1}, sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_blast_resistance = 3, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) minetest.register_node("mcl_core:coarse_dirt", { - description = "Coarse Dirt", - _doc_items_longdesc = "Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.", + description = S("Coarse Dirt"), + _doc_items_longdesc = S("Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover."), tiles = {"mcl_core_coarse_dirt.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, soil=1, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=1, dirt=3,soil=1, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1}, sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_blast_resistance = 3, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) minetest.register_node("mcl_core:gravel", { - description = "Gravel", - _doc_items_longdesc = "This block consists of a couple of loose stones and can't support itself.", + description = S("Gravel"), + _doc_items_longdesc = S("This block consists of a couple of loose stones and can't support itself."), tiles = {"default_gravel.png"}, is_ground_content = true, stack_max = 64, @@ -457,117 +450,141 @@ minetest.register_node("mcl_core:gravel", { sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_gravel_footstep", gain=0.45}, }), - _mcl_blast_resistance = 3, + _mcl_blast_resistance = 0.6, _mcl_hardness = 0.6, }) -- sandstone -- minetest.register_node("mcl_core:sand", { - description = "Sand", - _doc_items_longdesc = "Sand is found in large quantities at beaches and deserts.", + description = S("Sand"), + _doc_items_longdesc = S("Sand is found in large quantities at beaches and deserts."), _doc_items_hidden = false, tiles = {"default_sand.png"}, is_ground_content = true, stack_max = 64, groups = {handy=1,shovely=1, falling_node=1, sand=1, soil_sugarcane=1, enderman_takable=1, building_block=1, material_sand=1}, sounds = mcl_sounds.node_sound_sand_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) minetest.register_node("mcl_core:sandstone", { - description = "Sandstone", + description = S("Sandstone"), _doc_items_hidden = false, - _doc_items_longdesc = "Sandstone is compressed sand and is a rather soft kind of stone.", + _doc_items_longdesc = S("Sandstone is compressed sand and is a rather soft kind of stone."), tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) minetest.register_node("mcl_core:sandstonesmooth", { - description = "Smooth Sandstone", - _doc_items_longdesc = "Smooth sandstone is a decorational building block.", + description = S("Cut Sandstone"), + _doc_items_longdesc = S("Cut sandstone is a decorative building block."), tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, - is_ground_content = true, + is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) minetest.register_node("mcl_core:sandstonecarved", { - description = "Chiseled Sandstone", - _doc_items_longdesc = "Chiseled sandstone is a decorational building block.", + description = S("Chiseled Sandstone"), + _doc_items_longdesc = S("Chiseled sandstone is a decorative building block."), tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_carved.png"}, - is_ground_content = true, + is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, +}) + +minetest.register_node("mcl_core:sandstonesmooth2", { + description = S("Smooth Sandstone"), + _doc_items_hidden = false, + _doc_items_longdesc = S("Smooth sandstone is compressed sand and is a rather soft kind of stone."), + tiles = {"mcl_core_sandstone_top.png"}, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) -- red sandstone -- minetest.register_node("mcl_core:redsand", { - description = "Red Sand", - _doc_items_longdesc = "Red sand is found in large quantities in mesa biomes.", + description = S("Red Sand"), + _doc_items_longdesc = S("Red sand is found in large quantities in mesa biomes."), tiles = {"mcl_core_red_sand.png"}, is_ground_content = true, stack_max = 64, groups = {handy=1,shovely=1, falling_node=1, sand=1, soil_sugarcane=1, enderman_takable=1, building_block=1, material_sand=1}, sounds = mcl_sounds.node_sound_sand_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) minetest.register_node("mcl_core:redsandstone", { - description = "Red Sandstone", - _doc_items_longdesc = "Red sandstone is compressed red sand and is a rather soft kind of stone.", + description = S("Red Sandstone"), + _doc_items_longdesc = S("Red sandstone is compressed red sand and is a rather soft kind of stone."), tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, redsandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) minetest.register_node("mcl_core:redsandstonesmooth", { - description = "Smooth Red Sandstone", - _doc_items_longdesc = "Smooth red sandstone is a decorational building block.", + description = S("Cut Red Sandstone"), + _doc_items_longdesc = S("Cut red sandstone is a decorative building block."), tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, - is_ground_content = true, + is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, redsandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) minetest.register_node("mcl_core:redsandstonecarved", { - description = "Chiseled Red Sandstone", - _doc_items_longdesc = "Chiseled red sandstone is a decorational building block.", + description = S("Chiseled Red Sandstone"), + _doc_items_longdesc = S("Chiseled red sandstone is a decorative building block."), tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, - is_ground_content = true, + is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, redsandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, +}) + +minetest.register_node("mcl_core:redsandstonesmooth2", { + description = S("Smooth Red Sandstone"), + _doc_items_longdesc = S("Smooth red sandstone is a decorative building block."), + tiles = {"mcl_core_red_sandstone_top.png"}, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) --- minetest.register_node("mcl_core:clay", { - -- Original name: Clay - description = "Block of Clay", - _doc_items_longdesc = "A block of clay is a versatile kind of earth commonly found at beaches underwater.", + description = S("Clay"), + _doc_items_longdesc = S("Clay is a versatile kind of earth commonly found at beaches underwater."), _doc_items_hidden = false, tiles = {"default_clay.png"}, is_ground_content = true, @@ -575,27 +592,28 @@ minetest.register_node("mcl_core:clay", { groups = {handy=1,shovely=1, enderman_takable=1, building_block=1}, drop = 'mcl_core:clay_lump 4', sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_blast_resistance = 3, + _mcl_blast_resistance = 0.6, _mcl_hardness = 0.6, }) minetest.register_node("mcl_core:brick_block", { -- Original name: “Bricks” - description = "Brick Block", - _doc_items_longdesc = "Brick blocks are a good building material for building solid houses and can take quite a punch.", + description = S("Brick Block"), + _doc_items_longdesc = S("Brick blocks are a good building material for building solid houses and can take quite a punch."), tiles = {"default_brick.png"}, is_ground_content = false, stack_max = 64, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) minetest.register_node("mcl_core:bedrock", { - description = "Bedrock", - _doc_items_longdesc = "Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.", + description = S("Bedrock"), + _doc_items_longdesc = S("Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.").."\n".. + S("In the End dimension, starting a fire on this block will create an eternal fire."), tiles = {"mcl_core_bedrock.png"}, stack_max = 64, groups = {creative_breakable=1, building_block=1, material_stone=1}, @@ -603,12 +621,36 @@ minetest.register_node("mcl_core:bedrock", { is_ground_content = false, on_blast = function() end, drop = '', - _mcl_blast_resistance = 18000000, + _mcl_blast_resistance = 3600000, _mcl_hardness = -1, + + -- Eternal fire on top of bedrock, if in the End dimension + after_destruct = function(pos) + pos.y = pos.y + 1 + if minetest.get_node(pos).name == "mcl_fire:eternal_fire" then + minetest.remove_node(pos) + end + end, + _on_ignite = function(player, pointed_thing) + local pos = pointed_thing.under + local dim = mcl_worlds.pos_to_dimension(pos) + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + local fn = minetest.get_node(flame_pos) + local pname = player:get_player_name() + if minetest.is_protected(flame_pos, pname) then + return minetest.record_protection_violation(flame_pos, pname) + end + if dim == "end" and fn.name == "air" and pointed_thing.under.y < pointed_thing.above.y then + minetest.set_node(flame_pos, {name = "mcl_fire:eternal_fire"}) + return true + else + return false + end + end, }) minetest.register_node("mcl_core:cobble", { - description = "Cobblestone", + description = S("Cobblestone"), _doc_items_longdesc = doc.sub.items.temp.build, _doc_items_hidden = false, tiles = {"default_cobble.png"}, @@ -616,140 +658,136 @@ minetest.register_node("mcl_core:cobble", { stack_max = 64, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) minetest.register_node("mcl_core:mossycobble", { - description = "Moss Stone", + description = S("Mossy Cobblestone"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_mossycobble.png"}, is_ground_content = false, stack_max = 64, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) minetest.register_node("mcl_core:coalblock", { - description = "Block of Coal", - _doc_items_longdesc = "Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.", + description = S("Block of Coal"), + _doc_items_longdesc = S("Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal."), tiles = {"default_coal_block.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, flammable=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, flammable=1, building_block=1, material_stone=1, fire_encouragement=5, fire_flammability=5}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 5, }) minetest.register_node("mcl_core:ironblock", { - description = "Block of Iron", - _doc_items_longdesc = "A block of iron is mostly a decorational block but also useful as a compact storage of iron ingots.", + description = S("Block of Iron"), + _doc_items_longdesc = S("A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots."), tiles = {"default_steel_block.png"}, is_ground_content = false, stack_max = 64, groups = {pickaxey=2, building_block=1}, sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 5, }) minetest.register_node("mcl_core:goldblock", { - description = "Block of Gold", - _doc_items_longdesc = "A block of gold is mostly a shiny decorational block but also useful as a compact storage of gold ingots.", + description = S("Block of Gold"), + _doc_items_longdesc = S("A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots."), tiles = {"default_gold_block.png"}, is_ground_content = false, stack_max = 64, groups = {pickaxey=4, building_block=1}, sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 5, }) minetest.register_node("mcl_core:diamondblock", { - description = "Block of Diamond", - _doc_items_longdesc = "A block of diamond mostly a shiny decorational block but also useful as a compact storage of diamonds.", + description = S("Block of Diamond"), + _doc_items_longdesc = S("A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds."), tiles = {"default_diamond_block.png"}, is_ground_content = false, stack_max = 64, groups = {pickaxey=4, building_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 5, }) minetest.register_node("mcl_core:lapisblock", { - description = "Lapis Lazuli Block", - _doc_items_longdesc = "A lapis lazuli block is mostly a decorational block but also useful as a compact storage of lapis lazuli.", + description = S("Lapis Lazuli Block"), + _doc_items_longdesc = S("A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli."), tiles = {"mcl_core_lapis_block.png"}, is_ground_content = false, stack_max = 64, groups = {pickaxey=3, building_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) minetest.register_node("mcl_core:emeraldblock", { - description = "Block of Emerald", - _doc_items_longdesc = "A block of emerald is mostly a shiny decorational block but also useful as a compact storage of emeralds.", + description = S("Block of Emerald"), + _doc_items_longdesc = S("A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds."), tiles = {"mcl_core_emerald_block.png"}, is_ground_content = false, stack_max = 64, groups = {pickaxey=4, building_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 5, }) minetest.register_node("mcl_core:obsidian", { - description = "Obsidian", - _doc_items_longdesc = "Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.", + description = S("Obsidian"), + _doc_items_longdesc = S("Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava."), tiles = {"default_obsidian.png"}, is_ground_content = true, sounds = mcl_sounds.node_sound_stone_defaults(), stack_max = 64, groups = {pickaxey=5, building_block=1, material_stone=1}, - _mcl_blast_resistance = 6000, + _mcl_blast_resistance = 1200, _mcl_hardness = 50, }) minetest.register_node("mcl_core:ice", { - description = "Ice", - _doc_items_longdesc = "Ice is a translucent solid block usually found in cold areas. When it is broken while resting on top of another block, it will turn into still water.", - drawtype = "glasslike", + description = S("Ice"), + _doc_items_longdesc = S("Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source."), + drawtype = ice_drawtype, tiles = {"default_ice.png"}, is_ground_content = true, paramtype = "light", - use_texture_alpha = true, + use_texture_alpha = translucent_ice, stack_max = 64, - groups = {handy=1,pickaxey=1, building_block=1}, + groups = {handy=1,pickaxey=1, slippery=3, building_block=1}, drop = "", sounds = mcl_sounds.node_sound_glass_defaults(), - after_destruct = function(pos, oldnode) - -- Create a water source if ice is destroyed and there was something below it - local below = {x=pos.x, y=pos.y-1, z=pos.z} - local belownode = minetest.get_node(below) - if belownode.name ~= "air" and belownode.name ~= "ignore" and belownode.name ~= "mcl_core:void" then - minetest.set_node(pos, {name="mcl_core:water_source"}) - end + node_dig_prediction = "mcl_core:water_source", + after_dig_node = function(pos, oldnode) + mcl_core.melt_ice(pos) end, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) minetest.register_node("mcl_core:packed_ice", { - description = "Packed Ice", - _doc_items_longdesc = "Packed ice is a compressed form of ice. It is opaque and solid.", + description = S("Packed Ice"), + _doc_items_longdesc = S("Packed ice is a compressed form of ice. It is opaque and solid."), tiles = {"mcl_core_ice_packed.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1,pickaxey=1, building_block=1}, + groups = {handy=1,pickaxey=1, slippery=3, building_block=1}, drop = "", sounds = mcl_sounds.node_sound_glass_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) @@ -760,14 +798,17 @@ for i=0,3 do -- Increase age of frosted age or turn to water source if too old local nn = minetest.get_node(pos).name local age = tonumber(string.sub(nn, -1)) + local dim = mcl_worlds.pos_to_dimension(pos) if age == nil then return end - local nextnode if age < 3 then - nextnode = "mcl_core:frosted_ice_"..(age+1) + minetest.swap_node(pos, { name = "mcl_core:frosted_ice_"..(age+1) }) else - nextnode = "mcl_core:water_source" + if dim ~= "nether" then + minetest.set_node(pos, { name = "mcl_core:water_source" }) + else + minetest.remove_node(pos) + end end - minetest.swap_node(pos, { name = nextnode }) -- Spread aging to neighbor blocks, but not recursively if first_melt and i == 3 then for j=1, #ice_near do @@ -778,19 +819,19 @@ for i=0,3 do local use_doc = i == 0 local longdesc if use_doc then - longdesc = "Frosted ice is a short-lived solid translucent block. It melts into a water source within a few seconds." + longdesc = S("Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.") end minetest.register_node("mcl_core:frosted_ice_"..i, { - description = "Frosted Ice", + description = S("Frosted Ice"), _doc_items_create_entry = use_doc, _doc_items_longdesc = longdesc, - drawtype = "glasslike", + drawtype = ice_drawtype, tiles = {"mcl_core_frosted_ice_"..i..".png"}, is_ground_content = false, paramtype = "light", - use_texture_alpha = true, + use_texture_alpha = translucent_ice, stack_max = 64, - groups = {handy=1, frosted_ice=1, not_in_creative_inventory=1}, + groups = {handy=1, frosted_ice=1, slippery=3, not_in_creative_inventory=1}, drop = "", sounds = mcl_sounds.node_sound_glass_defaults(), on_construct = function(pos) @@ -810,7 +851,7 @@ for i=0,3 do local timer = minetest.get_node_timer(pos) timer:start(1.5) end, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) @@ -820,85 +861,133 @@ for i=0,3 do end end -local on_snow_construct = function(pos) - local npos = {x=pos.x, y=pos.y-1, z=pos.z} - local node = minetest.get_node(npos) - if node.name == "mcl_core:dirt_with_grass" then - minetest.swap_node(npos, {name="mcl_core:dirt_with_grass_snow"}) - elseif node.name == "mcl_core:podzol" then - minetest.swap_node(npos, {name="mcl_core:podzol_snow"}) - elseif node.name == "mcl_core:mycelium" then - minetest.swap_node(npos, {name="mcl_core:mycelium_snow"}) +for i=1,8 do + local id, desc, longdesc, usagehelp, tt_help, help, walkable, drawtype, node_box + if i == 1 then + id = "mcl_core:snow" + desc = S("Top Snow") + tt_help = S("Stackable") + longdesc = S("Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.").."\n"..S("Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.") + usagehelp = S("This block can only be placed on full solid blocks and on another top snow (which increases its height).") + walkable = false + else + id = "mcl_core:snow_"..i + help = false + if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_core:snow", "nodes", id) + end + walkable = true end -end -local clear_snow_dirt = function(pos, node) - if node.name == "mcl_core:dirt_with_grass_snow" then - minetest.swap_node(pos, {name="mcl_core:dirt_with_grass"}) - elseif node.name == "mcl_core:podzol_snow" then - minetest.swap_node(pos, {name="mcl_core:podzol"}) - elseif node.name == "mcl_core:mycelium_snow" then - minetest.swap_node(pos, {name="mcl_core:mycelium"}) + if i ~= 8 then + drawtype = "nodebox" + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.5 + (2*i)/16, 0.5 }, + } + end + local on_place = function(itemstack, placer, pointed_thing) + -- Placement is only allowed on top of solid blocks + if pointed_thing.type ~= "node" then + -- no interaction possible with entities + return itemstack + end + local def = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] + local above = pointed_thing.above + local under = pointed_thing.under + local unode = minetest.get_node(under) + + -- Check special rightclick action of pointed node + if def and def.on_rightclick then + if not placer:get_player_control().sneak then + return def.on_rightclick(under, unode, placer, itemstack, + pointed_thing) or itemstack, false + end + end + + -- Get position where snow would be placed + local target + if minetest.registered_nodes[unode.name].buildable_to then + target = under + else + target = above + end + local tnode = minetest.get_node(target) + + -- Stack snow + local g = minetest.get_item_group(tnode.name, "top_snow") + if g > 0 then + local itemstring = itemstack:get_name() + local itemcount = itemstack:get_count() + local fakestack = ItemStack(itemstring.." "..itemcount) + fakestack:set_name("mcl_core:snow_"..math.min(8, (i+g))) + local success + itemstack, success = minetest.item_place(fakestack, placer, pointed_thing) + minetest.sound_play(mcl_sounds.node_sound_snow_defaults().place, {pos = below}, true) + itemstack:set_name(itemstring) + return itemstack + end + + -- Place snow normally + local below = {x=target.x, y=target.y-1, z=target.z} + local bnode = minetest.get_node(below) + + if minetest.get_item_group(bnode.name, "solid") == 1 then + minetest.sound_play(mcl_sounds.node_sound_snow_defaults().place, {pos = below}, true) + return minetest.item_place_node(itemstack, placer, pointed_thing) + else + return itemstack + end end + minetest.register_node(id, { + description = desc, + _tt_help = tt_help, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + _doc_items_create_entry = help, + _doc_items_hidden = false, + tiles = {"default_snow.png"}, + wield_image = "default_snow.png", + wield_scale = { x=1, y=1, z=i }, + is_ground_content = true, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + node_placement_prediction = "", -- to prevent client flickering when stacking snow + drawtype = drawtype, + stack_max = 64, + walkable = walkable, + floodable = true, + on_flood = function(pos, oldnode, newnode) + local npos = {x=pos.x, y=pos.y-1, z=pos.z} + local node = minetest.get_node(npos) + mcl_core.clear_snow_dirt(npos, node) + end, + node_box = node_box, + groups = {shovely=1, attached_node=1,deco_block=1, dig_by_piston=1, snow_cover=1, top_snow=i}, + sounds = mcl_sounds.node_sound_snow_defaults(), + on_construct = mcl_core.on_snow_construct, + on_place = on_place, + after_destruct = mcl_core.after_snow_destruct, + drop = "mcl_throwing:snowball "..(i+1), + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, + }) end -local after_snow_destruct = function(pos) - local nn = minetest.get_node(pos).name - -- No-op if snow was replaced with snow - if nn == "mcl_core:snow" or nn == "mcl_core:snowblock" then - return - end - local npos = {x=pos.x, y=pos.y-1, z=pos.z} - local node = minetest.get_node(npos) - clear_snow_dirt(npos, node) -end - -minetest.register_node("mcl_core:snow", { - description = "Top Snow", - _doc_items_longdesc = "Top snow is a thin layer of snow.", - _doc_items_hidden = false, - tiles = {"default_snow.png"}, - wield_image = "default_snow.png", - wield_scale = { x=1, y=1, z=1 }, - is_ground_content = true, - paramtype = "light", - sunlight_propagates = true, - buildable_to = true, - drawtype = "nodebox", - stack_max = 64, - floodable = true, - on_flood = function(pos, oldnode, newnode) - local npos = {x=pos.x, y=pos.y-1, z=pos.z} - local node = minetest.get_node(npos) - clear_snow_dirt(npos, node) - end, - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5}, - }, - }, - groups = {shovely=1, attached_node=1,deco_block=1, dig_by_piston=1}, - sounds = mcl_sounds.node_sound_snow_defaults(), - on_construct = on_snow_construct, - after_destruct = after_snow_destruct, - drop = "mcl_throwing:snowball 2", - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.1, -}) minetest.register_node("mcl_core:snowblock", { - description = "Snow", - _doc_items_longdesc = "This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.", + description = S("Snow"), + _doc_items_longdesc = S("This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold."), _doc_items_hidden = false, tiles = {"default_snow.png"}, is_ground_content = true, stack_max = 64, - groups = {shovely=1, building_block=1}, + groups = {shovely=1, building_block=1, snow_cover=1}, sounds = mcl_sounds.node_sound_snow_defaults(), - on_construct = on_snow_construct, - after_destruct = after_snow_destruct, + on_construct = mcl_core.on_snow_construct, + after_destruct = mcl_core.after_snow_destruct, drop = "mcl_throwing:snowball 4", - _mcl_blast_resistance = 1, + _mcl_blast_resistance = 0.2, _mcl_hardness = 0.2, }) @@ -907,8 +996,5 @@ if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_core:stone_with_redstone", "nodes", "mcl_core:stone_with_redstone_lit") doc.add_entry_alias("nodes", "mcl_core:water_source", "nodes", "mcl_core:water_flowing") doc.add_entry_alias("nodes", "mcl_core:lava_source", "nodes", "mcl_core:lava_flowing") - doc.add_entry_alias("nodes", "mcl_core:dirt_with_grass", "nodes", "mcl_core:dirt_with_grass_snow") - doc.add_entry_alias("nodes", "mcl_core:podzol", "nodes", "mcl_core:podzol_snow") - doc.add_entry_alias("nodes", "mcl_core:mycelium", "nodes", "mcl_core:mycelium_snow") end diff --git a/mods/ITEMS/mcl_core/nodes_cactuscane.lua b/mods/ITEMS/mcl_core/nodes_cactuscane.lua index e9f38437..277cc565 100644 --- a/mods/ITEMS/mcl_core/nodes_cactuscane.lua +++ b/mods/ITEMS/mcl_core/nodes_cactuscane.lua @@ -1,11 +1,14 @@ -- Cactus and Sugar Cane +local S = minetest.get_translator("mcl_core") + minetest.register_node("mcl_core:cactus", { - description = "Cactus", - _doc_items_longdesc = "This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.", - _doc_items_usagehelp = "A cactus can only be placed on top of another cactus or any sand.", + description = S("Cactus"), + _tt_help = S("Grows on sand").."\n"..minetest.colorize("#FFFF00", S("Contact damage: @1 per half second", 1)), + _doc_items_longdesc = S("This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well."), + _doc_items_usagehelp = S("A cactus can only be placed on top of another cactus or any sand."), drawtype = "nodebox", - tiles = {"default_cactus_top.png", "mcl_core_cactus_bottom.png", "default_cactus_side.png","default_cactus_side.png","default_cactus_side.png","default_cactus_side.png"}, + tiles = {"mcl_core_cactus_top.png", "mcl_core_cactus_bottom.png", "mcl_core_cactus_side.png"}, is_ground_content = true, stack_max = 64, groups = {handy=1, attached_node=1, plant=1, deco_block=1, dig_by_piston=1, enderman_takable=1}, @@ -39,14 +42,15 @@ minetest.register_node("mcl_core:cactus", { if not node_below then return false end return (node_below.name == "mcl_core:cactus" or minetest.get_item_group(node_below.name, "sand") == 1) end), - _mcl_blast_resistance = 2, + _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, }) minetest.register_node("mcl_core:reeds", { - description = "Sugar Canes", - _doc_items_longdesc = "Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.", - _doc_items_usagehelp = "Sugar canes can only be placed on blocks on which they would grow.", + description = S("Sugar Canes"), + _tt_help = S("Grows on sand or dirt next to water"), + _doc_items_longdesc = S("Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well."), + _doc_items_usagehelp = S("Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow."), drawtype = "plantlike", tiles = {"default_papyrus.png"}, inventory_image = "mcl_core_reeds.png", @@ -71,7 +75,7 @@ minetest.register_node("mcl_core:reeds", { }, }, stack_max = 64, - groups = {dig_immediate=3, craftitem=1, plant=1, non_mycelium_plant=1, dig_by_piston=1}, + groups = {dig_immediate=3, craftitem=1, deco_block=1, plant=1, non_mycelium_plant=1, dig_by_piston=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", on_place = mcl_util.generate_on_place_plant_function(function(place_pos, place_node) @@ -81,9 +85,11 @@ minetest.register_node("mcl_core:reeds", { local snn = soil_node.name -- soil node name -- Placement rules: - -- * On group:soil_sugarcane - -- * Next to water or frosted ice - if minetest.get_item_group(snn, "soil_sugarcane") == 0 then + -- * On top of group:soil_sugarcane AND next to water or frosted ice. OR + -- * On top of sugar canes + if snn == "mcl_core:reeds" then + return true + elseif minetest.get_item_group(snn, "soil_sugarcane") == 0 then return false end @@ -107,4 +113,4 @@ minetest.register_node("mcl_core:reeds", { end), _mcl_blast_resistance = 0, _mcl_hardness = 0, -}) \ No newline at end of file +}) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index fc3d7b93..d9ecd76d 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -1,8 +1,19 @@ -- Climbable nodes +local S = minetest.get_translator("mcl_core") + +local rotate_climbable = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_FACE then + local r = screwdriver.rotate.wallmounted(pos, node, mode) + node.param2 = r + minetest.swap_node(pos, node) + return true + end + return false +end minetest.register_node("mcl_core:ladder", { - description = "Ladder", - _doc_items_longdesc = "A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.", + description = S("Ladder"), + _doc_items_longdesc = S("A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns."), drawtype = "signlike", is_ground_content = false, tiles = {"default_ladder.png"}, @@ -64,20 +75,21 @@ minetest.register_node("mcl_core:ladder", { if success then if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=above, gain=1}) + minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true) end end return itemstack end, - _mcl_blast_resistance = 2, + _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, + on_rotate = rotate_climbable, }) minetest.register_node("mcl_core:vine", { - description = "Vines", - _doc_items_longdesc = "Vines are climbable blocks which can be placed on the sides solid full-cube blocks. Vines very slowly grow upwards and downwards.", + description = S("Vines"), + _doc_items_longdesc = S("Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread."), drawtype = "signlike", tiles = {"mcl_core_vine.png"}, inventory_image = "mcl_core_vine.png", @@ -92,7 +104,7 @@ minetest.register_node("mcl_core:vine", { type = "wallmounted", }, stack_max = 64, - groups = {handy=1,axey=1,shearsy=1,swordy=1, flammable=2,deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1}, + groups = {handy=1,axey=1,shearsy=1,swordy=1, flammable=2,deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=15, fire_flammability=100}, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = "", _mcl_shears_drop = true, @@ -118,14 +130,9 @@ minetest.register_node("mcl_core:vine", { end end - -- Only allow placement on solid nodes - if (not groups) or (not groups.solid) then - return itemstack - end - -- Only place on full cubes if not mcl_core.supports_vines(node.name) then - return + return itemstack end local above = pointed_thing.above @@ -139,29 +146,25 @@ minetest.register_node("mcl_core:vine", { if success then if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=above, gain=1}) + minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true) end end return itemstack end, - -- If destroyed, also a “dependant” vine below it. + -- If dug, also dig a “dependant” vine below it. -- A vine is dependant if it hangs from this node and has no supporting block. - after_destruct = function(pos, oldnode) + on_dig = function(pos, node, digger) local below = {x=pos.x, y=pos.y-1, z=pos.z} local belownode = minetest.get_node(below) - if belownode.name == oldnode.name and belownode.param2 == belownode.param2 then - local dir = minetest.wallmounted_to_dir(belownode.param2) - local support = vector.add(below, dir) - local supportnode = minetest.get_node(support) - -- supporting block = walkable + solid - if not minetest.registered_nodes[supportnode.name].walkable and minetest.get_item_group(supportnode.name, "solid") ~= 1 then - minetest.remove_node(below) - end + minetest.node_dig(pos, node, digger) + if belownode.name == node.name and (not mcl_core.check_vines_supported(below, belownode)) then + minetest.registered_nodes[node.name].on_dig(below, node, digger) end end, - _mcl_blast_resistance = 1, + _mcl_blast_resistance = 0.2, _mcl_hardness = 0.2, + on_rotate = false, }) diff --git a/mods/ITEMS/mcl_core/nodes_glass.lua b/mods/ITEMS/mcl_core/nodes_glass.lua index 595d4c8d..87e9a786 100644 --- a/mods/ITEMS/mcl_core/nodes_glass.lua +++ b/mods/ITEMS/mcl_core/nodes_glass.lua @@ -1,8 +1,10 @@ -- Glass nodes +local S = minetest.get_translator("mcl_core") +local mod_doc = minetest.get_modpath("doc") minetest.register_node("mcl_core:glass", { - description = "Glass", - _doc_items_longdesc = "A decorational and mostly transparent block.", + description = S("Glass"), + _doc_items_longdesc = S("A decorative and mostly transparent block."), drawtype = "glasslike", is_ground_content = false, tiles = {"default_glass.png"}, @@ -12,30 +14,42 @@ minetest.register_node("mcl_core:glass", { groups = {handy=1, glass=1, building_block=1, material_glass=1}, sounds = mcl_sounds.node_sound_glass_defaults(), drop = "", - _mcl_blast_resistance = 1.5, + _mcl_blast_resistance = 0.3, _mcl_hardness = 0.3, }) ------------------------ -- Create Color Glass -- ------------------------ -function mcl_core.add_glass(desc, recipeitem, colorgroup, color) +local canonical_color = "yellow" +function mcl_core.add_stained_glass(desc, recipeitem, colorgroup, color) + local longdesc, create_entry, entry_name + if mod_doc then + if color == canonical_color then + longdesc = S("Stained glass is a decorative and mostly transparent block which comes in various different colors.") + entry_name = S("Stained Glass") + else + create_entry = false + end + end minetest.register_node("mcl_core:glass_"..color, { description = desc, - _doc_items_longdesc = "Stained glass is a decorational and mostly transparent block which comes in various different colors.", + _doc_items_create_entry = create_entry, + _doc_items_entry_name = entry_name, + _doc_items_longdesc = longdesc, drawtype = "glasslike", is_ground_content = false, tiles = {"mcl_core_glass_"..color..".png"}, paramtype = "light", - sunlight_propagates = "true", + sunlight_propagates = true, use_texture_alpha = true, stack_max = 64, -- TODO: Add color to groups groups = {handy=1, glass=1, building_block=1, material_glass=1}, sounds = mcl_sounds.node_sound_glass_defaults(), drop = "", - _mcl_blast_resistance = 1.5, + _mcl_blast_resistance = 0.3, _mcl_hardness = 0.3, }) @@ -47,23 +61,27 @@ function mcl_core.add_glass(desc, recipeitem, colorgroup, color) {'mcl_core:glass','mcl_core:glass','mcl_core:glass'}, } }) + + if mod_doc and color ~= canonical_color then + doc.add_entry_alias("nodes", "mcl_core:glass_"..canonical_color, "nodes", "mcl_core:glass_"..color) + end + end ---- colored glass -mcl_core.add_glass( "Red Stained Glass", "mcl_dye:red", "basecolor_red", "red") -mcl_core.add_glass( "Green Stained Glass", "mcl_dye:dark_green", "unicolor_dark_green", "green") -mcl_core.add_glass( "Blue Stained Glass", "mcl_dye:blue", "basecolor_blue", "blue") -mcl_core.add_glass( "Light Blue Stained Glass", "mcl_dye:lightblue", "unicolor_light_blue", "light_blue") -mcl_core.add_glass( "Black Stained Glass", "mcl_dye:black", "basecolor_black", "black") -mcl_core.add_glass( "White Stained Glass", "mcl_dye:white", "basecolor_white", "white") -mcl_core.add_glass( "Yellow Stained Glass", "mcl_dye:yellow", "basecolor_yellow", "yellow") -mcl_core.add_glass( "Brown Stained Glass", "mcl_dye:brown", "unicolor_dark_orange", "brown") -mcl_core.add_glass( "Orange Stained Glass", "mcl_dye:orange", "excolor_orange", "orange") -mcl_core.add_glass( "Pink Stained Glass", "mcl_dye:pink", "unicolor_light_red", "pink") -mcl_core.add_glass( "Grey Stained Glass", "mcl_dye:dark_grey", "unicolor_darkgrey", "gray") -mcl_core.add_glass( "Lime Stained Glass", "mcl_dye:green", "basecolor_green", "lime") -mcl_core.add_glass( "Light Grey Stained Glass", "mcl_dye:grey", "basecolor_grey", "silver") -mcl_core.add_glass( "Magenta Stained Glass", "mcl_dye:magenta", "basecolor_magenta", "magenta") -mcl_core.add_glass( "Purple Stained Glass", "mcl_dye:violet", "excolor_violet", "purple") -mcl_core.add_glass( "Cyan Stained Glass", "mcl_dye:cyan", "basecolor_cyan", "cyan") - +mcl_core.add_stained_glass( S("Red Stained Glass"), "mcl_dye:red", "basecolor_red", "red") +mcl_core.add_stained_glass( S("Green Stained Glass"), "mcl_dye:dark_green", "unicolor_dark_green", "green") +mcl_core.add_stained_glass( S("Blue Stained Glass"), "mcl_dye:blue", "basecolor_blue", "blue") +mcl_core.add_stained_glass( S("Light Blue Stained Glass"), "mcl_dye:lightblue", "unicolor_light_blue", "light_blue") +mcl_core.add_stained_glass( S("Black Stained Glass"), "mcl_dye:black", "basecolor_black", "black") +mcl_core.add_stained_glass( S("White Stained Glass"), "mcl_dye:white", "basecolor_white", "white") +mcl_core.add_stained_glass( S("Yellow Stained Glass"), "mcl_dye:yellow", "basecolor_yellow", "yellow") +mcl_core.add_stained_glass( S("Brown Stained Glass"), "mcl_dye:brown", "unicolor_dark_orange", "brown") +mcl_core.add_stained_glass( S("Orange Stained Glass"), "mcl_dye:orange", "excolor_orange", "orange") +mcl_core.add_stained_glass( S("Pink Stained Glass"), "mcl_dye:pink", "unicolor_light_red", "pink") +mcl_core.add_stained_glass( S("Grey Stained Glass"), "mcl_dye:dark_grey", "unicolor_darkgrey", "gray") +mcl_core.add_stained_glass( S("Lime Stained Glass"), "mcl_dye:green", "basecolor_green", "lime") +mcl_core.add_stained_glass( S("Light Grey Stained Glass"), "mcl_dye:grey", "basecolor_grey", "silver") +mcl_core.add_stained_glass( S("Magenta Stained Glass"), "mcl_dye:magenta", "basecolor_magenta", "magenta") +mcl_core.add_stained_glass( S("Purple Stained Glass"), "mcl_dye:violet", "excolor_violet", "purple") +mcl_core.add_stained_glass( S("Cyan Stained Glass"), "mcl_dye:cyan", "basecolor_cyan", "cyan") diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 6a150e71..ac938c80 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -1,11 +1,21 @@ -- Liquids: Water and lava +local S = minetest.get_translator("mcl_core") +local N = function(s) return s end + local WATER_ALPHA = 179 local WATER_VISC = 1 local LAVA_VISC = 7 +local lava_death_messages = { + N("@1 melted in lava."), + N("@1 took a bath in a hot lava tub."), + N("@1 died in lava."), + N("@1 could not survive in lava."), +} + minetest.register_node("mcl_core:water_flowing", { - description = "Flowing Water", + description = S("Flowing Water"), _doc_items_create_entry = false, wield_image = "default_water_flowing_animated.png^[verticalframe:64:0", drawtype = "flowingliquid", @@ -18,11 +28,11 @@ minetest.register_node("mcl_core:water_flowing", { }, { image="default_water_flowing_animated.png", - backface_culling=true, + backface_culling=false, animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} }, }, - sounds = mcl_sounds.node_sound_water_defaults(table), + sounds = mcl_sounds.node_sound_water_defaults(), alpha = WATER_ALPHA, paramtype = "light", paramtype2 = "flowingliquid", @@ -37,22 +47,22 @@ minetest.register_node("mcl_core:water_flowing", { liquid_alternative_source = "mcl_core:water_source", liquid_viscosity = WATER_VISC, liquid_range = 7, - post_effect_color = {a=192, r=0x03, g=0x3C, b=0x5C}, + post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, freezes=1, melt_around=1, dig_by_piston=1}, - _mcl_blast_resistance = 500, + _mcl_blast_resistance = 100, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode _mcl_hardness = -1, }) minetest.register_node("mcl_core:water_source", { - description = "Still Water", - _doc_items_entry_name = "Water", + description = S("Water Source"), + _doc_items_entry_name = S("Water"), _doc_items_longdesc = -[[Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time. -Water interacts with lava in various ways: -• When water is directly above or horizontally next to still lava, the lava turns into obsidian. -• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone. -• When water is directly below lava, the water turns into stone.]], +S("Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.").."\n\n".. +S("Water interacts with lava in various ways:").."\n".. +S("• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.").."\n".. +S("• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.").."\n".. +S("• When water is directly below lava, the water turns into stone."), _doc_items_hidden = false, drawtype = "liquid", tiles = { @@ -66,7 +76,7 @@ Water interacts with lava in various ways: backface_culling = false, } }, - sounds = mcl_sounds.node_sound_water_defaults(table), + sounds = mcl_sounds.node_sound_water_defaults(), alpha = WATER_ALPHA, paramtype = "light", walkable = false, @@ -80,16 +90,16 @@ Water interacts with lava in various ways: liquid_alternative_source = "mcl_core:water_source", liquid_viscosity = WATER_VISC, liquid_range = 7, - post_effect_color = {a=192, r=0x03, g=0x3C, b=0x5C}, + post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, stack_max = 64, groups = { water=3, liquid=3, puts_out_fire=1, freezes=1, not_in_creative_inventory=1, dig_by_piston=1}, - _mcl_blast_resistance = 500, + _mcl_blast_resistance = 100, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode _mcl_hardness = -1, }) minetest.register_node("mcl_core:lava_flowing", { - description = "Flowing Lava", + description = S("Flowing Lava"), _doc_items_create_entry = false, wield_image = "default_lava_flowing_animated.png^[verticalframe:64:0", drawtype = "flowingliquid", @@ -102,15 +112,14 @@ minetest.register_node("mcl_core:lava_flowing", { }, { image="default_lava_flowing_animated.png", - backface_culling=true, + backface_culling=false, animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=6.6} }, }, paramtype = "light", - sunlight_propagates = true, paramtype2 = "flowingliquid", - -- Real light level: 15 (but Minetest caps at 14) - light_source = 14, + light_source = minetest.LIGHT_MAX, + sounds = mcl_sounds.node_sound_lava_defaults(), walkable = false, pointable = false, diggable = false, @@ -127,23 +136,32 @@ minetest.register_node("mcl_core:lava_flowing", { liquid_renewable = false, liquid_range = 3, damage_per_second = 4*2, + _mcl_node_death_message = lava_death_messages, post_effect_color = {a=255, r=208, g=73, b=10}, groups = { lava=3, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1}, - _mcl_blast_resistance = 500, + _mcl_blast_resistance = 100, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode _mcl_hardness = -1, }) +local fire_text +local fire_enabled = minetest.settings:get_bool("enable_fire", true) +if fire_enabled then + fire_text = S("A lava source sets fire to a couple of air blocks above when they're next to a flammable block.") +else + fire_text = "" +end + minetest.register_node("mcl_core:lava_source", { - description = "Still Lava", + description = S("Lava Source"), _doc_items_entry_name = "Lava", _doc_items_longdesc = -[[Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out. -Still lava sets fire to a couple of air blocks above when they're next to a flammable block. -Lava interacts with water various ways: -• When still lava is directly below or horizontally next to water, the lava turns into obsidian. -• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone. -• When lava is directly above water, the water turns into stone.]], +S("Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.").."\n".. +fire_text.."\n\n".. +S("Lava interacts with water various ways:").."\n".. +S("• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.").."\n".. +S("• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.").."\n".. +S("• When lava is directly above water, the water turns into stone."), drawtype = "liquid", tiles = { {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} @@ -157,9 +175,8 @@ Lava interacts with water various ways: } }, paramtype = "light", - sunlight_propagates = true, - -- Real light level: 15 (but Minetest caps at 14) - light_source = 14, + light_source = minetest.LIGHT_MAX, + sounds = mcl_sounds.node_sound_lava_defaults(), walkable = false, pointable = false, diggable = false, @@ -173,10 +190,11 @@ Lava interacts with water various ways: liquid_renewable = false, liquid_range = 3, damage_per_second = 4*2, + _mcl_node_death_message = lava_death_messages, post_effect_color = {a=255, r=208, g=73, b=10}, stack_max = 64, groups = { lava=3, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1}, - _mcl_blast_resistance = 500, + _mcl_blast_resistance = 100, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode _mcl_hardness = -1, }) diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index 81274a49..ca97c2aa 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -1,21 +1,29 @@ -- Other nodes +local S = minetest.get_translator("mcl_core") + +local mod_screwdriver = minetest.get_modpath("screwdriver") ~= nil +local on_rotate +if mod_screwdriver then + on_rotate = screwdriver.rotate_3way +end minetest.register_node("mcl_core:bone_block", { - description = "Bone Block", - _doc_items_longdesc = "Bone blocks are decorational blocks and a compact storage of bone meal.", + description = S("Bone Block"), + _doc_items_longdesc = S("Bone blocks are decorative blocks and a compact storage of bone meal."), tiles = {"mcl_core_bone_block_top.png", "mcl_core_bone_block_top.png", "mcl_core_bone_block_side.png"}, is_ground_content = false, paramtype2 = "facedir", on_place = mcl_util.rotate_axis, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 10, + on_rotate = on_rotate, + _mcl_blast_resistance = 2, _mcl_hardness = 2, }) minetest.register_node("mcl_core:slimeblock", { - description = "Slime Block", - _doc_items_longdesc = "Slime blocks are very bouncy and prevent fall damage.", + description = S("Slime Block"), + _doc_items_longdesc = S("Slime blocks are very bouncy and prevent fall damage."), drawtype = "nodebox", paramtype = "light", is_ground_content = false, @@ -26,10 +34,12 @@ minetest.register_node("mcl_core:slimeblock", { {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, } }, + selection_box = { + type = "regular", + }, tiles = {"mcl_core_slime.png"}, paramtype = "light", use_texture_alpha = true, - sunlight_propagates = true, stack_max = 64, -- According to Minecraft Wiki, bouncing off a slime block from a height off 255 blocks should result in a bounce height of 50 blocks -- bouncy=44 makes the player bounce up to 49.6. This value was chosen by experiment. @@ -45,8 +55,9 @@ minetest.register_node("mcl_core:slimeblock", { }) minetest.register_node("mcl_core:cobweb", { - description = "Cobweb", - _doc_items_longdesc = "Cobwebs can be walked through, but significantly slow you down.", + description = S("Cobweb"), + _tt_help = S("Slows down movement"), + _doc_items_longdesc = S("Cobwebs can be walked through, but significantly slow you down."), drawtype = "plantlike", paramtype2 = "degrotate", visual_scale = 1.1, @@ -54,7 +65,6 @@ minetest.register_node("mcl_core:cobweb", { tiles = {"mcl_core_web.png"}, inventory_image = "mcl_core_web.png", paramtype = "light", - sunlight_propagates = true, liquid_viscosity = 14, liquidtype = "source", liquid_alternative_flowing = "mcl_core:cobweb", @@ -62,20 +72,21 @@ minetest.register_node("mcl_core:cobweb", { liquid_renewable = false, liquid_range = 0, walkable = false, - groups = {swordy_cobweb=1,shearsy=1, deco_block=1, dig_by_piston=1, dig_by_water=1,destroy_by_lava_flow=1,}, + groups = {swordy_cobweb=1,shearsy=1, fake_liquid=1, disable_jump=1, deco_block=1, dig_by_piston=1, dig_by_water=1,destroy_by_lava_flow=1,}, drop = "mcl_mobitems:string", _mcl_shears_drop = true, sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 20, + _mcl_blast_resistance = 4, _mcl_hardness = 4, }) minetest.register_node("mcl_core:deadbush", { - description = "Dead Bush", - _doc_items_longdesc = "Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.", + description = S("Dead Bush"), + _doc_items_longdesc = S("Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks."), _doc_items_hidden = false, drawtype = "plantlike", + waving = 1, visual_scale = 1.0, tiles = {"default_dry_shrub.png"}, inventory_image = "default_dry_shrub.png", @@ -85,7 +96,7 @@ minetest.register_node("mcl_core:deadbush", { walkable = false, stack_max = 64, buildable_to = true, - groups = {dig_immediate=3, flammable=3,attached_node=1,plant=1,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1}, + groups = {handy=1,shearsy=1, flammable=3,attached_node=1,plant=1,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1, fire_encouragement=60, fire_flammability=100}, drop = { max_items = 1, items = { @@ -103,16 +114,16 @@ minetest.register_node("mcl_core:deadbush", { sounds = mcl_sounds.node_sound_leaves_defaults(), selection_box = { type = "fixed", - fixed = {-6/16, -8/16, -6/16, 6/16, 8/16, 6/16}, + fixed = {-5/16, -8/16, -5/16, 5/16, 1/16, 5/16}, }, _mcl_blast_resistance = 0, _mcl_hardness = 0, }) minetest.register_node("mcl_core:barrier", { - description = "Barrier", - _doc_items_longdesc = "Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.", - _doc_items_usagehelp = "When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.", + description = S("Barrier"), + _doc_items_longdesc = S("Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block."), + _doc_items_usagehelp = S("When you hold a barrier in hand, you reveal all placed barriers in a short distance around you."), drawtype = "airlike", paramtype = "light", inventory_image = "mcl_core_barrier.png", @@ -124,7 +135,7 @@ minetest.register_node("mcl_core:barrier", { groups = {creative_breakable=1, not_in_creative_inventory = 1, not_solid = 1 }, on_blast = function() end, drop = "", - _mcl_blast_resistance = 18000003, + _mcl_blast_resistance = 36000008, _mcl_hardness = -1, after_place_node = function (pos, placer, itemstack, pointed_thing) if placer == nil then @@ -135,9 +146,32 @@ minetest.register_node("mcl_core:barrier", { expirationtime = 1, size = 8, texture = "mcl_core_barrier.png", + glow = 14, playername = placer:get_player_name() }) end, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if placer and not placer: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, placer, itemstack) or itemstack + end + end + + local name = placer:get_player_name() + local privs = minetest.get_player_privs(name) + if not privs.maphack then + minetest.chat_send_player(name, "Placement denied. You need the “maphack” privilege to place barriers.") + return itemstack + end + local new_itemstack = minetest.item_place(itemstack, placer, pointed_thing) + return new_itemstack + end, }) -- Same as barrier, but non-pointable. This node is only to be used internally to separate realms. @@ -145,7 +179,7 @@ minetest.register_node("mcl_core:barrier", { -- This node only exists because Minetest does not have support for “dimensions” yet and needs to -- be removed when support for this is implemented. minetest.register_node("mcl_core:realm_barrier", { - description = "Realm Barrier", + description = S("Realm Barrier"), _doc_items_create_entry = false, drawtype = "airlike", paramtype = "light", @@ -153,18 +187,20 @@ minetest.register_node("mcl_core:realm_barrier", { wield_image = "mcl_core_barrier.png^[colorize:#FF00FF:127^[transformFX", tiles = { "blank.png" }, stack_max = 64, + -- To avoid players getting stuck forever between realms + damage_per_second = 8, sunlight_propagates = true, is_ground_content = false, pointable = false, groups = {not_in_creative_inventory = 1, not_solid = 1 }, on_blast = function() end, drop = "", - _mcl_blast_resistance = 18000003, + _mcl_blast_resistance = 36000008, _mcl_hardness = -1, -- Prevent placement to protect player from screwing up the world, because the node is not pointable and hard to get rid of. node_placement_prediction = "", on_place = function(pos, placer, itemstack, pointed_thing) - minetest.chat_send_player(placer:get_player_name(), core.colorize("#FF0000", "You can't just place a realm barrier by hand!")) + minetest.chat_send_player(placer:get_player_name(), minetest.colorize("#FF0000", "You can't just place a realm barrier by hand!")) return end, }) @@ -176,7 +212,7 @@ minetest.register_node("mcl_core:realm_barrier", { -- The void does not exist as a block in Minecraft but we register it as a -- block here to make things easier for us. minetest.register_node("mcl_core:void", { - description = "Void", + description = S("Void"), _doc_items_create_entry = false, drawtype = "airlike", paramtype = "light", @@ -194,7 +230,7 @@ minetest.register_node("mcl_core:void", { -- Prevent placement to protect player from screwing up the world, because the node is not pointable and hard to get rid of. node_placement_prediction = "", on_place = function(pos, placer, itemstack, pointed_thing) - minetest.chat_send_player(placer:get_player_name(), core.colorize("#FF0000", "You can't just place the void by hand!")) + minetest.chat_send_player(placer:get_player_name(), minetest.colorize("#FF0000", "You can't just place the void by hand!")) return end, drop = "", diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index 7dd29b0b..8955ff64 100644 --- a/mods/ITEMS/mcl_core/nodes_trees.lua +++ b/mods/ITEMS/mcl_core/nodes_trees.lua @@ -1,20 +1,50 @@ -- Tree nodes: Wood, Wooden Planks, Sapling, Leaves +local S = minetest.get_translator("mcl_core") -local register_tree_trunk = function(subname, description, longdesc, tiles, after_dig_node) +local mod_screwdriver = minetest.get_modpath("screwdriver") ~= nil +local on_rotate +if mod_screwdriver then + on_rotate = screwdriver.rotate_3way +end + +-- Register tree trunk (wood) and bark +local register_tree_trunk = function(subname, description_trunk, description_bark, longdesc, tile_inner, tile_bark) minetest.register_node("mcl_core:"..subname, { - description = description, + description = description_trunk, _doc_items_longdesc = longdesc, _doc_items_hidden = false, - tiles = tiles, + tiles = {tile_inner, tile_inner, tile_bark}, paramtype2 = "facedir", on_place = mcl_util.rotate_axis, stack_max = 64, - groups = {handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1}, + groups = {handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, + on_rotate = on_rotate, + _mcl_blast_resistance = 2, _mcl_hardness = 2, + }) - after_dig_node = after_dig_node, + minetest.register_node("mcl_core:"..subname.."_bark", { + description = description_bark, + _doc_items_longdesc = S("This is a decorative block surrounded by the bark of a tree trunk."), + tiles = {tile_bark}, + paramtype2 = "facedir", + on_place = mcl_util.rotate_axis, + stack_max = 64, + groups = {handy=1,axey=1, bark=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = mcl_sounds.node_sound_wood_defaults(), + is_ground_content = false, + on_rotate = on_rotate, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + }) + + minetest.register_craft({ + output = "mcl_core:"..subname.."_bark 3", + recipe = { + { "mcl_core:"..subname, "mcl_core:"..subname }, + { "mcl_core:"..subname, "mcl_core:"..subname }, + } }) end @@ -26,15 +56,18 @@ local register_wooden_planks = function(subname, description, tiles) tiles = tiles, stack_max = 64, is_ground_content = false, - groups = {handy=1,axey=1, flammable=3,wood=1,building_block=1, material_wood=1}, + groups = {handy=1,axey=1, flammable=3,wood=1,building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 2, }) end -local register_leaves = function(subname, description, longdesc, tiles, drop1, drop1_rarity, drop2, drop2_rarity) - local drops +local register_leaves = function(subname, description, longdesc, tiles, drop1, drop1_rarity, drop2, drop2_rarity, leafdecay_distance) + local drop + if leafdecay_distance == nil then + leafdecay_distance = 4 + end if drop2 then drop = { max_items = 1, @@ -66,25 +99,28 @@ local register_leaves = function(subname, description, longdesc, tiles, drop1, d _doc_items_longdesc = longdesc, _doc_items_hidden = false, drawtype = "allfaces_optional", + waving = 2, place_param2 = 1, -- Prevent leafdecay for placed nodes tiles = tiles, paramtype = "light", stack_max = 64, - groups = {handy=1,shearsy=1,swordy=1, leafdecay=4, flammable=2, leaves=1, deco_block=1, dig_by_piston=1}, + groups = {handy=1,shearsy=1,swordy=1, leafdecay=leafdecay_distance, flammable=2, leaves=1, deco_block=1, dig_by_piston=1, fire_encouragement=30, fire_flammability=60}, drop = drop, _mcl_shears_drop = true, sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 1, + _mcl_blast_resistance = 0.2, _mcl_hardness = 0.2, }) end -local register_sapling = function(subname, description, longdesc, texture, selbox) +local register_sapling = function(subname, description, longdesc, tt_help, texture, selbox) minetest.register_node("mcl_core:"..subname, { description = description, + _tt_help = tt_help, _doc_items_longdesc = longdesc, _doc_items_hidden = false, drawtype = "plantlike", + waving = 1, visual_scale = 1.0, tiles = {texture}, inventory_image = texture, @@ -97,7 +133,7 @@ local register_sapling = function(subname, description, longdesc, texture, selbo fixed = selbox }, stack_max = 64, - groups = {dig_immediate=3, plant=1,sapling=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1}, + groups = {dig_immediate=3, plant=1,sapling=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -107,7 +143,7 @@ local register_sapling = function(subname, description, longdesc, texture, selbo 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 (nn=="mcl_core:dirt_with_grass" or nn=="mcl_core:dirt_with_grass_snow" or + return ((minetest.get_item_group(nn, "grass_block") == 1) or nn=="mcl_core:podzol" or nn=="mcl_core:podzol_snow" or nn=="mcl_core:dirt") end), @@ -119,61 +155,53 @@ end --------------------- --- This is a bad bad workaround which is only done because cocoas are not wallmounted (but should) --- As long cocoas only EVER stick to jungle trees, and nothing else, this is probably a lesser sin. -local jungle_tree_after_dig_node = function(pos, oldnode, oldmetadata, digger) - -- Drop attached cocoas - local posses = { - { x = pos.x + 1, y = pos.y, z = pos.z }, - { x = pos.x - 1, y = pos.y, z = pos.z }, - { x = pos.x, y = pos.y, z = pos.z + 1 }, - { x = pos.x, y = pos.y, z = pos.z - 1 }, - } - for p=1, #posses do - local node = minetest.get_node(posses[p]) - local g = minetest.get_item_group(node.name, "cocoa") - if g and g >= 1 then - minetest.remove_node(posses[p]) - local drops = minetest.get_node_drops(node.name, "") - for d=1, #drops do - minetest.add_item(posses[p], drops[d]) - end - end - end -end +register_tree_trunk("tree", S("Oak Wood"), S("Oak Bark"), S("The trunk of an oak tree."), "default_tree_top.png", "default_tree.png") +register_tree_trunk("darktree", S("Dark Oak Wood"), S("Dark Oak Bark"), S("The trunk of a dark oak tree."), "mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak.png") +register_tree_trunk("acaciatree", S("Acacia Wood"), S("Acacia Bark"), S("The trunk of an acacia."), "default_acacia_tree_top.png", "default_acacia_tree.png") +register_tree_trunk("sprucetree", S("Spruce Wood"), S("Spruce Bark"), S("The trunk of a spruce tree."), "mcl_core_log_spruce_top.png", "mcl_core_log_spruce.png") +register_tree_trunk("birchtree", S("Birch Wood"), S("Birch Bark"), S("The trunk of a birch tree."), "mcl_core_log_birch_top.png", "mcl_core_log_birch.png") +register_tree_trunk("jungletree", S("Jungle Wood"), S("Jungle Bark"), S("The trunk of a jungle tree."), "default_jungletree_top.png", "default_jungletree.png") -register_tree_trunk("tree", "Oak Wood", "The trunk of an oak tree.", {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}) -register_tree_trunk("darktree", "Dark Oak Wood", "The trunk of a dark oak tree.", {"mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak.png"}) -register_tree_trunk("acaciatree", "Acacia Wood", "The trunk of an acacia.", {"default_acacia_tree_top.png", "default_acacia_tree_top.png", "default_acacia_tree.png"}) -register_tree_trunk("darktree", "Dark Oak Wood", "The trunk of a dark oak tree.", {"mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak.png"}) -register_tree_trunk("sprucetree", "Spruce Wood", "The trunk of a spruce tree.", {"mcl_core_log_spruce_top.png", "mcl_core_log_spruce_top.png", "mcl_core_log_spruce.png"}) -register_tree_trunk("birchtree", "Birch Wood", "The trunk of a birch tree.", {"mcl_core_log_birch_top.png", "mcl_core_log_birch_top.png", "mcl_core_log_birch.png"}) - -register_tree_trunk("jungletree", "Jungle Wood", "The trunk of a jungle tree.", {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, jungle_tree_after_dig_node) +register_wooden_planks("wood", S("Oak Wood Planks"), {"default_wood.png"}) +register_wooden_planks("darkwood", S("Dark Oak Wood Planks"), {"mcl_core_planks_big_oak.png"}) +register_wooden_planks("junglewood", S("Jungle Wood Planks"), {"default_junglewood.png"}) +register_wooden_planks("sprucewood", S("Spruce Wood Planks"), {"mcl_core_planks_spruce.png"}) +register_wooden_planks("acaciawood", S("Acacia Wood Planks"), {"default_acacia_wood.png"}) +register_wooden_planks("birchwood", S("Birch Wood Planks"), {"mcl_core_planks_birch.png"}) -register_wooden_planks("wood", "Oak Wood Planks", {"default_wood.png"}) -register_wooden_planks("darkwood", "Dark Oak Wood Planks", {"mcl_core_planks_big_oak.png"}) -register_wooden_planks("junglewood", "Jungle Wood Planks", {"default_junglewood.png"}) -register_wooden_planks("sprucewood", "Spruce Wood Planks", {"mcl_core_planks_spruce.png"}) -register_wooden_planks("acaciawood", "Acacia Wood Planks", {"default_acacia_wood.png"}) -register_wooden_planks("birchwood", "Birch Wood Planks", {"mcl_core_planks_birch.png"}) +register_sapling("sapling", S("Oak Sapling"), + S("When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time."), + S("Needs soil and light to grow"), + "default_sapling.png", {-5/16, -0.5, -5/16, 5/16, 0.5, 5/16}) +register_sapling("darksapling", S("Dark Oak Sapling"), + S("Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light."), + S("Needs soil and light to grow") .. "\n" .. S("2×2 saplings required"), + "mcl_core_sapling_big_oak.png", {-5/16, -0.5, -5/16, 5/16, 7/16, 5/16}) +register_sapling("junglesapling", S("Jungle Sapling"), + S("When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree."), + S("Needs soil and light to grow") .. "\n" .. S("2×2 saplings = large tree"), + "default_junglesapling.png", {-5/16, -0.5, -5/16, 5/16, 0.5, 5/16}) +register_sapling("acaciasapling", S("Acacia Sapling"), + S("When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time."), + S("Needs soil and light to grow"), + "default_acacia_sapling.png", {-5/16, -0.5, -5/16, 5/16, 4/16, 5/16}) +register_sapling("sprucesapling", S("Spruce Sapling"), + S("When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce."), + S("Needs soil and light to grow") .. "\n" .. S("2×2 saplings = large tree"), + "mcl_core_sapling_spruce.png", {-4/16, -0.5, -4/16, 4/16, 0.5, 4/16}) +register_sapling("birchsapling", S("Birch Sapling"), + S("When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time."), + S("Needs soil and light to grow"), + "mcl_core_sapling_birch.png", {-4/16, -0.5, -4/16, 4/16, 0.5, 4/16}) -register_sapling("sapling", "Oak Sapling", "When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak tree after some time. If the tree can't grow because of darkness, the sapling will uproot.", "default_sapling.png", {-6/16, -0.5, -6/16, 6/16, 0.5, 6/16}) -register_sapling("darksapling", "Dark Oak Sapling", "When placed on soil (such as dirt) and exposed to light, a dark oak sapling will grow into a dark oak tree after some time. If the tree can't grow because of darkness, the sapling will uproot.", "mcl_core_sapling_big_oak.png", {-5.5/16, -0.5, -5.5/16, 5.5/16, 0.5, 5.5/16}) -register_sapling("junglesapling", "Jungle Sapling", "When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. If the tree can't grow because of darkness, the sapling will uproot.", "default_junglesapling.png", {-4/16, -0.5, -4/16, 4/16, 0.5, 4/16}) -register_sapling("acaciasapling", "Acacia Sapling", "When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia tree after some time. If the tree can't grow because of darkness, the sapling will uproot.", "default_acacia_sapling.png", {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}) -register_sapling("sprucesapling", "Spruce Sapling", "When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce tree after some time. If the tree can't grow because of darkness, the sapling will uproot.", "mcl_core_sapling_spruce.png", {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}) -register_sapling("birchsapling", "Birch Sapling", "When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch tree after some time. If the tree can't grow because of darkness, the sapling will uproot.", "mcl_core_sapling_birch.png", {-6/16, -0.5, -6/16, 6/16, 0.5, 6/16}) - - -register_leaves("leaves", "Oak Leaves", "Oak leaves are grown from oak trees.", {"default_leaves.png"}, "mcl_core:sapling", 20, "mcl_core:apple", 200) -register_leaves("darkleaves", "Dark Oak Leaves", "Dark oak leaves are grown from dark oak trees.", {"mcl_core_leaves_big_oak.png"}, "mcl_core:darksapling", 20, "mcl_core:apple", 200) -register_leaves("jungleleaves", "Jungle Leaves", "Jungle leaves are grown from jungle trees.", {"default_jungleleaves.png"}, "mcl_core:junglesapling", 40) -register_leaves("acacialeaves", "Acacia Leaves", "Acacia leaves are grown from acacia trees.", {"default_acacia_leaves.png"}, "mcl_core:acaciasapling", 20) -register_leaves("spruceleaves", "Spruce Leaves", "Spruce leaves are grown from spruce trees.", {"mcl_core_leaves_spruce.png"}, "mcl_core:sprucesapling", 20) -register_leaves("birchleaves", "Birch Leaves", "Birch leaves are grown from birch trees.", {"mcl_core_leaves_birch.png"}, "mcl_core:birchsapling", 20) +register_leaves("leaves", S("Oak Leaves"), S("Oak leaves are grown from oak trees."), {"default_leaves.png"}, "mcl_core:sapling", 20, "mcl_core:apple", 200) +register_leaves("darkleaves", S("Dark Oak Leaves"), S("Dark oak leaves are grown from dark oak trees."), {"mcl_core_leaves_big_oak.png"}, "mcl_core:darksapling", 20, "mcl_core:apple", 200) +register_leaves("jungleleaves", S("Jungle Leaves"), S("Jungle leaves are grown from jungle trees."), {"default_jungleleaves.png"}, "mcl_core:junglesapling", 40) +register_leaves("acacialeaves", S("Acacia Leaves"), S("Acacia leaves are grown from acacia trees."), {"default_acacia_leaves.png"}, "mcl_core:acaciasapling", 20) +register_leaves("spruceleaves", S("Spruce Leaves"), S("Spruce leaves are grown from spruce trees."), {"mcl_core_leaves_spruce.png"}, "mcl_core:sprucesapling", 20) +register_leaves("birchleaves", S("Birch Leaves"), S("Birch leaves are grown from birch trees."), {"mcl_core_leaves_birch.png"}, "mcl_core:birchsapling", 20) -- Node aliases diff --git a/mods/ITEMS/mcl_core/schematics/acacia_log.mts b/mods/ITEMS/mcl_core/schematics/acacia_log.mts deleted file mode 100644 index 037bca8c..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/acacia_log.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/acacia_tree.mts b/mods/ITEMS/mcl_core/schematics/acacia_tree.mts deleted file mode 100644 index 4732ade3..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/acacia_tree.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/acacia_tree_from_sapling.mts b/mods/ITEMS/mcl_core/schematics/acacia_tree_from_sapling.mts deleted file mode 100644 index 23e8e4b3..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/acacia_tree_from_sapling.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/apple_log.mts b/mods/ITEMS/mcl_core/schematics/apple_log.mts deleted file mode 100644 index e7ee8f2b..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/apple_log.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/apple_tree.mts b/mods/ITEMS/mcl_core/schematics/apple_tree.mts deleted file mode 100644 index 2bd57c1f..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/apple_tree.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/aspen_log.mts b/mods/ITEMS/mcl_core/schematics/aspen_log.mts deleted file mode 100644 index 180e6fd1..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/aspen_log.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/aspen_tree.mts b/mods/ITEMS/mcl_core/schematics/aspen_tree.mts deleted file mode 100644 index 429a831c..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/aspen_tree.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/jungle_log.mts b/mods/ITEMS/mcl_core/schematics/jungle_log.mts deleted file mode 100644 index 54fa16d1..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/jungle_log.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/jungle_tree.mts b/mods/ITEMS/mcl_core/schematics/jungle_tree.mts deleted file mode 100644 index 01a1b11a..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/jungle_tree.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_1.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_1.mts new file mode 100644 index 00000000..8685bc85 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_1.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_2.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_2.mts new file mode 100644 index 00000000..2d90ba23 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_2.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_3.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_3.mts new file mode 100644 index 00000000..38831c3c Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_3.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_4.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_4.mts new file mode 100644 index 00000000..d3c98b43 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_4.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_5.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_5.mts new file mode 100644 index 00000000..8c709f73 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_5.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_6.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_6.mts new file mode 100644 index 00000000..8a63cf18 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_6.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_7.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_7.mts new file mode 100644 index 00000000..2ffc78d4 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_7.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_weirdo.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_weirdo.mts new file mode 100644 index 00000000..63b0c35e Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_acacia_weirdo.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_birch.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_birch.mts new file mode 100644 index 00000000..fc511a09 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_birch.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_birch_tall.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_birch_tall.mts new file mode 100644 index 00000000..1c39cd2a Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_birch_tall.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_dark_oak.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_dark_oak.mts new file mode 100644 index 00000000..de1121e6 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_dark_oak.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_bush_oak_leaves.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_bush_oak_leaves.mts new file mode 100644 index 00000000..89400186 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_bush_oak_leaves.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_tree.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_tree.mts new file mode 100644 index 00000000..c015d242 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_tree.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_tree_huge_1.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_tree_huge_1.mts new file mode 100644 index 00000000..ba4f9fa2 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_tree_huge_1.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_tree_huge_2.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_tree_huge_2.mts new file mode 100644 index 00000000..df0114f6 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_tree_huge_2.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_balloon.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_balloon.mts new file mode 100644 index 00000000..bcbd9bea Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_balloon.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_classic.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_classic.mts new file mode 100644 index 00000000..295ef93e Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_classic.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_1.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_1.mts new file mode 100644 index 00000000..4dc11896 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_1.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_2.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_2.mts new file mode 100644 index 00000000..8e859e3d Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_2.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_3.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_3.mts new file mode 100644 index 00000000..bddcaefd Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_3.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_4.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_4.mts new file mode 100644 index 00000000..b1bc17ac Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_4.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_swamp.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_swamp.mts new file mode 100644 index 00000000..3308dba4 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_swamp.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_v6.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_v6.mts new file mode 100644 index 00000000..4c9e0994 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_v6.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_1.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_1.mts new file mode 100644 index 00000000..f16034c1 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_1.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_2.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_2.mts new file mode 100644 index 00000000..299cee00 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_2.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_3.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_3.mts new file mode 100644 index 00000000..9a70debf Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_3.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_4.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_4.mts new file mode 100644 index 00000000..95d8e84a Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_4.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_5.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_5.mts new file mode 100644 index 00000000..bc0512f8 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_5.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_1.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_1.mts new file mode 100644 index 00000000..d78e2fa6 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_1.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_2.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_2.mts new file mode 100644 index 00000000..2ffb6c6c Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_2.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_3.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_3.mts new file mode 100644 index 00000000..d3b80b19 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_3.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_4.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_4.mts new file mode 100644 index 00000000..538b96d6 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_4.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_up_1.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_up_1.mts new file mode 100644 index 00000000..02bf912c Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_up_1.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_up_2.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_up_2.mts new file mode 100644 index 00000000..fc4b91f2 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_up_2.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_up_3.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_up_3.mts new file mode 100644 index 00000000..55a9a5ff Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_up_3.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_lollipop.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_lollipop.mts new file mode 100644 index 00000000..46d01e0b Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_lollipop.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_matchstick.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_matchstick.mts new file mode 100644 index 00000000..69ac616a Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_matchstick.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_tall.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_tall.mts new file mode 100644 index 00000000..ef219014 Binary files /dev/null and b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_tall.mts differ diff --git a/mods/ITEMS/mcl_core/schematics/pine_log.mts b/mods/ITEMS/mcl_core/schematics/pine_log.mts deleted file mode 100644 index 744c38b0..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/pine_log.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/schematics/pine_tree.mts b/mods/ITEMS/mcl_core/schematics/pine_tree.mts deleted file mode 100644 index 6f27d839..00000000 Binary files a/mods/ITEMS/mcl_core/schematics/pine_tree.mts and /dev/null differ diff --git a/mods/ITEMS/mcl_core/sounds/slimenodes_dug.1.ogg b/mods/ITEMS/mcl_core/sounds/slimenodes_dug.1.ogg index 16c79285..a8bc4b2e 100644 Binary files a/mods/ITEMS/mcl_core/sounds/slimenodes_dug.1.ogg and b/mods/ITEMS/mcl_core/sounds/slimenodes_dug.1.ogg differ diff --git a/mods/ITEMS/mcl_core/sounds/slimenodes_place.1.ogg b/mods/ITEMS/mcl_core/sounds/slimenodes_place.1.ogg index 06ad53fd..b766c1e3 100644 Binary files a/mods/ITEMS/mcl_core/sounds/slimenodes_place.1.ogg and b/mods/ITEMS/mcl_core/sounds/slimenodes_place.1.ogg differ diff --git a/mods/ITEMS/mcl_core/sounds/slimenodes_step.1.ogg b/mods/ITEMS/mcl_core/sounds/slimenodes_step.1.ogg index e126f487..e32996fb 100644 Binary files a/mods/ITEMS/mcl_core/sounds/slimenodes_step.1.ogg and b/mods/ITEMS/mcl_core/sounds/slimenodes_step.1.ogg differ diff --git a/mods/ITEMS/mcl_core/sounds/slimenodes_step.2.ogg b/mods/ITEMS/mcl_core/sounds/slimenodes_step.2.ogg index a52f4060..6ad28efc 100644 Binary files a/mods/ITEMS/mcl_core/sounds/slimenodes_step.2.ogg and b/mods/ITEMS/mcl_core/sounds/slimenodes_step.2.ogg differ diff --git a/mods/ITEMS/mcl_core/sounds/slimenodes_step.3.ogg b/mods/ITEMS/mcl_core/sounds/slimenodes_step.3.ogg index 0507e005..92d6cd36 100644 Binary files a/mods/ITEMS/mcl_core/sounds/slimenodes_step.3.ogg and b/mods/ITEMS/mcl_core/sounds/slimenodes_step.3.ogg differ diff --git a/mods/ITEMS/mcl_core/sounds/slimenodes_step.4.ogg b/mods/ITEMS/mcl_core/sounds/slimenodes_step.4.ogg index 3f9d878c..47b9cd68 100644 Binary files a/mods/ITEMS/mcl_core/sounds/slimenodes_step.4.ogg and b/mods/ITEMS/mcl_core/sounds/slimenodes_step.4.ogg differ diff --git a/mods/ITEMS/mcl_core/textures/default_acacia_leaves.png b/mods/ITEMS/mcl_core/textures/default_acacia_leaves.png index a24e58f1..6d89629b 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_acacia_leaves.png and b/mods/ITEMS/mcl_core/textures/default_acacia_leaves.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_acacia_tree.png b/mods/ITEMS/mcl_core/textures/default_acacia_tree.png index 2f62228c..97ac9575 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_acacia_tree.png and b/mods/ITEMS/mcl_core/textures/default_acacia_tree.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_brick.png b/mods/ITEMS/mcl_core/textures/default_brick.png index cb57018f..ab4f5b78 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_brick.png and b/mods/ITEMS/mcl_core/textures/default_brick.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_cactus_side.png b/mods/ITEMS/mcl_core/textures/default_cactus_side.png deleted file mode 100644 index 1a75eacd..00000000 Binary files a/mods/ITEMS/mcl_core/textures/default_cactus_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_core/textures/default_cactus_top.png b/mods/ITEMS/mcl_core/textures/default_cactus_top.png deleted file mode 100644 index 988ce176..00000000 Binary files a/mods/ITEMS/mcl_core/textures/default_cactus_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_core/textures/default_clay.png b/mods/ITEMS/mcl_core/textures/default_clay.png index 63d2ff18..1e412de3 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_clay.png and b/mods/ITEMS/mcl_core/textures/default_clay.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_coal_block.png b/mods/ITEMS/mcl_core/textures/default_coal_block.png index cf357949..c99e4a58 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_coal_block.png and b/mods/ITEMS/mcl_core/textures/default_coal_block.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_cobble.png b/mods/ITEMS/mcl_core/textures/default_cobble.png index d50505e8..b1d5fe3c 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_cobble.png and b/mods/ITEMS/mcl_core/textures/default_cobble.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_dirt.png b/mods/ITEMS/mcl_core/textures/default_dirt.png index d75ca70a..1a72f2a4 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_dirt.png and b/mods/ITEMS/mcl_core/textures/default_dirt.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_dry_grass.png b/mods/ITEMS/mcl_core/textures/default_dry_grass.png new file mode 100644 index 00000000..67956f18 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/default_dry_grass.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_grass_side.png b/mods/ITEMS/mcl_core/textures/default_dry_grass_side.png similarity index 65% rename from mods/ITEMS/mcl_core/textures/default_grass_side.png rename to mods/ITEMS/mcl_core/textures/default_dry_grass_side.png index d65d050b..b12d06e7 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_grass_side.png and b/mods/ITEMS/mcl_core/textures/default_dry_grass_side.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_grass.png b/mods/ITEMS/mcl_core/textures/default_grass.png deleted file mode 100644 index c0ec1727..00000000 Binary files a/mods/ITEMS/mcl_core/textures/default_grass.png and /dev/null differ diff --git a/mods/ITEMS/mcl_core/textures/default_gravel.png b/mods/ITEMS/mcl_core/textures/default_gravel.png index 8108db71..d1934221 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_gravel.png and b/mods/ITEMS/mcl_core/textures/default_gravel.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_ice.png b/mods/ITEMS/mcl_core/textures/default_ice.png index e741bccc..71da475e 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_ice.png and b/mods/ITEMS/mcl_core/textures/default_ice.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_jungleleaves.png b/mods/ITEMS/mcl_core/textures/default_jungleleaves.png index d92a6e08..e247a16f 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_jungleleaves.png and b/mods/ITEMS/mcl_core/textures/default_jungleleaves.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_jungletree_top.png b/mods/ITEMS/mcl_core/textures/default_jungletree_top.png index a2fa3a33..1bfadcf1 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_jungletree_top.png and b/mods/ITEMS/mcl_core/textures/default_jungletree_top.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_leaves.png b/mods/ITEMS/mcl_core/textures/default_leaves.png index 7b01275f..6ef923cf 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_leaves.png and b/mods/ITEMS/mcl_core/textures/default_leaves.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_mossycobble.png b/mods/ITEMS/mcl_core/textures/default_mossycobble.png index de3ce825..7da56145 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_mossycobble.png and b/mods/ITEMS/mcl_core/textures/default_mossycobble.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_obsidian.png b/mods/ITEMS/mcl_core/textures/default_obsidian.png index 32b3371c..e212b0eb 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_obsidian.png and b/mods/ITEMS/mcl_core/textures/default_obsidian.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_paper.png b/mods/ITEMS/mcl_core/textures/default_paper.png index af90416b..0e8b1f60 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_paper.png and b/mods/ITEMS/mcl_core/textures/default_paper.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_sand.png b/mods/ITEMS/mcl_core/textures/default_sand.png index 6411f86e..e2309a53 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_sand.png and b/mods/ITEMS/mcl_core/textures/default_sand.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_stone.png b/mods/ITEMS/mcl_core/textures/default_stone.png index 8831ffb9..9e9145af 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_stone.png and b/mods/ITEMS/mcl_core/textures/default_stone.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_stone_brick.png b/mods/ITEMS/mcl_core/textures/default_stone_brick.png index 318b91b3..62a22c8d 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_stone_brick.png and b/mods/ITEMS/mcl_core/textures/default_stone_brick.png differ diff --git a/mods/ITEMS/mcl_core/textures/default_wood.png b/mods/ITEMS/mcl_core/textures/default_wood.png index ee97b8d8..aaaa2b48 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_wood.png and b/mods/ITEMS/mcl_core/textures/default_wood.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_andesite_smooth.png b/mods/ITEMS/mcl_core/textures/mcl_core_andesite_smooth.png index ff082af6..ff6915ff 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_andesite_smooth.png and b/mods/ITEMS/mcl_core/textures/mcl_core_andesite_smooth.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_apple_golden.png b/mods/ITEMS/mcl_core/textures/mcl_core_apple_golden.png index 639afd90..cfaacb02 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_apple_golden.png and b/mods/ITEMS/mcl_core/textures/mcl_core_apple_golden.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_bedrock.png b/mods/ITEMS/mcl_core/textures/mcl_core_bedrock.png index a96b21ac..baed9bb5 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_bedrock.png and b/mods/ITEMS/mcl_core/textures/mcl_core_bedrock.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_bone_block_top.png b/mods/ITEMS/mcl_core/textures/mcl_core_bone_block_top.png index 9fc994cc..7faf7b10 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_bone_block_top.png and b/mods/ITEMS/mcl_core/textures/mcl_core_bone_block_top.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_cactus_bottom.png b/mods/ITEMS/mcl_core/textures/mcl_core_cactus_bottom.png index 610a0aec..27dd1487 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_cactus_bottom.png and b/mods/ITEMS/mcl_core/textures/mcl_core_cactus_bottom.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_cactus_side.png b/mods/ITEMS/mcl_core/textures/mcl_core_cactus_side.png new file mode 100644 index 00000000..04ddc256 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_cactus_side.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_cactus_top.png b/mods/ITEMS/mcl_core/textures/mcl_core_cactus_top.png new file mode 100644 index 00000000..ddae5176 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_cactus_top.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_charcoal.png b/mods/ITEMS/mcl_core/textures/mcl_core_charcoal.png index 9e2ae284..691a02bf 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_charcoal.png and b/mods/ITEMS/mcl_core/textures/mcl_core_charcoal.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_coarse_dirt.png b/mods/ITEMS/mcl_core/textures/mcl_core_coarse_dirt.png index b564de19..efe195ef 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_coarse_dirt.png and b/mods/ITEMS/mcl_core/textures/mcl_core_coarse_dirt.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_diorite.png b/mods/ITEMS/mcl_core/textures/mcl_core_diorite.png index 86c5a890..55429961 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_diorite.png and b/mods/ITEMS/mcl_core/textures/mcl_core_diorite.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_dirt_podzol_side.png b/mods/ITEMS/mcl_core/textures/mcl_core_dirt_podzol_side.png index 25fc26b4..3a395cbc 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_dirt_podzol_side.png and b/mods/ITEMS/mcl_core/textures/mcl_core_dirt_podzol_side.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_dirt_podzol_top.png b/mods/ITEMS/mcl_core/textures/mcl_core_dirt_podzol_top.png index 71bee043..56fd114f 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_dirt_podzol_top.png and b/mods/ITEMS/mcl_core/textures/mcl_core_dirt_podzol_top.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_emerald_block.png b/mods/ITEMS/mcl_core/textures/mcl_core_emerald_block.png index c400a7bc..773c99cb 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_emerald_block.png and b/mods/ITEMS/mcl_core/textures/mcl_core_emerald_block.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_1.png b/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_1.png index fd3756eb..5a7dcaa9 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_1.png and b/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_1.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_2.png b/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_2.png index e90d8dd8..98cfa0a7 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_2.png and b/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_2.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_3.png b/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_3.png index b6b93e88..d50bc63d 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_3.png and b/mods/ITEMS/mcl_core/textures/mcl_core_frosted_ice_3.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_black.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_black.png index 1e80a111..35a9dbb7 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_black.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_black.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_blue.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_blue.png index c6bb6de0..9e0790a6 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_blue.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_blue.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_brown.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_brown.png index c965dde5..3f898ef4 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_brown.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_brown.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_cyan.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_cyan.png index 21c8f59c..24382900 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_cyan.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_cyan.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_gray.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_gray.png index 51dbaae9..70b0a435 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_gray.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_gray.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_green.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_green.png index 84ca3dac..380333dc 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_green.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_green.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_light_blue.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_light_blue.png index 646e701d..eef2edf1 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_light_blue.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_light_blue.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_lime.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_lime.png index 04f78e7c..dbf7da16 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_lime.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_lime.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_magenta.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_magenta.png index de860e02..9c7af074 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_magenta.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_magenta.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_orange.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_orange.png index 378ae681..64f93186 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_orange.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_orange.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_pink.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_pink.png index a1538f81..9f666075 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_pink.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_pink.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_purple.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_purple.png index aec21049..ea106b29 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_purple.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_purple.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_red.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_red.png index f1abb9e4..5de6aadc 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_red.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_red.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_silver.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_silver.png index 8148f82e..632c318d 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_silver.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_silver.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_white.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_white.png index 21dcb096..84aca6ee 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_white.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_white.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_yellow.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_yellow.png index 7f902fe9..58c7dacf 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_glass_yellow.png and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_yellow.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_granite.png b/mods/ITEMS/mcl_core/textures/mcl_core_granite.png index e06aebfd..23c65f36 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_granite.png and b/mods/ITEMS/mcl_core/textures/mcl_core_granite.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_grass_block_side_overlay.png b/mods/ITEMS/mcl_core/textures/mcl_core_grass_block_side_overlay.png new file mode 100644 index 00000000..14d4de64 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_grass_block_side_overlay.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_grass_block_top.png b/mods/ITEMS/mcl_core/textures/mcl_core_grass_block_top.png new file mode 100644 index 00000000..24c80203 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_grass_block_top.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_grass_path_side.png b/mods/ITEMS/mcl_core/textures/mcl_core_grass_path_side.png index 3444f4a5..ff79d8c4 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_grass_path_side.png and b/mods/ITEMS/mcl_core/textures/mcl_core_grass_path_side.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_grass_path_top.png b/mods/ITEMS/mcl_core/textures/mcl_core_grass_path_top.png index d570fbd1..7537af9a 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_grass_path_top.png and b/mods/ITEMS/mcl_core/textures/mcl_core_grass_path_top.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_grass_side_snowed.png b/mods/ITEMS/mcl_core/textures/mcl_core_grass_side_snowed.png index a8c2a2f1..dd007f8f 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_grass_side_snowed.png and b/mods/ITEMS/mcl_core/textures/mcl_core_grass_side_snowed.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_ice_packed.png b/mods/ITEMS/mcl_core/textures/mcl_core_ice_packed.png index 7623d45d..7dd7f398 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_ice_packed.png and b/mods/ITEMS/mcl_core/textures/mcl_core_ice_packed.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_iron_nugget.png b/mods/ITEMS/mcl_core/textures/mcl_core_iron_nugget.png index 6d9f6c7c..e0ae730b 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_iron_nugget.png and b/mods/ITEMS/mcl_core/textures/mcl_core_iron_nugget.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_iron_ore.png b/mods/ITEMS/mcl_core/textures/mcl_core_iron_ore.png index f83b8303..4a93ed27 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_iron_ore.png and b/mods/ITEMS/mcl_core/textures/mcl_core_iron_ore.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_lapis_ore.png b/mods/ITEMS/mcl_core/textures/mcl_core_lapis_ore.png index f4bc61c8..8ed68dbf 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_lapis_ore.png and b/mods/ITEMS/mcl_core/textures/mcl_core_lapis_ore.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_leaves_big_oak.png b/mods/ITEMS/mcl_core/textures/mcl_core_leaves_big_oak.png index 859d14ac..53e552de 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_leaves_big_oak.png and b/mods/ITEMS/mcl_core/textures/mcl_core_leaves_big_oak.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_leaves_birch.png b/mods/ITEMS/mcl_core/textures/mcl_core_leaves_birch.png index d83adabc..b4ad81d1 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_leaves_birch.png and b/mods/ITEMS/mcl_core/textures/mcl_core_leaves_birch.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_leaves_spruce.png b/mods/ITEMS/mcl_core/textures/mcl_core_leaves_spruce.png index 1407ff7e..e95b849f 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_leaves_spruce.png and b/mods/ITEMS/mcl_core/textures/mcl_core_leaves_spruce.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_log_big_oak.png b/mods/ITEMS/mcl_core/textures/mcl_core_log_big_oak.png index 9b7a85ce..978ccf56 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_log_big_oak.png and b/mods/ITEMS/mcl_core/textures/mcl_core_log_big_oak.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_log_birch.png b/mods/ITEMS/mcl_core/textures/mcl_core_log_birch.png index b53eb796..0261fd1f 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_log_birch.png and b/mods/ITEMS/mcl_core/textures/mcl_core_log_birch.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_mycelium_side.png b/mods/ITEMS/mcl_core/textures/mcl_core_mycelium_side.png index 37501ef6..bbc0710b 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_mycelium_side.png and b/mods/ITEMS/mcl_core/textures/mcl_core_mycelium_side.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_mycelium_top.png b/mods/ITEMS/mcl_core/textures/mcl_core_mycelium_top.png index fdc7b7ca..56193d07 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_mycelium_top.png and b/mods/ITEMS/mcl_core/textures/mcl_core_mycelium_top.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_palette_grass.png b/mods/ITEMS/mcl_core/textures/mcl_core_palette_grass.png new file mode 100644 index 00000000..7aee5b33 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_palette_grass.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_planks_birch.png b/mods/ITEMS/mcl_core/textures/mcl_core_planks_birch.png index ab3ae8f7..840c2c6c 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_planks_birch.png and b/mods/ITEMS/mcl_core/textures/mcl_core_planks_birch.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_red_sand.png b/mods/ITEMS/mcl_core/textures/mcl_core_red_sand.png index 4b42bd3a..1824b7d4 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_red_sand.png and b/mods/ITEMS/mcl_core/textures/mcl_core_red_sand.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_bottom.png b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_bottom.png index 0f2b5517..93825017 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_bottom.png and b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_bottom.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_carved.png b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_carved.png index 675e923a..c296256c 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_carved.png and b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_carved.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_normal.png b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_normal.png index 04475f32..19124c29 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_normal.png and b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_normal.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_smooth.png b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_smooth.png index 6e3839a0..93825017 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_smooth.png and b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_smooth.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_top.png b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_top.png index 4df752ae..dbb8548d 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_top.png and b/mods/ITEMS/mcl_core/textures/mcl_core_red_sandstone_top.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_redstone_ore.png b/mods/ITEMS/mcl_core/textures/mcl_core_redstone_ore.png index f26a9cd7..5d051bb5 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_redstone_ore.png and b/mods/ITEMS/mcl_core/textures/mcl_core_redstone_ore.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_bottom.png b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_bottom.png index b8851e24..9846dba9 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_bottom.png and b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_bottom.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_carved.png b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_carved.png index e1e7d223..bf535cd2 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_carved.png and b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_carved.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_normal.png b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_normal.png index b5bbe63e..b4e33346 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_normal.png and b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_normal.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_smooth.png b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_smooth.png index b4dc2654..9846dba9 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_smooth.png and b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_smooth.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_top.png b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_top.png index 9d75ea47..388fe08c 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_top.png and b/mods/ITEMS/mcl_core/textures/mcl_core_sandstone_top.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_slime.png b/mods/ITEMS/mcl_core/textures/mcl_core_slime.png index c913bbc2..b43f9c20 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_slime.png and b/mods/ITEMS/mcl_core/textures/mcl_core_slime.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_stonebrick_carved.png b/mods/ITEMS/mcl_core/textures/mcl_core_stonebrick_carved.png index 9cb6e405..d4891ded 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_stonebrick_carved.png and b/mods/ITEMS/mcl_core/textures/mcl_core_stonebrick_carved.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_stonebrick_cracked.png b/mods/ITEMS/mcl_core/textures/mcl_core_stonebrick_cracked.png index 38fcb1e8..b340de08 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_stonebrick_cracked.png and b/mods/ITEMS/mcl_core/textures/mcl_core_stonebrick_cracked.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_vine.png b/mods/ITEMS/mcl_core/textures/mcl_core_vine.png index 831f9d2a..d0e55cb4 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_vine.png and b/mods/ITEMS/mcl_core/textures/mcl_core_vine.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_web.png b/mods/ITEMS/mcl_core/textures/mcl_core_web.png index e2233c1b..fc5dd369 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_web.png and b/mods/ITEMS/mcl_core/textures/mcl_core_web.png differ diff --git a/mods/ITEMS/mcl_crafting_table/depends.txt b/mods/ITEMS/mcl_crafting_table/depends.txt index e3b8528c..97aafc58 100644 --- a/mods/ITEMS/mcl_crafting_table/depends.txt +++ b/mods/ITEMS/mcl_crafting_table/depends.txt @@ -1,2 +1,3 @@ mcl_init +mcl_formspec mcl_sounds diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index 37dc74a2..09c4838c 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -1,33 +1,41 @@ +local S = minetest.get_translator("mcl_crafting_table") + minetest.register_node("mcl_crafting_table:crafting_table", { - description = "Crafting Table", - _doc_items_longdesc = "A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.", - _doc_items_usagehelp = "Rightclick the crafting table to access the 3×3 crafting grid.", + description = S("Crafting Table"), + _tt_help = S("3×3 crafting grid"), + _doc_items_longdesc = S("A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts."), + _doc_items_usagehelp = S("Rightclick the crafting table to access the 3×3 crafting grid."), _doc_items_hidden = false, is_ground_content = false, tiles = {"crafting_workbench_top.png", "default_wood.png", "crafting_workbench_side.png", "crafting_workbench_side.png", "crafting_workbench_front.png", "crafting_workbench_front.png"}, paramtype2 = "facedir", - groups = {handy=1,axey=1, deco_block=1, material_wood=1}, + groups = {handy=1,axey=1, deco_block=1, material_wood=1,flammable=-1}, on_rightclick = function(pos, node, player, itemstack) player:get_inventory():set_width("craft", 3) player:get_inventory():set_size("craft", 9) local form = "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png^crafting_inventory_workbench.png]".. - mcl_vars.inventory_header.. + "image[4.7,1.5;1.5,1;gui_crafting_arrow.png]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[1.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Crafting"))).."]".. "list[current_player;craft;1.75,0.5;3,3;]".. + mcl_formspec.get_itemslot_bg(1.75,0.5,3,3).. "list[current_player;craftpreview;6.1,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(6.1,1.5,1,1).. "image_button[0.75,1.5;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;Recipe book]".. + "tooltip[__mcl_craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. "listring[current_player;main]".. "listring[current_player;craft]" minetest.show_formspec(player:get_player_name(), "main", form) end, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 12.5, + _mcl_blast_resistance = 2.5, _mcl_hardness = 2.5, }) diff --git a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr new file mode 100644 index 00000000..00a9c9cc --- /dev/null +++ b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_crafting_table +Crafting Table=Werkbank +A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Die Werkbank ist ein Block, mit dem Sie Zugriff auf ein 3×3-Fertigungsgitter erhalten, wodurch sie fortgeschrittene Dinge herstellen können. +Rightclick the crafting table to access the 3×3 crafting grid.=Rechtsklicken Sie auf die Werkbank, um auf das 3×3-Fertigungsgitter zuzugreifen. +Recipe book=Fertigungsbuch +Inventory=Inventar +Crafting=Fertigen +3×3 crafting grid=3×3 Fertigungsgitter diff --git a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.es.tr b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.es.tr new file mode 100644 index 00000000..8d560fd5 --- /dev/null +++ b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.es.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_crafting_table +Crafting Table=Mesa de trabajo +A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Una mesa de trabajo es un bloque que le otorga acceso a una cuadrícula de creación 3 × 3 que le permite realizar manualidades avanzadas. +Rightclick the crafting table to access the 3×3 crafting grid.=Haz clic derecho en la mesa de trabajo para acceder a la cuadrícula de creación 3 × 3. +Recipe book=Libro de recetas +Inventory=Inventario +Crafting=Elaboración diff --git a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.fr.tr b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.fr.tr new file mode 100644 index 00000000..23caccff --- /dev/null +++ b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.fr.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_crafting_table +Crafting Table=Etabli +A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Un établi est un bloc qui vous donne accès à une grille d'établi 3×3 qui vous permet d'effectuer des objets avancés. +Rightclick the crafting table to access the 3×3 crafting grid.=Faites un clic droit sur l'établi pour accéder à la grille d'établi 3x3. +Recipe book=Livre de Recette +Crafting=Fabriquer +Inventory=Inventaire +3×3 crafting grid=Grille d'établi 3×3 diff --git a/mods/ITEMS/mcl_crafting_table/locale/template.txt b/mods/ITEMS/mcl_crafting_table/locale/template.txt new file mode 100644 index 00000000..4563b734 --- /dev/null +++ b/mods/ITEMS/mcl_crafting_table/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: mcl_crafting_table +Crafting Table= +A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.= +Rightclick the crafting table to access the 3×3 crafting grid.= +Recipe book= +Crafting= +Inventory= +3×3 crafting grid= diff --git a/mods/ITEMS/mcl_crafting_table/textures/crafting_inventory_workbench.png b/mods/ITEMS/mcl_crafting_table/textures/crafting_inventory_workbench.png deleted file mode 100644 index 0ee30184..00000000 Binary files a/mods/ITEMS/mcl_crafting_table/textures/crafting_inventory_workbench.png and /dev/null differ diff --git a/mods/ITEMS/mcl_crafting_table/textures/crafting_workbench_top.png b/mods/ITEMS/mcl_crafting_table/textures/crafting_workbench_top.png index 5d85e517..0a708336 100644 Binary files a/mods/ITEMS/mcl_crafting_table/textures/crafting_workbench_top.png and b/mods/ITEMS/mcl_crafting_table/textures/crafting_workbench_top.png differ diff --git a/mods/ITEMS/mcl_crafting_table/textures/gui_crafting_arrow.png b/mods/ITEMS/mcl_crafting_table/textures/gui_crafting_arrow.png new file mode 100644 index 00000000..93ce1e1b Binary files /dev/null and b/mods/ITEMS/mcl_crafting_table/textures/gui_crafting_arrow.png differ diff --git a/mods/ITEMS/mcl_doors/README.txt b/mods/ITEMS/mcl_doors/README.txt index 189ba89d..c0cfc052 100644 --- a/mods/ITEMS/mcl_doors/README.txt +++ b/mods/ITEMS/mcl_doors/README.txt @@ -29,3 +29,8 @@ With modifications by GitHub user kingoscargames: - `doors_item_steel.png` - `mcl_doors_door_iron_lower.png` - `mcl_doors_door_iron_upper.png` +- `mcl_doors_trapdoor_acaica.png` +- `mcl_doors_trapdoor_birch.png` +- `mcl_doors_trapdoor_spruce.png` +- `mcl_doors_trapdoor_dark_oak.png` +- `mcl_doors_trapdoor_jungle.png` diff --git a/mods/ITEMS/mcl_doors/api_doors.lua b/mods/ITEMS/mcl_doors/api_doors.lua index 7605aea1..a2685a91 100644 --- a/mods/ITEMS/mcl_doors/api_doors.lua +++ b/mods/ITEMS/mcl_doors/api_doors.lua @@ -1,3 +1,27 @@ +local S = minetest.get_translator("mcl_doors") + +-- This helper function calls on_place_node callbacks. +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 + -- Deep-copy 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 + -- Registers a door -- name: The name of the door -- def: a table with the folowing fields: @@ -20,6 +44,7 @@ function mcl_doors:register_door(name, def) def.groups.not_in_creative_inventory = 1 def.groups.dig_by_piston = 1 def.groups.door = 1 + def.groups.mesecon_ignore_opaque_dig = 1 if not def.sound_open then def.sound_open = "doors_door_open" @@ -43,126 +68,157 @@ function mcl_doors:register_door(name, def) def.selection_box_top = box end - local longdesc, usagehelp + local longdesc, usagehelp, tt_help + tt_help = def._tt_help longdesc = def._doc_items_longdesc if not longdesc then if def.only_redstone_can_open then - longdesc = "This door is a 2-block high barrier which can be opened or closed by hand or by redstone power." + longdesc = S("This door is a 2-block high barrier which can be opened or closed by hand or by redstone power.") else - longdesc = "This door is a 2-block high barrier which can only be opened by redstone power, not by hand." + longdesc = S("This door is a 2-block high barrier which can only be opened by redstone power, not by hand.") end end usagehelp = def._doc_items_usagehelp if not usagehelp then if def.only_redstone_can_open then - usagehelp = "To open or close this door, send a redstone signal to its bottom half." + usagehelp = S("To open or close this door, send a redstone signal to its bottom half.") else - usagehelp = "To open or close this door, rightclick it or send a redstone signal to its bottom half." + usagehelp = S("To open or close this door, rightclick it or send a redstone signal to its bottom half.") end end + if not tt_help then + if def.only_redstone_can_open then + tt_help = S("Openable by redstone power") + else + tt_help = S("Openable by players and redstone power") + end + end + + local craftitem_groups = { mesecon_conductor_craftable = 1, deco_block = 1 } + if def.groups and def.groups.flammable then + craftitem_groups.flammable = def.groups.flammable + end minetest.register_craftitem(name, { description = def.description, + _tt_help = tt_help, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, inventory_image = def.inventory_image, stack_max = 64, - groups = { mesecon_conductor_craftable = 1 }, + groups = craftitem_groups, on_place = function(itemstack, placer, pointed_thing) if not pointed_thing.type == "node" or not placer or not placer:is_player() then return itemstack end local pn = placer:get_player_name() - if minetest.is_protected(pointed_thing.above, pn) and minetest.is_protected(pointed_thing.under, pn) then - return itemstack - end - local ptu = pointed_thing.under - local nu = minetest.get_node(ptu) - -- Pointed thing's rightclick action takes precedence, unless player holds down the sneak key - if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].on_rightclick and not placer:get_player_control().sneak then - return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack) - end - - local pt - if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].buildable_to then - pt = pointed_thing.under - else - pt = pointed_thing.above - end - local pt2 = {x=pt.x, y=pt.y, z=pt.z} - pt2.y = pt2.y+1 - local ptname = minetest.get_node(pt).name - local pt2name = minetest.get_node(pt2).name - if - (minetest.registered_nodes[ptname] and not minetest.registered_nodes[ptname].buildable_to) or - (minetest.registered_nodes[pt2name] and not minetest.registered_nodes[pt2name].buildable_to) - then - return itemstack - end - - local p2 = minetest.dir_to_facedir(placer:get_look_dir()) - local pt3 = {x=pt.x, y=pt.y, z=pt.z} - if p2 == 0 then - pt3.x = pt3.x-1 - elseif p2 == 1 then - pt3.z = pt3.z+1 - elseif p2 == 2 then - pt3.x = pt3.x+1 - elseif p2 == 3 then - pt3.z = pt3.z-1 - end - if not string.find(minetest.get_node(pt3).name, name.."_b_") then - minetest.set_node(pt, {name=name.."_b_1", param2=p2}) - minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) - else - minetest.set_node(pt, {name=name.."_b_2", param2=p2}) - minetest.set_node(pt2, {name=name.."_t_2", param2=p2}) - end - if def.sounds and def.sounds.place then - minetest.sound_play(def.sounds.place, {pos=pt}) - end - - if def.only_placer_can_open then - local meta = minetest.get_meta(pt) - meta:set_string("doors_owner", "") - meta = minetest.get_meta(pt2) - meta:set_string("doors_owner", "") - end - - -- Save open state. 1 = open. 0 = closed - local meta = minetest.get_meta(pt) - meta:set_int("is_open", 0) - meta = minetest.get_meta(pt2) - meta:set_int("is_open", 0) - - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end + if minetest.is_protected(pointed_thing.above, pn) and minetest.is_protected(pointed_thing.under, pn) then return itemstack + end + local ptu = pointed_thing.under + local nu = minetest.get_node(ptu) + -- Pointed thing's rightclick action takes precedence, unless player holds down the sneak key + if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].on_rightclick and not placer:get_player_control().sneak then + return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack) + end + + local pt + if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].buildable_to then + pt = pointed_thing.under + else + pt = pointed_thing.above + end + local pt2 = {x=pt.x, y=pt.y, z=pt.z} + pt2.y = pt2.y+1 + local ptname = minetest.get_node(pt).name + local pt2name = minetest.get_node(pt2).name + if + (minetest.registered_nodes[ptname] and not minetest.registered_nodes[ptname].buildable_to) or + (minetest.registered_nodes[pt2name] and not minetest.registered_nodes[pt2name].buildable_to) + then + return itemstack + end + + -- get left coordinate for checking if another door is there + local pt_left = {x=pt.x, y=pt.y, z=pt.z} + local p2 = minetest.dir_to_facedir(placer:get_look_dir()) + + if p2 == 0 then + pt_left.x = pt_left.x-1 + elseif p2 == 1 then + pt_left.z = pt_left.z+1 + elseif p2 == 2 then + pt_left.x = pt_left.x+1 + elseif p2 == 3 then + pt_left.z = pt_left.z-1 + end + + local left_node = minetest.get_node(pt_left) + + -- Set door nodes + minetest.set_node(pt, {name=name.."_b_1", param2=p2}) + minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) + + if def.sounds and def.sounds.place then + minetest.sound_play(def.sounds.place, {pos=pt}, true) + end + + if def.only_placer_can_open then + local meta = minetest.get_meta(pt) + meta:set_string("doors_owner", "") + meta = minetest.get_meta(pt2) + meta:set_string("doors_owner", "") + end + + local meta1 = minetest.get_meta(pt) + local meta2 = minetest.get_meta(pt2) + -- save mirror state for the correct door + if left_node.name:sub(1, #name) == name then + meta1:set_int("is_mirrored", 1) + meta2:set_int("is_mirrored", 1) + end + + -- Save open state. 1 = open. 0 = closed + meta1:set_int("is_open", 0) + meta2:set_int("is_open", 0) + + + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + + on_place_node(pt, minetest.get_node(pt), placer, nu, itemstack, pointed_thing) + on_place_node(pt2, minetest.get_node(pt2), placer, minetest.get_node({x=ptu.x,y=ptu.y+1,z=ptu.z}), itemstack, pointed_thing) + + return itemstack end, }) local tt = def.tiles_top local tb = def.tiles_bottom - local function on_open_close(pos, dir, check_name, replace, replace_dir, params) + local function on_open_close(pos, dir, check_name, replace, replace_dir) local meta1 = minetest.get_meta(pos) pos.y = pos.y+dir local meta2 = minetest.get_meta(pos) - if not minetest.get_node(pos).name == check_name then + + -- if name of other door is not the same as check_name -> return + if not minetest.get_node(pos).name == check_name then return end + + -- swap directions if mirrored + local params = {3,0,1,2} + if meta1:get_int("is_open") == 0 and meta2:get_int("is_mirrored") == 0 or meta1:get_int("is_open") == 1 and meta2:get_int("is_mirrored") == 1 then + params = {1,2,3,0} + end + local p2 = minetest.get_node(pos).param2 local np2 = params[p2+1] - local metatable = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace_dir, param2=np2}) - minetest.get_meta(pos):from_table(metatable) - + minetest.swap_node(pos, {name=replace_dir, param2=np2}) pos.y = pos.y-dir - metatable = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace, param2=np2}) - minetest.get_meta(pos):from_table(metatable) + minetest.swap_node(pos, {name=replace, param2=np2}) local door_switching_sound if meta1:get_int("is_open") == 1 then @@ -174,15 +230,24 @@ function mcl_doors:register_door(name, def) meta1:set_int("is_open", 1) meta2:set_int("is_open", 1) end - minetest.sound_play(door_switching_sound, {pos = pos, gain = 0.5, max_hear_distance = 16}) + minetest.sound_play(door_switching_sound, {pos = pos, gain = 0.5, max_hear_distance = 16}, true) end - local function on_mesecons_signal_open (pos, node) - on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + local function on_mesecons_signal_open(pos, node) + on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2") end - - local function on_mesecons_signal_close (pos, node) - on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + local function on_mesecons_signal_close(pos, node) + if not mesecon.is_powered({x=pos.x,y=pos.y+1,z=pos.z}) then + on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1") + end + end + local function on_mesecons_signal_open_top(pos, node) + on_mesecons_signal_open({x=pos.x, y=pos.y-1, z=pos.z}, node) + end + local function on_mesecons_signal_close_top(pos, node) + if not mesecon.is_powered({x=pos.x,y=pos.y-1,z=pos.z}) then + on_mesecons_signal_close({x=pos.x, y=pos.y-1, z=pos.z}, node) + end end local function check_player_priv(pos, player) @@ -199,13 +264,13 @@ function mcl_doors:register_door(name, def) if not def.only_redstone_can_open then on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then - on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2") end end end minetest.register_node(name.."_b_1", { - tiles = {tt[2].."^[transformFY", tt[2], tb[2].."^[transformFX", tb[2], tb[1], tb[1].."^[transformFX"}, + tiles = {"blank.png", tt[2].."^[transformFXR90", tb[2], tb[2].."^[transformFX", tb[1], tb[1].."^[transformFX"}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -227,7 +292,7 @@ function mcl_doors:register_door(name, def) after_destruct = function(bottom, oldnode) local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } - if minetest.get_node(bottom).name == "air" and minetest.get_node(top).name == name.."_t_1" then + if minetest.get_node(bottom).name ~= name.."_b_2" and minetest.get_node(top).name == name.."_t_1" then minetest.remove_node(top) end end, @@ -235,9 +300,21 @@ function mcl_doors:register_door(name, def) on_rightclick = on_rightclick, mesecons = { effector = { - action_on = on_mesecons_signal_open + action_on = on_mesecons_signal_open, }}, + on_rotate = function(pos, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + minetest.remove_node(pos) + node.param2 = screwdriver.rotate.facedir(pos, node, mode) + minetest.set_node(pos, node) + node.name = name .."_t_1" + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z}, node) + return true + end + return false + end, + can_dig = check_player_priv, }) @@ -246,13 +323,13 @@ function mcl_doors:register_door(name, def) else on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then - on_open_close(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0}) + on_open_close(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2") end end end minetest.register_node(name.."_t_1", { - tiles = {tt[2].."^[transformFY", tt[2], tt[2].."^[transformFX", tt[2], tt[1], tt[1].."^[transformFX"}, + tiles = {tt[2].."^[transformR90", "blank.png", tt[2], tt[2].."^[transformFX", tt[1], tt[1].."^[transformFX"}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -274,13 +351,30 @@ function mcl_doors:register_door(name, def) after_destruct = function(top, oldnode) local bottom = { x = top.x, y = top.y - 1, z = top.z } - if minetest.get_node(top).name == "air" and minetest.get_node(bottom).name == name.."_b_1" and oldnode.name == name.."_t_1" then + if minetest.get_node(top).name ~= name.."_t_2" and minetest.get_node(bottom).name == name.."_b_1" and oldnode.name == name.."_t_1" then minetest.dig_node(bottom) end end, on_rightclick = on_rightclick, + mesecons = { effector = { + action_on = on_mesecons_signal_open_top, + rules = mesecon.rules.flat, + }}, + + on_rotate = function(pos, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + minetest.remove_node(pos) + node.param2 = screwdriver.rotate.facedir(pos, node, mode) + minetest.set_node(pos, node) + node.name = name .."_b_1" + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z}, node) + return true + end + return false + end, + can_dig = check_player_priv, }) @@ -289,13 +383,13 @@ function mcl_doors:register_door(name, def) else on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then - on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1") end end end minetest.register_node(name.."_b_2", { - tiles = {tt[2].."^[transformFY", tt[2], tb[2].."^[transformFX", tb[2], tb[1].."^[transformFX", tb[1]}, + tiles = {"blank.png", tt[2].."^[transformFXR90", tb[2].."^[transformI", tb[2].."^[transformFX", tb[1].."^[transformFX", tb[1]}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -317,7 +411,7 @@ function mcl_doors:register_door(name, def) after_destruct = function(bottom, oldnode) local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } - if minetest.get_node(bottom).name == "air" and minetest.get_node(top).name == name.."_t_2" then + if minetest.get_node(bottom).name ~= name.."_b_1" and minetest.get_node(top).name == name.."_t_2" then minetest.remove_node(top) end end, @@ -325,9 +419,21 @@ function mcl_doors:register_door(name, def) on_rightclick = on_rightclick, mesecons = { effector = { - action_on = on_mesecons_signal_close + action_off = on_mesecons_signal_close, }}, + on_rotate = function(pos, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + minetest.remove_node(pos) + node.param2 = screwdriver.rotate.facedir(pos, node, mode) + minetest.set_node(pos, node) + node.name = name .."_t_2" + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z}, node) + return true + end + return false + end, + can_dig = check_player_priv, }) @@ -336,13 +442,13 @@ function mcl_doors:register_door(name, def) else on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then - on_open_close(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2}) + on_open_close(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1") end end end minetest.register_node(name.."_t_2", { - tiles = {tt[2].."^[transformFY", tt[2], tt[2].."^[transformFX", tt[2], tt[1].."^[transformFX", tt[1]}, + tiles = {tt[2].."^[transformR90", "blank.png", tt[2].."^[transformI", tt[2].."^[transformFX", tt[1].."^[transformFX", tt[1]}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -364,13 +470,30 @@ function mcl_doors:register_door(name, def) after_destruct = function(top, oldnode) local bottom = { x = top.x, y = top.y - 1, z = top.z } - if minetest.get_node(top).name == "air" and minetest.get_node(bottom).name == name.."_b_2" and oldnode.name == name.."_t_2" then + if minetest.get_node(top).name ~= name.."_t_1" and minetest.get_node(bottom).name == name.."_b_2" and oldnode.name == name.."_t_2" then minetest.dig_node(bottom) end end, on_rightclick = on_rightclick, + mesecons = { effector = { + action_off = on_mesecons_signal_close_top, + rules = mesecon.rules.flat, + }}, + + on_rotate = function(pos, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + minetest.remove_node(pos) + node.param2 = screwdriver.rotate.facedir(pos, node, mode) + minetest.set_node(pos, node) + node.name = name .."_b_2" + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z}, node) + return true + end + return false + end, + can_dig = check_player_priv, }) diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 8053be8e..a7ca6cb1 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -1,10 +1,59 @@ +local S = minetest.get_translator("mcl_doors") + +-- Wrapper around mintest.pointed_thing_to_face_pos. +local function get_fpos(placer, pointed_thing) + local fpos + -- Workaround: minetest.pointed_thing_to_face_pos crashes in MT 0.4.16 if + -- pointed_thing.under and pointed_thing.above are equal + -- FIXME: Remove this when MT got fixed. + if not vector.equals(pointed_thing.under, pointed_thing.above) then + -- The happy case: Everything is normal + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + fpos = finepos.y % 1 + else + -- Fallback if both above and under are equal + fpos = 0 + end + return fpos +end + ---- Trapdoor ---- +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = function(pos, node, user, mode, param2) + -- Flip trapdoor vertically + if mode == screwdriver.ROTATE_AXIS then + local minor = node.param2 + if node.param2 >= 20 then + minor = node.param2 - 20 + if minor == 3 then + minor = 1 + elseif minor == 1 then + minor = 3 + end + node.param2 = minor + else + if minor == 3 then + minor = 1 + elseif minor == 1 then + minor = 3 + end + node.param2 = minor + node.param2 = node.param2 + 20 + end + minetest.set_node(pos, node) + return true + end + end +end + function mcl_doors:register_trapdoor(name, def) local groups = table.copy(def.groups) if groups == nil then groups = {} end + groups.mesecon_ignore_opaque_dig = 1 if not def.sound_open then def.sound_open = "doors_door_open" @@ -18,11 +67,11 @@ function mcl_doors:register_trapdoor(name, def) local tmp_node -- Close if minetest.get_item_group(me.name, "trapdoor") == 2 then - minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 16}) + minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) tmp_node = {name=name, param1=me.param1, param2=me.param2} -- Open else - minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}) + minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2} end minetest.set_node(pos, tmp_node) @@ -36,30 +85,51 @@ function mcl_doors:register_trapdoor(name, def) end -- Default help texts - local longdesc, usagehelp + local longdesc, usagehelp, tt_help longdesc = def._doc_items_longdesc if not longdesc then if def.only_redstone_can_open then - longdesc = "Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power." + longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.") else - longdesc = "Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power." + longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.") end end usagehelp = def._doc_items_usagehelp if not usagehelp and not def.only_redstone_can_open then - usagehelp = "To open or close this trapdoor, rightclick it or send a redstone signal to it." + usagehelp = S("To open or close this trapdoor, rightclick it or send a redstone signal to it.") + end + if not tt_help then + if def.only_redstone_can_open then + tt_help = S("Openable by redstone power") + else + tt_help = S("Openable by players and redstone power") + end end -- Closed trapdoor + local tile_front = def.tile_front + local tile_side = def.tile_side + if not tile_side then + tile_side = tile_front + end + local tiles_closed = { + tile_front, + tile_front .. "^[transformFY", + tile_side, tile_side, + tile_side, tile_side, + } + local groups_closed = groups groups_closed.trapdoor = 1 + groups_closed.deco_block = 1 minetest.register_node(name, { description = def.description, + _tt_help = tt_help, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, drawtype = "nodebox", - tiles = def.tiles, + tiles = tiles_closed, inventory_image = def.inventory_image, wield_image = def.wield_image, is_ground_content = false, @@ -86,14 +156,12 @@ function mcl_doors:register_trapdoor(name, def) local p1 = pointed_thing.above local param2 = 0 - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() if placer_pos then param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) end - local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) - local fpos = finepos.y % 1 - + local fpos = get_fpos(placer, pointed_thing) local origname = itemstack:get_name() if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) @@ -108,15 +176,27 @@ function mcl_doors:register_trapdoor(name, def) return minetest.item_place(itemstack, placer, pointed_thing, param2) end, on_rightclick = on_rightclick, + on_rotate = on_rotate, }) -- Open trapdoor local groups_open = table.copy(groups) + + local tiles_open = { + tile_side, + tile_side .. "^[transformR180", + tile_side .. "^[transformR270", + tile_side .. "^[transformR90", + tile_front .. "^[transform46", + tile_front .. "^[transformFY", + } + groups_open.trapdoor = 2 + groups_open.not_in_creative_inventory = 1 minetest.register_node(name.."_open", { drawtype = "nodebox", - tiles = def.tiles, + tiles = tiles_open, is_ground_content = false, paramtype = "light", paramtype2 = "facedir", @@ -137,10 +217,11 @@ function mcl_doors:register_trapdoor(name, def) }, on_rightclick = on_rightclick, mesecons = {effector = { - action_on = (function(pos, node) + action_off = (function(pos, node) punch(pos) end), }}, + on_rotate = on_rotate, }) if minetest.get_modpath("doc") then diff --git a/mods/ITEMS/mcl_doors/depends.txt b/mods/ITEMS/mcl_doors/depends.txt index d66b23e8..e2ae3cf4 100644 --- a/mods/ITEMS/mcl_doors/depends.txt +++ b/mods/ITEMS/mcl_doors/depends.txt @@ -1,3 +1,5 @@ mcl_core mcl_sounds doc? +screwdriver? +mesecons diff --git a/mods/ITEMS/mcl_doors/init.lua b/mods/ITEMS/mcl_doors/init.lua index 8bdf12d3..9e06b513 100644 --- a/mods/ITEMS/mcl_doors/init.lua +++ b/mods/ITEMS/mcl_doors/init.lua @@ -1,4 +1,3 @@ -local init = os.clock() mcl_doors = {} local this = minetest.get_current_modname() @@ -8,7 +7,3 @@ dofile(path.."/api_doors.lua") -- Doors API dofile(path.."/api_trapdoors.lua") -- Trapdoors API dofile(path.."/register.lua") -- Register builtin doors and trapdoors dofile(path.."/alias.lua") -- Legacy aliases - --- Debug info -local time_to_load= os.clock() - init -minetest.log("action", (string.format("[MOD] "..this.." loaded in %.4f s", time_to_load))) diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr new file mode 100644 index 00000000..03be49a6 --- /dev/null +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_doors +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Holztüren sind 2 Blöcke hohe Barrieren, die von Hand oder mit einem Redstone-Signal geöffnet oder geschlossen werden können. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Um die Holztür zu öffnen oder zu schließen, rechtsklicken Sie sie oder versorgen Sie sie mit einem Redstone-Signal. +Oak Door=Eichentür +Acacia Door=Akazientür +Birch Door=Birkentür +Dark Oak Door=Schwarzeichentür +Jungle Door=Dschungeltür +Spruce Door=Fichtentür +Iron Door=Eisentür +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Eisentüren sind 2 Blöcke hohe Barrieren, die nur von einem Redstone-Signal geöffnet oder geschlossen werden können. +To open or close an iron door, supply its lower half with a redstone signal.=Um eine Eisentür zu öffnen oder zu schließen, versorgen Sie die untere Hälfte mit einem Redstone-Signal. +Oak Trapdoor=Eichenfalltür +Acacia Trapdoor=Akazienfalltür +Birch Trapdoor=Birkenfalltür +Spruce Trapdoor=Fichtenfalltür +Dark Oak Trapdoor=Schwarzeichenfalltür +Jungle Trapdoor=Dschungelfalltür +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Holzfalltüren sind horizontale Barrieren, die von Hand oder mit einem Redstone-Signal geöffnet oder geschlossen werden können. Sie belegen den oberen oder unteren Teil eines Blocks, je nach dem, wie sie platziert wurden. Wenn geöffnet, können sie wie eine Leiter erklommen werden. +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Um die Falltür zu öffnen oder zu schließen, rechtsklicken Sie sie oder schicken Sie ein Redstone-Signal zu ihr. +Iron Trapdoor=Eisenfalltür +Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Eisenfalltüren sind horizontale Barrieren, die nur mit einem Redstone-Signal geöffnet oder geschlossen werden können, nicht von Hand. Sie belegen den oberen oder unteren Teil eines Blocks, je nach dem, wie sie platziert wurden. Wenn geöffnet, können sie wie eine Leiter erklommen werden. +Openable by players and redstone power=Zu öffnen von Spielern und Redstoneenergie +Openable by redstone power=Zu öffnen von Redstoneenergie diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr new file mode 100644 index 00000000..1a510815 --- /dev/null +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr @@ -0,0 +1,22 @@ +# textdomain: mcl_doors +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Las puertas de madera son barreras altas de 2 bloques que se pueden abrir o cerrar a mano y con una señal de redstone. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Para abrir o cerrar una puerta de madera, haga clic derecho o suministre a su mitad inferior una señal de redstone. +Oak Door=Puerta de roble +Acacia Door=Puerta de acacia +Birch Door=Puerta de abedul +Dark Oak Door=Puerta de roble oscuro +Jungle Door=Puerta de jungla +Spruce Door=Puerta de abeto +Iron Door=Puerta de Hierro +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Las puertas de hierro son barreras altas de 2 bloques que solo se pueden abrir o cerrar mediante una señal de redstone, no a mano. +To open or close an iron door, supply its lower half with a redstone signal.=Para abrir o cerrar una puerta de hierro, suministre a su mitad inferior una señal de redstone. +Oak Trapdoor=Trampilla de roble +Acacia Trapdoor=Trampilla de acacia +Birch Trapdoor=Trampilla de abedul +Spruce Trapdoor=Trampilla de abeto +Dark Oak Trapdoor=Trampilla de roble oscuro +Jungle Trapdoor=Trampilla de jungla +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Las trampillas de madera son barreras horizontales que se pueden abrir y cerrar a mano o una señal de redstone. Ocupan la parte superior o inferior de un bloque, dependiendo de cómo se hayan colocado. Cuando están abiertos, se pueden subir como una escalera. +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abrir o cerrar la trampilla, haga clic derecho o envíele una señal de redstone. +Iron Trapdoor=Trampilla de hierro +Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Las trampillas de hierro son barreras horizontales que solo pueden abrirse y cerrarse mediante señales de redstone, no a mano. Ocupan la parte superior o inferior de un bloque, dependiendo de cómo se hayan colocado. Cuando están abiertos, se pueden subir como una escalera. diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr new file mode 100644 index 00000000..9d1f25d9 --- /dev/null +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_doors +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Les portes en bois sont des barrières hautes à 2 blocs qui peuvent être ouvertes ou fermées à la main et par un signal redstone. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Pour ouvrir ou fermer une porte en bois, faites un clic droit dessus ou fournissez à sa moitié inférieure un signal redstone. +Oak Door=Porte en Chêne +Acacia Door=Porte en Acacia +Birch Door=Porte en Bouleau +Dark Oak Door=Porte en Chêne Noir +Jungle Door=Porte en Acajou +Spruce Door=Porte en Sapin +Iron Door=Porte en Fer +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Les portes en fer sont des barrières hautes à 2 blocs qui ne peuvent être ouvertes ou fermées que par un signal redstone, mais pas à la main. +To open or close an iron door, supply its lower half with a redstone signal.=Pour ouvrir ou fermer une porte en fer, fournir à sa moitié inférieure un signal redstone. +Oak Trapdoor=Trappe en Chêne +Acacia Trapdoor=Trappe en Acacia +Birch Trapdoor=Trappe en Bouleau +Spruce Trapdoor=Trappe en Sapin +Dark Oak Trapdoor=Trappe en Chêne Noir +Jungle Trapdoor=Trappe en Acajou +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Les trappes en bois sont des barrières horizontales qui peuvent être ouvertes et fermées à la main ou par un signal redstone. Ils occupent la partie supérieure ou inférieure d'un bloc, selon la façon dont ils ont été placés. Lorsqu'elles sont ouvertes, elles peuvent être montées comme une échelle. +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Pour ouvrir ou fermer la trappe, faites un clic droit dessus ou envoyez-lui un signal redstone. +Iron Trapdoor=Trappe en Fer +Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Les trappes en fer sont des barrières horizontales qui ne peuvent être ouvertes et fermées que par des signaux de redstone, mais pas à la main. Ils occupent la partie supérieure ou inférieure d'un bloc, selon la façon dont ils ont été placés. Lorsqu'elles sont ouvertes, elles peuvent être montées comme une échelle. +Openable by players and redstone power=Ouvrable par les joueurs et puissance redstone +Openable by redstone power=Ouvrable par la puissance redstone diff --git a/mods/ITEMS/mcl_doors/locale/template.txt b/mods/ITEMS/mcl_doors/locale/template.txt new file mode 100644 index 00000000..d8c7c860 --- /dev/null +++ b/mods/ITEMS/mcl_doors/locale/template.txt @@ -0,0 +1,24 @@ +# textdomain: mcl_doors +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.= +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.= +Oak Door= +Acacia Door= +Birch Door= +Dark Oak Door= +Jungle Door= +Spruce Door= +Iron Door= +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.= +To open or close an iron door, supply its lower half with a redstone signal.= +Oak Trapdoor= +Acacia Trapdoor= +Birch Trapdoor= +Spruce Trapdoor= +Dark Oak Trapdoor= +Jungle Trapdoor= +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.= +To open or close the trapdoor, rightclick it or send a redstone signal to it.= +Iron Trapdoor= +Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.= +Openable by players and redstone power= +Openable by redstone power= diff --git a/mods/ITEMS/mcl_doors/register.lua b/mods/ITEMS/mcl_doors/register.lua index f6cc6a1b..2ffd4b24 100644 --- a/mods/ITEMS/mcl_doors/register.lua +++ b/mods/ITEMS/mcl_doors/register.lua @@ -1,19 +1,21 @@ +local S = minetest.get_translator("mcl_doors") + --[[ Doors ]] -local wood_longdesc = "Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal." -local wood_usagehelp = "To open or close a wooden door, rightclick it or supply its lower half with a redstone signal." +local wood_longdesc = S("Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.") +local wood_usagehelp = S("To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.") --- Oak Door --- mcl_doors:register_door("mcl_doors:wooden_door", { - description = "Oak Door", + description = S("Oak Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "doors_item_wood.png", - groups = {handy=1,axey=1, material_wood=1}, + groups = {handy=1,axey=1, material_wood=1, flammable=-1}, _mcl_hardness = 3, - _mcl_blast_resistance = 15, - tiles_bottom = {"mcl_doors_door_wood_lower.png", "mcl_doors_door_wood_lower.png"}, - tiles_top = {"mcl_doors_door_wood_upper.png", "mcl_doors_door_wood_upper.png"}, + _mcl_blast_resistance = 3, + tiles_bottom = {"mcl_doors_door_wood_lower.png", "mcl_doors_door_wood_side_lower.png"}, + tiles_top = {"mcl_doors_door_wood_upper.png", "mcl_doors_door_wood_side_upper.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), }) @@ -28,15 +30,15 @@ minetest.register_craft({ --- Acacia Door -- mcl_doors:register_door("mcl_doors:acacia_door", { - description = "Acacia Door", + description = S("Acacia Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_acacia.png", - groups = {handy=1,axey=1, material_wood=1}, + groups = {handy=1,axey=1, material_wood=1, flammable=-1}, _mcl_hardness = 3, - _mcl_blast_resistance = 15, - tiles_bottom = {"mcl_doors_door_acacia_lower.png", "mcl_doors_door_acacia_lower.png"}, - tiles_top = {"mcl_doors_door_acacia_upper.png", "mcl_doors_door_acacia_upper.png"}, + _mcl_blast_resistance = 3, + tiles_bottom = {"mcl_doors_door_acacia_lower.png", "mcl_doors_door_acacia_side_lower.png"}, + tiles_top = {"mcl_doors_door_acacia_upper.png", "mcl_doors_door_acacia_side_upper.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), }) @@ -51,15 +53,15 @@ minetest.register_craft({ --- Birch Door -- mcl_doors:register_door("mcl_doors:birch_door", { - description = "Birch Door", + description = S("Birch Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_birch.png", - groups = {handy=1,axey=1, material_wood=1}, + groups = {handy=1,axey=1, material_wood=1, flammable=-1}, _mcl_hardness = 3, - _mcl_blast_resistance = 15, - tiles_bottom = {"mcl_doors_door_birch_lower.png", "mcl_doors_door_birch_lower.png"}, - tiles_top = {"mcl_doors_door_birch_upper.png", "mcl_doors_door_birch_upper.png"}, + _mcl_blast_resistance = 3, + tiles_bottom = {"mcl_doors_door_birch_lower.png", "mcl_doors_door_birch_side_lower.png"}, + tiles_top = {"mcl_doors_door_birch_upper.png", "mcl_doors_door_birch_side_upper.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), }) @@ -74,15 +76,15 @@ minetest.register_craft({ --- Dark Oak Door -- mcl_doors:register_door("mcl_doors:dark_oak_door", { - description = "Dark Oak Door", + description = S("Dark Oak Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_dark_oak.png", - groups = {handy=1,axey=1, material_wood=1}, + groups = {handy=1,axey=1, material_wood=1, flammable=-1}, _mcl_hardness = 3, - _mcl_blast_resistance = 15, - tiles_bottom = {"mcl_doors_door_dark_oak_lower.png", "mcl_doors_door_dark_oak_lower.png"}, - tiles_top = {"mcl_doors_door_dark_oak_upper.png", "mcl_doors_door_dark_oak_upper.png"}, + _mcl_blast_resistance = 3, + tiles_bottom = {"mcl_doors_door_dark_oak_lower.png", "mcl_doors_door_dark_oak_side_lower.png"}, + tiles_top = {"mcl_doors_door_dark_oak_upper.png", "mcl_doors_door_dark_oak_side_upper.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), }) @@ -97,15 +99,15 @@ minetest.register_craft({ --- Jungle Door -- mcl_doors:register_door("mcl_doors:jungle_door", { - description = "Jungle Door", + description = S("Jungle Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_jungle.png", - groups = {handy=1,axey=1, material_wood=1}, + groups = {handy=1,axey=1, material_wood=1, flammable=-1}, _mcl_hardness = 3, - _mcl_blast_resistance = 15, - tiles_bottom = {"mcl_doors_door_jungle_lower.png", "mcl_doors_door_jungle_lower.png"}, - tiles_top = {"mcl_doors_door_jungle_upper.png", "mcl_doors_door_jungle_upper.png"}, + _mcl_blast_resistance = 3, + tiles_bottom = {"mcl_doors_door_jungle_lower.png", "mcl_doors_door_jungle_side_lower.png"}, + tiles_top = {"mcl_doors_door_jungle_upper.png", "mcl_doors_door_jungle_side_upper.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), }) @@ -120,15 +122,15 @@ minetest.register_craft({ --- Spruce Door -- mcl_doors:register_door("mcl_doors:spruce_door", { - description = "Spruce Door", + description = S("Spruce Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_spruce.png", - groups = {handy=1,axey=1, material_wood=1}, + groups = {handy=1,axey=1, material_wood=1, flammable=-1}, _mcl_hardness = 3, - _mcl_blast_resistance = 15, - tiles_bottom = {"mcl_doors_door_spruce_lower.png", "mcl_doors_door_spruce_lower.png"}, - tiles_top = {"mcl_doors_door_spruce_upper.png", "mcl_doors_door_spruce_upper.png"}, + _mcl_blast_resistance = 3, + tiles_bottom = {"mcl_doors_door_spruce_lower.png", "mcl_doors_door_spruce_side_lower.png"}, + tiles_top = {"mcl_doors_door_spruce_upper.png", "mcl_doors_door_spruce_side_upper.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), }) @@ -174,15 +176,15 @@ minetest.register_craft({ --- Iron Door --- mcl_doors:register_door("mcl_doors:iron_door", { - description = "Iron Door", - _doc_items_longdesc = "Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.", - _doc_items_usagehelp = "To open or close an iron door, supply its lower half with a redstone signal.", + description = S("Iron Door"), + _doc_items_longdesc = S("Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand."), + _doc_items_usagehelp = S("To open or close an iron door, supply its lower half with a redstone signal."), inventory_image = "doors_item_steel.png", groups = {pickaxey=1, mesecon_effector_on=1}, _mcl_hardness = 5, - _mcl_blast_resistance = 25, - tiles_bottom = {"mcl_doors_door_iron_lower.png^[transformFX", "mcl_doors_door_iron_lower.png^[transformFX"}, - tiles_top = {"mcl_doors_door_iron_upper.png^[transformFX", "mcl_doors_door_iron_upper.png^[transformFX"}, + _mcl_blast_resistance = 5, + tiles_bottom = {"mcl_doors_door_iron_lower.png^[transformFX", "mcl_doors_door_iron_side_lower.png"}, + tiles_top = {"mcl_doors_door_iron_upper.png^[transformFX", "mcl_doors_door_iron_side_upper.png"}, sounds = mcl_sounds.node_sound_metal_defaults(), sound_open = "doors_steel_door_open", sound_close = "doors_steel_door_close", @@ -202,41 +204,54 @@ minetest.register_craft({ --[[ Trapdoors ]] +local woods = { + -- id, desc, texture, craftitem + { "trapdoor", S("Oak Trapdoor"), "doors_trapdoor.png", "doors_trapdoor_side.png", "mcl_core:wood" }, + { "acacia_trapdoor", S("Acacia Trapdoor"), "mcl_doors_trapdoor_acacia.png", "mcl_doors_trapdoor_acacia_side.png", "mcl_core:acaciawood" }, + { "birch_trapdoor", S("Birch Trapdoor"), "mcl_doors_trapdoor_birch.png", "mcl_doors_trapdoor_birch_side.png", "mcl_core:birchwood" }, + { "spruce_trapdoor", S("Spruce Trapdoor"), "mcl_doors_trapdoor_spruce.png", "mcl_doors_trapdoor_spruce_side.png", "mcl_core:sprucewood" }, + { "dark_oak_trapdoor", S("Dark Oak Trapdoor"), "mcl_doors_trapdoor_dark_oak.png", "mcl_doors_trapdoor_dark_oak_side.png", "mcl_core:darkwood" }, + { "jungle_trapdoor", S("Jungle Trapdoor"), "mcl_doors_trapdoor_jungle.png", "mcl_doors_trapdoor_jungle_side.png", "mcl_core:junglewood" }, +} -mcl_doors:register_trapdoor("mcl_doors:trapdoor", { - description = "Wooden Trapdoor", - _doc_items_longdesc = "Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.", - _doc_items_usagehelp = "To open or close the trapdoor, rightclick it or send a redstone signal to it.", - tiles = {"doors_trapdoor.png"}, - wield_image = "doors_trapdoor.png", - groups = {handy=1,axey=1, mesecon_effector_on=1, material_wood=1}, - _mcl_hardness = 3, - _mcl_blast_resistance = 15, - sounds = mcl_sounds.node_sound_wood_defaults(), -}) +for w=1, #woods do + mcl_doors:register_trapdoor("mcl_doors:"..woods[w][1], { + description = woods[w][2], + _doc_items_longdesc = S("Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder."), + _doc_items_usagehelp = S("To open or close the trapdoor, rightclick it or send a redstone signal to it."), + tile_front = woods[w][3], + tile_side = woods[w][4], + wield_image = woods[w][3], + groups = {handy=1,axey=1, mesecon_effector_on=1, material_wood=1, flammable=-1}, + _mcl_hardness = 3, + _mcl_blast_resistance = 3, + sounds = mcl_sounds.node_sound_wood_defaults(), + }) -minetest.register_craft({ - output = 'mcl_doors:trapdoor 2', - recipe = { - {'group:wood', 'group:wood', 'group:wood'}, - {'group:wood', 'group:wood', 'group:wood'}, - } -}) + minetest.register_craft({ + output = "mcl_doors:"..woods[w][1].." 2", + recipe = { + {woods[w][5], woods[w][5], woods[w][5]}, + {woods[w][5], woods[w][5], woods[w][5]}, + } + }) -minetest.register_craft({ - type = "fuel", - recipe = "mcl_doors:trapdoor", - burntime = 15, -}) + minetest.register_craft({ + type = "fuel", + recipe = "mcl_doors:"..woods[w][1], + burntime = 15, + }) +end mcl_doors:register_trapdoor("mcl_doors:iron_trapdoor", { - description = "Iron Trapdoor", - _doc_items_longdesc = "Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.", - tiles = {"doors_trapdoor_steel.png"}, + description = S("Iron Trapdoor"), + _doc_items_longdesc = S("Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder."), + tile_front = "doors_trapdoor_steel.png", + tile_side = "doors_trapdoor_steel_side.png", wield_image = "doors_trapdoor_steel.png", groups = {pickaxey=1, mesecon_effector_on=1}, _mcl_hardness = 5, - _mcl_blast_resistance = 25, + _mcl_blast_resistance = 5, sounds = mcl_sounds.node_sound_metal_defaults(), sound_open = "doors_steel_door_open", sound_close = "doors_steel_door_close", diff --git a/mods/ITEMS/mcl_doors/sounds/doors_door_close.ogg b/mods/ITEMS/mcl_doors/sounds/doors_door_close.ogg index a39452ba..b4a13ec7 100644 Binary files a/mods/ITEMS/mcl_doors/sounds/doors_door_close.ogg and b/mods/ITEMS/mcl_doors/sounds/doors_door_close.ogg differ diff --git a/mods/ITEMS/mcl_doors/sounds/doors_door_open.ogg b/mods/ITEMS/mcl_doors/sounds/doors_door_open.ogg index 7ec7f480..d03570ee 100644 Binary files a/mods/ITEMS/mcl_doors/sounds/doors_door_open.ogg and b/mods/ITEMS/mcl_doors/sounds/doors_door_open.ogg differ diff --git a/mods/ITEMS/mcl_doors/textures/doors_trapdoor.png b/mods/ITEMS/mcl_doors/textures/doors_trapdoor.png index ec3f4d7c..24e34c35 100644 Binary files a/mods/ITEMS/mcl_doors/textures/doors_trapdoor.png and b/mods/ITEMS/mcl_doors/textures/doors_trapdoor.png differ diff --git a/mods/ITEMS/mcl_doors/textures/doors_trapdoor_side.png b/mods/ITEMS/mcl_doors/textures/doors_trapdoor_side.png new file mode 100644 index 00000000..519d9b9e Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/doors_trapdoor_side.png differ diff --git a/mods/ITEMS/mcl_doors/textures/doors_trapdoor_steel.png b/mods/ITEMS/mcl_doors/textures/doors_trapdoor_steel.png index dc8f5325..eba795b3 100644 Binary files a/mods/ITEMS/mcl_doors/textures/doors_trapdoor_steel.png and b/mods/ITEMS/mcl_doors/textures/doors_trapdoor_steel.png differ diff --git a/mods/ITEMS/mcl_doors/textures/doors_trapdoor_steel_side.png b/mods/ITEMS/mcl_doors/textures/doors_trapdoor_steel_side.png new file mode 100644 index 00000000..28a98f2e Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/doors_trapdoor_steel_side.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_side_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_side_lower.png new file mode 100644 index 00000000..4dbbf38c Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_side_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_side_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_side_upper.png new file mode 100644 index 00000000..f1c04b99 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_side_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_upper.png index 7e97bb71..3fa7b30d 100644 Binary files a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_upper.png and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_acacia_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_lower.png index 844ce3a2..cb09fef6 100644 Binary files a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_lower.png and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_side_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_side_lower.png new file mode 100644 index 00000000..cae11502 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_side_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_side_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_side_upper.png new file mode 100644 index 00000000..a6805e4f Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_birch_side_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_lower.png index b3b7e81d..7c04fd88 100644 Binary files a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_lower.png and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_side_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_side_lower.png new file mode 100644 index 00000000..3cf5b4fe Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_side_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_side_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_side_upper.png new file mode 100644 index 00000000..528358fe Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_side_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_upper.png index 398547b9..d3ccecf4 100644 Binary files a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_upper.png and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_dark_oak_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_lower.png index 583b3e26..6d0e3686 100644 Binary files a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_lower.png and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_side_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_side_lower.png new file mode 100644 index 00000000..6d0e3686 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_side_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_side_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_side_upper.png new file mode 100644 index 00000000..a30b9300 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_iron_side_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_jungle_side_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_jungle_side_lower.png new file mode 100644 index 00000000..5ba2aee5 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_jungle_side_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_jungle_side_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_jungle_side_upper.png new file mode 100644 index 00000000..9f01843a Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_jungle_side_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce.png index 7dc7de5b..3806a845 100644 Binary files a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce.png and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_lower.png index cc8d23ea..dc17e212 100644 Binary files a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_lower.png and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_side_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_side_lower.png new file mode 100644 index 00000000..df63467a Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_side_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_side_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_side_upper.png new file mode 100644 index 00000000..45b4f664 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_side_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_upper.png index 0ea05cb9..ee6c4a76 100644 Binary files a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_upper.png and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_spruce_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_wood_side_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_wood_side_lower.png new file mode 100644 index 00000000..95ef79d8 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_wood_side_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_wood_side_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_wood_side_upper.png new file mode 100644 index 00000000..bc74c5de Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_wood_side_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_acacia.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_acacia.png new file mode 100644 index 00000000..bf1534c0 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_acacia.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_acacia_side.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_acacia_side.png new file mode 100644 index 00000000..1cd4f934 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_acacia_side.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_birch.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_birch.png new file mode 100644 index 00000000..f832fe9d Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_birch.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_birch_side.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_birch_side.png new file mode 100644 index 00000000..040eaaec Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_birch_side.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_dark_oak.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_dark_oak.png new file mode 100644 index 00000000..1a75bb9a Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_dark_oak.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_dark_oak_side.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_dark_oak_side.png new file mode 100644 index 00000000..6d5e9d6c Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_dark_oak_side.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_jungle.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_jungle.png new file mode 100644 index 00000000..9ed9ba81 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_jungle.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_jungle_side.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_jungle_side.png new file mode 100644 index 00000000..9f42ba4f Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_jungle_side.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_spruce.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_spruce.png new file mode 100644 index 00000000..c934d8cf Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_spruce.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_spruce_side.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_spruce_side.png new file mode 100644 index 00000000..882ef6b2 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_spruce_side.png differ diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 68219d7d..eaacaecf 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -1,5 +1,3 @@ --- minetest/dye/init.lua - -- To make recipes that will work with any dye ever made by anybody, define -- them based on groups. -- You can select any group of groups, based on your need for amount of colors. @@ -13,11 +11,13 @@ -- recipe = {':item_no_color', 'group:basecolor_yellow'}, -- }) --- Other mods can use these for looping through available colors mcl_dye = {} -local dye = {} -dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} -dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} + +local S = minetest.get_translator("mcl_dye") + +-- Other mods can use these for looping through available colors +mcl_dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} +mcl_dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} -- Base color groups: -- - basecolor_white @@ -64,38 +64,60 @@ local dyelocal = {} -- This collection of colors is partly a historic thing, partly something else. dyelocal.dyes = { - {"white", "Bone Meal", {dye=1, craftitem=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, - {"grey", "Light Grey Dye", {dye=1, craftitem=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, - {"dark_grey", "Grey Dye", {dye=1, craftitem=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, - {"black", "Ink Sac", {dye=1, craftitem=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, - {"violet", "Purple Dye", {dye=1, craftitem=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, - {"blue", "Lapis Lazuli", {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, - {"lightblue", "Light Blue Dye", {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_light_blue=1}}, - {"cyan", "Cyan Dye", {dye=1, craftitem=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, - {"dark_green", "Cactus Green",{dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, - {"green", "Lime Dye", {dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, - {"yellow", "Dandelion Yellow", {dye=1, craftitem=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "Cocoa Beans", {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, - {"orange", "Orange Dye", {dye=1, craftitem=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, - {"red", "Rose Red", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, - {"magenta", "Magenta Dye", {dye=1, craftitem=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, - {"pink", "Pink Dye", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, + {"white", "mcl_dye_white", S("Bone Meal"), {dye=1, craftitem=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, + {"grey", "dye_grey", S("Light Grey Dye"), {dye=1, craftitem=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, + {"dark_grey", "dye_dark_grey", S("Grey Dye"), {dye=1, craftitem=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, + {"black", "mcl_dye_black", S("Ink Sac"), {dye=1, craftitem=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, + {"violet", "dye_violet", S("Purple Dye"), {dye=1, craftitem=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, + {"blue", "mcl_dye_blue", S("Lapis Lazuli"), {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, + {"lightblue", "mcl_dye_light_blue", S("Light Blue Dye"), {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_light_blue=1}}, + {"cyan", "dye_cyan", S("Cyan Dye"), {dye=1, craftitem=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, + {"dark_green", "dye_dark_green", S("Cactus Green"),{dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, + {"green", "mcl_dye_lime", S("Lime Dye"), {dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, + {"yellow", "dye_yellow", S("Dandelion Yellow"), {dye=1, craftitem=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, + {"brown", "mcl_dye_brown", S("Cocoa Beans"), {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, + {"orange", "dye_orange", S("Orange Dye"), {dye=1, craftitem=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, + {"red", "dye_red", S("Rose Red"), {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, + {"magenta", "dye_magenta", S("Magenta Dye"), {dye=1, craftitem=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, + {"pink", "dye_pink", S("Pink Dye"), {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, } +local mg_name = minetest.get_mapgen_setting("mg_name") + +dyelocal.unicolor_to_dye_id = {} +for d=1, #dyelocal.dyes do + for k, _ in pairs(dyelocal.dyes[d][4]) do + if string.sub(k, 1, 9) == "unicolor_" then + dyelocal.unicolor_to_dye_id[k] = dyelocal.dyes[d][1] + end + end +end + +-- Takes an unicolor group name (e.g. “unicolor_white”) and returns a corresponding dye name (if it exists), nil otherwise. +mcl_dye.unicolor_to_dye = function(unicolor_group) + local color = dyelocal.unicolor_to_dye_id[unicolor_group] + if color then + return "mcl_dye:" .. color + else + return nil + end +end + -- Define items for _, row in ipairs(dyelocal.dyes) do local name = row[1] -- White and brown dyes are defined explicitly below if name ~= "white" and name ~= "brown" then - local description = row[2] - local groups = row[3] + local img = row[2] + local description = row[3] + local groups = row[4] local item_name = "mcl_dye:"..name - local item_image = "dye_"..name..".png" + local item_image = img..".png" minetest.register_craftitem(item_name, { inventory_image = item_image, description = description, - _doc_items_longdesc = "This item is a dye which is used for dyeing and crafting.", - _doc_items_usagehelp = "Rightclick on a sheep to dye its wool. Other things are dyed by crafting.", + _doc_items_longdesc = S("This item is a dye which is used for dyeing and crafting."), + _doc_items_usagehelp = S("Rightclick on a sheep to dye its wool. Other things are dyed by crafting."), groups = groups, stack_max = 64, }) @@ -105,24 +127,40 @@ end -- Bone Meal mcl_dye.apply_bone_meal = function(pointed_thing) - -- TODO: Use biome-specific flowers - local flowers_table = { + -- Bone meal currently spawns all flowers found in the plains. + local flowers_table_plains = { "mcl_flowers:dandelion", "mcl_flowers:dandelion", "mcl_flowers:poppy", - "mcl_flowers:blue_orchid", "mcl_flowers:oxeye_daisy", "mcl_flowers:tulip_orange", "mcl_flowers:tulip_red", "mcl_flowers:tulip_white", "mcl_flowers:tulip_pink", - "mcl_flowers:allium", "mcl_flowers:azure_bluet", } + local flowers_table_simple = { + "mcl_flowers:dandelion", + "mcl_flowers:poppy", + } + local flowers_table_swampland = { + "mcl_flowers:blue_orchid", + } + local flowers_table_flower_forest = { + "mcl_flowers:dandelion", + "mcl_flowers:poppy", + "mcl_flowers:oxeye_daisy", + "mcl_flowers:tulip_orange", + "mcl_flowers:tulip_red", + "mcl_flowers:tulip_white", + "mcl_flowers:tulip_pink", + "mcl_flowers:azure_bluet", + "mcl_flowers:allium", + } - pos = pointed_thing.under - n = minetest.get_node(pos) + local pos = pointed_thing.under + local n = minetest.get_node(pos) if n.name == "" then return false end if minetest.get_item_group(n.name, "sapling") >= 1 then -- Saplings: 45% chance to advance growth stage @@ -134,7 +172,7 @@ mcl_dye.apply_bone_meal = function(pointed_thing) -- Must be on a dirt-type block local below = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) - if below.name ~= "mcl_core:mycelium" and below.name ~= "mcl_core:dirt" and below.name ~= "mcl_core:dirt_with_grass" and below.name ~= "mcl_core:coarse_dirt" and below.name ~= "mcl_core:podzol" then + if below.name ~= "mcl_core:mycelium" and below.name ~= "mcl_core:dirt" and minetest.get_item_group(below.name, "grass_block") ~= 1 and below.name ~= "mcl_core:coarse_dirt" and below.name ~= "mcl_core:podzol" then return false end @@ -142,11 +180,11 @@ mcl_dye.apply_bone_meal = function(pointed_thing) local schematic, offset, height if n.name == "mcl_mushrooms:mushroom_brown" then schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts" - offset = { x = -3, y = 0, z = -3 } + offset = { x = -3, y = -1, z = -3 } height = 8 elseif n.name == "mcl_mushrooms:mushroom_red" then schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_red.mts" - offset = { x = -2, y = 0, z = -2 } + offset = { x = -2, y = -1, z = -2 } height = 8 else return false @@ -180,45 +218,61 @@ mcl_dye.apply_bone_meal = function(pointed_thing) -- Wheat, Potato, Carrot, Pumpkin Stem, Melon Stem: Advance by 2-5 stages elseif string.find(n.name, "mcl_farming:wheat_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_wheat", pos, n, stages) + return mcl_farming:grow_plant("plant_wheat", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:potato_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_potato", pos, n, stages) + return mcl_farming:grow_plant("plant_potato", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:carrot_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_carrot", pos, n, stages) + return mcl_farming:grow_plant("plant_carrot", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:pumpkin_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_pumpkin_stem", pos, n, stages) + return mcl_farming:grow_plant("plant_pumpkin_stem", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:melontige_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_melon_stem", pos, n, stages) + return mcl_farming:grow_plant("plant_melon_stem", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:beetroot_") ~= nil then -- Beetroot: 75% chance to advance to next stage if math.random(1,100) <= 75 then - return mcl_farming:grow_plant("plant_beetroot", pos, n) + return mcl_farming:grow_plant("plant_beetroot", pos, n, 1, true) end elseif n.name == "mcl_cocoas:cocoa_1" or n.name == "mcl_cocoas:cocoa_2" then -- Cocoa: Advance by 1 stage mcl_cocoas.grow(pos) return true - elseif n.name == "mcl_core:dirt_with_grass" or n.name == "mcl_core:dirt_with_grass_snow" then + elseif minetest.get_item_group(n.name, "grass_block") == 1 then -- Grass Block: Generate tall grass and random flowers all over the place for i = -2, 2 do for j = -2, 2 do pos = pointed_thing.above pos = {x=pos.x+i, y=pos.y, z=pos.z+j} n = minetest.get_node(pos) - n2 = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + local n2 = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if n.name ~= "" and n.name == "air" and (n2.name == "mcl_core:dirt_with_grass" or n2.name == "mcl_core:dirt_with_grass_snow") then + if n.name ~= "" and n.name == "air" and (minetest.get_item_group(n2.name, "grass_block_no_snow") == 1) then -- Randomly generate flowers, tall grass or nothing if math.random(1,100) <= 90 then -- 90% tall grass, 10% flower if math.random(1,100) <= 90 then - minetest.add_node(pos, {name="mcl_core:tallgrass"}) + local col = n2.param2 + minetest.add_node(pos, {name="mcl_flowers:tallgrass", param2=col}) else + local flowers_table + if mg_name == "v6" then + flowers_table = flowers_table_plains + else + local biome = minetest.get_biome_name(minetest.get_biome_data(pos).biome) + if biome == "Swampland" or biome == "Swampland_shore" or biome == "Swampland_ocean" or biome == "Swampland_deep_ocean" or biome == "Swampland_underground" then + flowers_table = flowers_table_swampland + elseif biome == "FlowerForest" or biome == "FlowerForest_beach" or biome == "FlowerForest_ocean" or biome == "FlowerForest_deep_ocean" or biome == "FlowerForest_underground" then + flowers_table = flowers_table_flower_forest + elseif biome == "Plains" or biome == "Plains_beach" or biome == "Plains_ocean" or biome == "Plains_deep_ocean" or biome == "Plains_underground" or biome == "SunflowerPlains" or biome == "SunflowerPlains_ocean" or biome == "SunflowerPlains_deep_ocean" or biome == "SunflowerPlains_underground" then + flowers_table = flowers_table_plains + else + flowers_table = flowers_table_simple + end + end minetest.add_node(pos, {name=flowers_table[math.random(1, #flowers_table)]}) end end @@ -246,8 +300,8 @@ mcl_dye.apply_bone_meal = function(pointed_thing) local toppos = { x=pos.x, y=pos.y+1, z=pos.z } local topnode = minetest.get_node(toppos) if minetest.registered_nodes[topnode.name].buildable_to then - minetest.set_node(pos, { name = "mcl_flowers:double_grass" }) - minetest.set_node(toppos, { name = "mcl_flowers:double_grass_top" }) + minetest.set_node(pos, { name = "mcl_flowers:double_grass", param2 = n.param2 }) + minetest.set_node(toppos, { name = "mcl_flowers:double_grass_top", param2 = n.param2 }) return true end @@ -256,8 +310,8 @@ mcl_dye.apply_bone_meal = function(pointed_thing) local toppos = { x=pos.x, y=pos.y+1, z=pos.z } local topnode = minetest.get_node(toppos) if minetest.registered_nodes[topnode.name].buildable_to then - minetest.set_node(pos, { name = "mcl_flowers:double_fern" }) - minetest.set_node(toppos, { name = "mcl_flowers:double_fern_top" }) + minetest.set_node(pos, { name = "mcl_flowers:double_fern", param2 = n.param2 }) + minetest.set_node(toppos, { name = "mcl_flowers:double_fern_top", param2 = n.param2 }) return true end end @@ -266,12 +320,13 @@ mcl_dye.apply_bone_meal = function(pointed_thing) end minetest.register_craftitem("mcl_dye:white", { - inventory_image = "dye_white.png", - description = "Bone Meal", - _doc_items_longdesc = "Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.", - _doc_items_usagehelp = "Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.", + inventory_image = "mcl_dye_white.png", + description = S("Bone Meal"), + _tt_help = S("Speeds up plant growth"), + _doc_items_longdesc = S("Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants."), + _doc_items_usagehelp = S("Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place."), stack_max = 64, - groups = dyelocal.dyes[1][3], + groups = dyelocal.dyes[1][4], on_place = function(itemstack, user, pointed_thing) -- Use pointed node's on_rightclick function first, if present local node = minetest.get_node(pointed_thing.under) @@ -287,15 +342,30 @@ minetest.register_craftitem("mcl_dye:white", { end return itemstack end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Apply bone meal, if possible + local pointed_thing + if dropnode.name == "air" then + pointed_thing = { above = droppos, under = { x=droppos.x, y=droppos.y-1, z=droppos.z } } + else + pointed_thing = { above = pos, under = droppos } + end + local success = mcl_dye.apply_bone_meal(pointed_thing) + if success then + stack:take_item() + end + return stack + end, }) minetest.register_craftitem("mcl_dye:brown", { - inventory_image = "dye_brown.png", - _doc_items_longdesc = "Cocoa beans are a brown dye and can be used to plant cocoas.", - _doc_items_usagehelp = "Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.", - description = "Cocoa Beans", + inventory_image = "mcl_dye_brown.png", + _tt_help = S("Grows at the side of jungle trees"), + _doc_items_longdesc = S("Cocoa beans are a brown dye and can be used to plant cocoas."), + _doc_items_usagehelp = S("Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa."), + description = S("Cocoa Beans"), stack_max = 64, - groups = dyelocal.dyes[12][3], + groups = dyelocal.dyes[12][4], on_place = function(itemstack, placer, pointed_thing) return mcl_cocoas.place(itemstack, placer, pointed_thing, "mcl_cocoas:cocoa_1") end, diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr new file mode 100644 index 00000000..29cd4d20 --- /dev/null +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr @@ -0,0 +1,27 @@ +# textdomain: mcl_dye +Bone Meal=Knochenmehl +Light Grey Dye=Hellgrauer Farbstoff +Grey Dye=Grauer Farbstoff +Ink Sac=Tintenbeutel +Purple Dye=Violetter Farbstoff +Lapis Lazuli=Lapislazuli +Light Blue Dye=Hellblauer Farbstoff +Cyan Dye=Türkiser Farbstoff +Cactus Green=Kaktusgrün +Lime Dye=Lindgrüner Farbstoff +Dandelion Yellow=Löwenzahngelb +Cocoa Beans=Kakaobohnen +Orange Dye=Orange Farbstoff +Rose Red=Rosenrot +Magenta Dye=Magenta Farbstoff +Pink Dye=Rosa Farbstoff +This item is a dye which is used for dyeing and crafting.=Dieser Gegenstand ist ein Farbstoff, der zum Einfärben und in der Herstellung benutzt werden kann. +Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Rechtsklicken Sie auf ein Schaf, um seine Wolle zu färben. Andere Dinge werden mit der Fertigung eingefärbt. +Bone Meal=Knochenmehl +Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Knochenmehl ist ein weißer Farbstoff und auch nützlich als Dünger, um das Wachstum vieler Pflanzen zu beschleunigen. +Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Rechtsklicken Sie auf ein Schaf, um die Wolle weiß einzufärben. Rechtsklicken Sie auf eine Pflanze, um ihr Wachstum zu beschleunigen. Beachten Sie, dass nicht alle Pflanzen darauf ansprechen. Benutzen Sie es auf einem Grasblock, wächst viel hohes Gras und vielleicht auch ein paar Blumen. +Cocoa beans are a brown dye and can be used to plant cocoas.=Kakaobohnen sind ein brauner Farbstoff und werden benutzt, um Kakao anzupflanzen. +Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Rechtsklicken Sie auf ein Schaf, um die Wolle braun einzufärben. Rechtsklicken Sie an die Seite eines Dschungelbaumstamms (Dschungelholz), um eine junge Kakaoschote zu pflanzen. +Cocoa Beans=Kakaobohnen +Grows at the side of jungle trees=Wächst an der Seite von Dschungelbäumen +Speeds up plant growth=Beschleunigt Pflanzenwachstum diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.es.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.es.tr new file mode 100644 index 00000000..d20e8c96 --- /dev/null +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.es.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_dye +Bone Meal=Harina de hueso +Light Grey Dye=Tinte gris claro +Grey Dye=Tinte gris +Ink Sac=Saco de tinta +Purple Dye=Tinte púrpura +Lapis Lazuli=Lapislázuli +Light Blue Dye=Tinte azul claro +Cyan Dye=Tinte cian +Cactus Green=Tinte verde +Lime Dye=Tinte amarillo verdoso +Dandelion Yellow=Tinte amarillo +Cocoa Beans=Granos de cacao +Orange Dye=Tinte naranja +Rose Red=Tinte rojo +Magenta Dye=Tinte magenta +Pink Dye=Tinte rosado +This item is a dye which is used for dyeing and crafting.=Este artículo es un tinte que se utiliza para teñir y elaborar. +Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Haga clic derecho sobre una oveja para teñir su lana. Otras cosas pueden ser teñidas mediante la elaboración. +Bone Meal=Harina de hueso +Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=La harina de hueso es un tinte blanco y también es útil como fertilizante para acelerar el crecimiento de muchas plantas. +Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=RHaga clic derecho en una oveja para volver su lana blanca. Haga clic derecho en una planta para acelerar su crecimiento. Tenga en cuenta que no todas las plantas pueden ser fertilizadas de esta manera. Cuando haces clic derecho en un bloque de hierba, crecerán hierba alta y flores por todo el lugar. +Cocoa beans are a brown dye and can be used to plant cocoas.=Los granos de cacao son un tinte marrón y se pueden usar para plantar cacao. +Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Haga clic derecho en una oveja para convertir su lana en marrón. Haga clic derecho en el costado del tronco de un árbol de jungla para plantar un cacao joven. +Cocoa Beans=Granos de cacao diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr new file mode 100644 index 00000000..8d53cc73 --- /dev/null +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr @@ -0,0 +1,27 @@ +# textdomain: mcl_dye +Bone Meal=Poudre d'Os +Light Grey Dye=Teinture Gris Clair +Grey Dye=Teinture Gris +Ink Sac=Poche d'Encre +Purple Dye=Teinture Violette +Lapis Lazuli=Lapis Lazuli +Light Blue Dye=Teinture Bleu Clair +Cyan Dye=Teinture Cyan +Cactus Green=Cactus Vert +Lime Dye=Teinture Vert Clair +Dandelion Yellow=Pissenlit Jaune +Cocoa Beans=Fèves de Cacao +Orange Dye=Teinture Orange +Rose Red=Rose Rouge +Magenta Dye=Teinture Magenta +Pink Dye=Teinture Rose +This item is a dye which is used for dyeing and crafting.=Cet objet est un colorant utilisé pour la teinture et l'artisanat. +Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Clic droit sur un mouton pour teindre sa laine. D'autres choses sont teintes par l'artisanat. +Bone Meal=Farine d'Os +Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=La farine d'os est une teinture blanche et également utile comme engrais pour accélérer la croissance de nombreuses plantes. +Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Cliquez avec le bouton droit sur un mouton pour blanchir sa laine. Cliquez avec le bouton droit sur une plante pour accélérer sa croissance. Notez que toutes les plantes ne peuvent pas être fertilisées comme ça. Lorsque vous cliquez avec le bouton droit sur un bloc d'herbe, les hautes herbes et les fleurs poussent partout. +Cocoa beans are a brown dye and can be used to plant cocoas.=Les fèves de cacao ont une teinture brune et peuvent être utilisées pour planter du cacao. +Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Faites un clic droit sur un mouton pour brunir sa laine. Clic droit sur le côté d'un tronc d'arbre de la jungle (Bois Acajou) pour planter un jeune cacao. +Cocoa Beans=Fèves de Cacao +Grows at the side of jungle trees=Pousse à côté des arbres de la jungle +Speeds up plant growth=Accélère la croissance des plantes diff --git a/mods/ITEMS/mcl_dye/locale/template.txt b/mods/ITEMS/mcl_dye/locale/template.txt new file mode 100644 index 00000000..94e250f0 --- /dev/null +++ b/mods/ITEMS/mcl_dye/locale/template.txt @@ -0,0 +1,27 @@ +# textdomain: mcl_dye +Bone Meal= +Light Grey Dye= +Grey Dye= +Ink Sac= +Purple Dye= +Lapis Lazuli= +Light Blue Dye= +Cyan Dye= +Cactus Green= +Lime Dye= +Dandelion Yellow= +Cocoa Beans= +Orange Dye= +Rose Red= +Magenta Dye= +Pink Dye= +This item is a dye which is used for dyeing and crafting.= +Rightclick on a sheep to dye its wool. Other things are dyed by crafting.= +Bone Meal= +Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.= +Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.= +Cocoa beans are a brown dye and can be used to plant cocoas.= +Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.= +Cocoa Beans= +Grows at the side of jungle trees= +Speeds up plant growth= diff --git a/mods/ITEMS/mcl_dye/textures/dye_black.png b/mods/ITEMS/mcl_dye/textures/dye_black.png deleted file mode 100644 index 95a8df4a..00000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/mcl_dye_black.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_black.png new file mode 100644 index 00000000..e9aebf59 Binary files /dev/null and b/mods/ITEMS/mcl_dye/textures/mcl_dye_black.png differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_blue.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_blue.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_blue.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_blue.png diff --git a/mods/ITEMS/mcl_dye/textures/dye_brown.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_brown.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_brown.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_brown.png diff --git a/mods/ITEMS/mcl_dye/textures/dye_lightblue.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_light_blue.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_lightblue.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_light_blue.png diff --git a/mods/ITEMS/mcl_dye/textures/dye_green.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_lime.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_green.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_lime.png diff --git a/mods/ITEMS/mcl_dye/textures/dye_white.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_white.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_white.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_white.png diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua new file mode 100644 index 00000000..3dcf0671 --- /dev/null +++ b/mods/ITEMS/mcl_end/building.lua @@ -0,0 +1,201 @@ +-- Building blocks and decorative nodes +local S = minetest.get_translator("mcl_end") + +local mod_screwdriver = minetest.get_modpath("screwdriver") ~= nil +local on_rotate +if mod_screwdriver then + on_rotate = screwdriver.rotate_3way +end + +minetest.register_node("mcl_end:end_stone", { + description = S("End Stone"), + _doc_items_longdesc = doc.sub.items.temp.build, + tiles = {"mcl_end_end_stone.png"}, + stack_max = 64, + groups = {pickaxey=1, building_block=1, material_stone=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + after_dig_node = mcl_end.check_detach_chorus_plant, + _mcl_blast_resistance = 9, + _mcl_hardness = 3, +}) + +minetest.register_node("mcl_end:end_bricks", { + description = S("End Stone Bricks"), + _doc_items_longdesc = doc.sub.items.temp.build, + tiles = {"mcl_end_end_bricks.png"}, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=1, building_block=1, material_stone=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 9, + _mcl_hardness = 0.8, +}) + +minetest.register_node("mcl_end:purpur_block", { + description = S("Purpur Block"), + _doc_items_longdesc = doc.sub.items.temp.build, + tiles = {"mcl_end_purpur_block.png"}, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, +}) + +minetest.register_node("mcl_end:purpur_pillar", { + description = S("Purpur Pillar"), + _doc_items_longdesc = doc.sub.items.temp.build, + stack_max = 64, + paramtype2 = "facedir", + is_ground_content = false, + on_place = mcl_util.rotate_axis, + tiles = {"mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar.png"}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + on_rotate = on_rotate, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, +}) + +minetest.register_node("mcl_end:end_rod", { + description = S("End Rod"), + _doc_items_longdesc = S("End rods are decorative light sources."), + tiles = { + "mcl_end_end_rod_top.png", + "mcl_end_end_rod_bottom.png", + "mcl_end_end_rod_side.png", + "mcl_end_end_rod_side.png", + "mcl_end_end_rod_side.png", + "mcl_end_end_rod_side.png", + }, + drawtype = "nodebox", + is_ground_content = false, + paramtype = "light", + paramtype2 = "facedir", + light_source = minetest.LIGHT_MAX, + sunlight_propagates = true, + groups = { dig_immediate=3, deco_block=1, destroy_by_lava_flow=1, }, + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.125, 0.125, -0.4375, 0.125}, -- Base + {-0.0625, -0.4375, -0.0625, 0.0625, 0.5, 0.0625}, -- Rod + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, -- Base + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, -- Base + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:get_pos() + if placer_pos then + local dir = { + x = p1.x - placer_pos.x, + y = p1.y - placer_pos.y, + z = p1.z - placer_pos.z + } + param2 = minetest.dir_to_facedir(dir) + end + + if p0.y - 1 == p1.y then + param2 = 20 + elseif p0.x - 1 == p1.x then + param2 = 16 + elseif p0.x + 1 == p1.x then + param2 = 12 + elseif p0.z - 1 == p1.z then + param2 = 8 + elseif p0.z + 1 == p1.z then + param2 = 4 + end + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + + sounds = mcl_sounds.node_sound_glass_defaults(), + _mcl_blast_resistance = 0, +}) + +minetest.register_node("mcl_end:dragon_egg", { + description = S("Dragon Egg"), + _doc_items_longdesc = S("A dragon egg is a decorative item which can be placed."), + tiles = { + "mcl_end_dragon_egg.png", + "mcl_end_dragon_egg.png", + "mcl_end_dragon_egg.png", + "mcl_end_dragon_egg.png", + "mcl_end_dragon_egg.png", + "mcl_end_dragon_egg.png", + }, + drawtype = "nodebox", + is_ground_content = false, + paramtype = "light", + light_source = 1, + node_box = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.375, 0.375, -0.4375, 0.375}, + {-0.5, -0.4375, -0.5, 0.5, -0.1875, 0.5}, + {-0.4375, -0.1875, -0.4375, 0.4375, 0, 0.4375}, + {-0.375, 0, -0.375, 0.375, 0.125, 0.375}, + {-0.3125, 0.125, -0.3125, 0.3125, 0.25, 0.3125}, + {-0.25, 0.25, -0.25, 0.25, 0.3125, 0.25}, + {-0.1875, 0.3125, -0.1875, 0.1875, 0.375, 0.1875}, + {-0.125, 0.375, -0.125, 0.125, 0.4375, 0.125}, + {-0.0625, 0.4375, -0.0625, 0.0625, 0.5, 0.0625}, + } + }, + selection_box = { + type = "regular", + }, + groups = {handy=1, falling_node = 1, deco_block = 1, not_in_creative_inventory = 1, dig_by_piston = 1 }, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 9, + _mcl_hardness = 3, + -- TODO: Make dragon egg teleport on punching +}) + + + +-- Crafting recipes +minetest.register_craft({ + output = "mcl_end:end_bricks 4", + recipe = { + {"mcl_end:end_stone", "mcl_end:end_stone"}, + {"mcl_end:end_stone", "mcl_end:end_stone"}, + } +}) + +minetest.register_craft({ + output = "mcl_end:purpur_block 4", + recipe = { + {"mcl_end:chorus_fruit_popped", "mcl_end:chorus_fruit_popped",}, + {"mcl_end:chorus_fruit_popped", "mcl_end:chorus_fruit_popped",}, + } +}) + +minetest.register_craft({ + output = "mcl_end:end_rod 4", + recipe = { + {"mcl_mobitems:blaze_rod"}, + {"mcl_end:chorus_fruit_popped"}, + }, +}) + diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua new file mode 100644 index 00000000..171ff37b --- /dev/null +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -0,0 +1,575 @@ +-- Chorus plants +-- This includes chorus flowers, chorus plant stem nodes and chorus fruit + +local S = minetest.get_translator("mcl_end") + +--- Plant parts --- + +local MAX_FLOWER_AGE = 5 -- Maximum age of chorus flower before it dies + +local chorus_flower_box = { + type = "fixed", + fixed = { + {-0.5, -0.375, -0.375, 0.5, 0.375, 0.375}, + {-0.375, -0.375, 0.375, 0.375, 0.375, 0.5}, + {-0.375, -0.375, -0.5, 0.375, 0.375, -0.375}, + {-0.375, 0.375, -0.375, 0.375, 0.5, 0.375}, + {-0.375, -0.5, -0.375, 0.375, -0.375, 0.375}, + } +} + +-- Helper function +local function round(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +-- This is a list of nodes that SHOULD NOT call their detach function +local no_detach = {} + +-- This detaches all chorus plants that are/were attached +-- at start_pos. +mcl_end.detach_chorus_plant = function(start_pos, digger) + -- This node should not call a detach function, do NOTHING + local hash = minetest.hash_node_position(start_pos) + if no_detach[hash] ~= nil then + return + end + + -- This node SHOULD be detached, make sure no others are + no_detach = {} + + local neighbors = { + { x=0, y=1, z=0 }, + { x=0, y=0, z=1 }, + { x=-1, y=0, z=0 }, + { x=0, y=0, z=-1 }, + { x=1, y=0, z=0 }, + { x=0, y=-1, z=0 }, + } + table.insert(neighbors, { x=0, y=-1, z=0 }) + local tree_start_posses = {} + for i=1, #neighbors do + table.insert(tree_start_posses, vector.add(start_pos, neighbors[i])) + end + + -- From the start_pos, we look at the 6 possible directions. Each of these can + -- have a full independent chorus plant ("tree") that might be detached. + for t=1, #tree_start_posses do + -- For each "tree", we do a depth-first search to traverse all + -- chorus plant nodes. + local touched_nodes_hashes = { minetest.hash_node_position(start_pos) } + local check_posses = { tree_start_posses[t] } + local chorus_nodes = {} + local break_tree = true + while #check_posses > 0 do + local pos = check_posses[1] + + -- Don't just count neighbors as being touched, count THIS NODE as well + -- This will prevent it from getting stuck in an endless loop + if not touched_nodes_hashes[minetest.hash_node_position(pos)] then + local node = minetest.get_node(pos) + touched_nodes_hashes[minetest.hash_node_position(pos)] = true + if node.name == "mcl_end:end_stone" then + -- End stone found, the algorithm ends here (haha!) + -- without destroying any nodes, because chorus plants + -- attach to end stone. + break_tree = false + break + elseif minetest.get_item_group(node.name, "chorus_plant") == 1 then + table.insert(chorus_nodes, pos) + for i=1, #neighbors do + local newpos = vector.add(pos, neighbors[i]) + if not touched_nodes_hashes[minetest.hash_node_position(newpos)] then + table.insert(check_posses, vector.add(pos, neighbors[i])) + end + end + end + end + + table.remove(check_posses, 1) + end + if break_tree then + -- If we traversed the entire chorus plant and it was not attached to end stone: + -- Drop ALL the chorus nodes we found. + for c=1, #chorus_nodes do + no_detach[ minetest.hash_node_position(chorus_nodes[c]) ] = true + if digger then + minetest.node_dig(chorus_nodes[c], { name = "mcl_end:chorus_plant" }, digger) + else + minetest.remove_node(chorus_nodes[c]) + end + end + end + end + + no_detach = {} +end + +mcl_end.check_detach_chorus_plant = function(pos, oldnode, oldmetadata, digger) + mcl_end.detach_chorus_plant(pos, digger) +end + +mcl_end.check_blast_chorus_plant = function(pos) + mcl_end.detach_chorus_plant(pos) +end + +minetest.register_node("mcl_end:chorus_flower", { + description = S("Chorus Flower"), + _tt_help = S("Grows on end stone"), + _doc_items_longdesc = S("A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow."), + _doc_items_usagehelp = S("Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem."), + tiles = { + "mcl_end_chorus_flower.png", + "mcl_end_chorus_flower.png", + "mcl_end_chorus_flower.png", + "mcl_end_chorus_flower.png", + "mcl_end_chorus_flower.png", + "mcl_end_chorus_flower.png", + }, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + node_box = chorus_flower_box, + selection_box = { type = "regular" }, + sounds = mcl_sounds.node_sound_wood_defaults(), + groups = {handy=1,axey=1, deco_block = 1, not_in_creative_inventory = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1}, + + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + local node_under = minetest.get_node(pointed_thing.under) + local node_above = minetest.get_node(pointed_thing.above) + if placer and not placer:get_player_control().sneak then + -- Use pointed node's on_rightclick function first, if present + if minetest.registered_nodes[node_under.name] and minetest.registered_nodes[node_under.name].on_rightclick then + return minetest.registered_nodes[node_under.name].on_rightclick(pointed_thing.under, node_under, placer, itemstack) or itemstack + end + end + + --[[ Part 1: Check placement rules. Placement is legal if one of the following + conditions is met: + 1) On top of end stone or chorus plant + 2) On top of air and horizontally adjacent to exactly 1 chorus plant ]] + local pos + if minetest.registered_nodes[node_under.name].buildable_to then + pos = pointed_thing.under + else + pos = pointed_thing.above + end + + + local below = {x=pos.x, y=pos.y-1, z=pos.z} + local node_below = minetest.get_node(below) + local plant_ok = false + -- Condition 1 + if node_below.name == "mcl_end:chorus_plant" or node_below.name == "mcl_end:end_stone" then + plant_ok = true + -- Condition 2 + elseif node_below.name == "air" then + local around = { + { x= 1, y=0, z= 0 }, + { x=-1, y=0, z= 0 }, + { x= 0, y=0, z= 1 }, + { x= 0, y=0, z=-1 }, + } + local around_count = 0 + for a=1, #around do + local pos_side = vector.add(pos, around[a]) + local node_side = minetest.get_node(pos_side) + if node_side.name == "mcl_end:chorus_plant" then + around_count = around_count + 1 + if around_count > 1 then + break + end + end + end + if around_count == 1 then + plant_ok = true + end + end + if plant_ok then + -- Placement OK! Proceed normally + local it, suc = minetest.item_place_node(itemstack, placer, pointed_thing) + if suc then + minetest.sound_play(mcl_sounds.node_sound_wood_defaults().place, {pos = pos}, true) + end + return it + else + return itemstack + end + end, + after_dig_node = mcl_end.check_detach_chorus_plant, + on_blast = mcl_end.check_blast_chorus_plant, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, +}) + +minetest.register_node("mcl_end:chorus_flower_dead", { + description = S("Dead Chorus Flower"), + _tt_help = S("Grows on end stone"), + _doc_items_longdesc = S("This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again."), + tiles = { + "mcl_end_chorus_flower_dead.png", + "mcl_end_chorus_flower_dead.png", + "mcl_end_chorus_flower_dead.png", + "mcl_end_chorus_flower_dead.png", + "mcl_end_chorus_flower_dead.png", + "mcl_end_chorus_flower_dead.png", + }, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + node_box = chorus_flower_box, + selection_box = { type = "regular" }, + sounds = mcl_sounds.node_sound_wood_defaults(), + drop = "mcl_end:chorus_flower", + groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1}, + after_dig_node = mcl_end.check_detach_chorus_plant, + on_blast = mcl_end.check_blast_chorus_plant, + _mcl_blast_resistance = 2, + _mcl_hardness = 0.4, +}) + +minetest.register_node("mcl_end:chorus_plant", { + description = S("Chorus Plant Stem"), + _doc_items_longdesc = S("A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers."), + _doc_items_usagehelp = S("The stem attaches itself to end stone and other chorus blocks."), + tiles = { + "mcl_end_chorus_plant.png", + "mcl_end_chorus_plant.png", + "mcl_end_chorus_plant.png", + "mcl_end_chorus_plant.png", + "mcl_end_chorus_plant.png", + "mcl_end_chorus_plant.png", + }, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + node_box = { + type = "connected", + fixed = { -0.25, -0.25, -0.25, 0.25, 0.25, 0.25 }, -- Core + connect_top = { -0.1875, 0.25, -0.1875, 0.1875, 0.5, 0.1875 }, + connect_left = { -0.5, -0.1875, -0.1875, -0.25, 0.1875, 0.1875 }, + connect_right = { 0.25, -0.1875, -0.1875, 0.5, 0.1875, 0.1875 }, + connect_bottom = { -0.1875, -0.5, -0.25, 0.1875, -0.25, 0.25 }, + connect_front = { -0.1875, -0.1875, -0.5, 0.1875, 0.1875, -0.25 }, + connect_back = { -0.1875, -0.1875, 0.25, 0.1875, 0.1875, 0.5 }, + }, + connect_sides = { "top", "bottom", "front", "back", "left", "right" }, + connects_to = {"group:chorus_plant", "mcl_end:end_stone"}, + sounds = mcl_sounds.node_sound_wood_defaults(), + drop = { + items = { + { items = { "mcl_end:chorus_fruit"}, rarity = 2 }, + } + }, + groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1, chorus_plant = 1 }, + + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + local node_under = minetest.get_node(pointed_thing.under) + local node_above = minetest.get_node(pointed_thing.above) + if placer and not placer:get_player_control().sneak then + -- Use pointed node's on_rightclick function first, if present + if minetest.registered_nodes[node_under.name] and minetest.registered_nodes[node_under.name].on_rightclick then + return minetest.registered_nodes[node_under.name].on_rightclick(pointed_thing.under, node_under, placer, itemstack) or itemstack + end + end + + --[[ Part 1: Check placement rules. Placement is legal if this + condition is met: + - placed on end stone or any chorus node ]] + local pos_place, node_check + if minetest.registered_nodes[node_under.name].buildable_to then + pos_place = pointed_thing.under + node_check = node_above + else + pos_place = pointed_thing.above + node_check = node_under + end + local plant_ok = false + if node_check.name == "mcl_end:end_stone" or minetest.get_item_group(node_check.name, "chorus_plant") > 0 then + plant_ok = true + end + if plant_ok then + -- Placement OK! Proceed normally + local it, suc = minetest.item_place_node(itemstack, placer, pointed_thing) + if suc then + minetest.sound_play(mcl_sounds.node_sound_wood_defaults().place, {pos = pos_place}, true) + end + return it + else + return itemstack + end + end, + after_dig_node = mcl_end.check_detach_chorus_plant, + on_blast = mcl_end.check_blast_chorus_plant, + _mcl_blast_resistance = 2, + _mcl_hardness = 0.4, +}) + +-- Grow a complete chorus plant at pos +mcl_end.grow_chorus_plant = function(pos, node) + local flowers = { pos } + -- Plant initial flower (if it isn't there already) + if not node then + node = minetest.get_node(pos) + end + if node.name ~= "mcl_end:chorus_flower" then + minetest.set_node(pos, { name = "mcl_end:chorus_flower" }) + end + while true do + local new_flowers_list = {} + for f=1, #flowers do + local new_flowers = mcl_end.grow_chorus_plant_step(flowers[f], minetest.get_node(flowers[f])) + if #new_flowers > 0 then + table.insert(new_flowers_list, new_flowers) + end + end + if #new_flowers_list == 0 then + return + end + flowers = {} + for l=1, #new_flowers_list do + for f=1, #new_flowers_list[l] do + table.insert(flowers, new_flowers_list[l][f]) + end + end + end +end + +-- Grow a single step of a chorus plant at pos. +-- Pos must be a chorus flower. +mcl_end.grow_chorus_plant_step = function(pos, node) + local new_flower_buds = {} + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + local node_above = minetest.get_node(above) + local around = { + { x=-1, y=0, z= 0 }, + { x= 1, y=0, z= 0 }, + { x= 0, y=0, z=-1 }, + { x= 0, y=0, z= 1 }, + } + local air_around = true + for a=1, #around do + if minetest.get_node(vector.add(above, around[a])).name ~= "air" then + air_around = false + break + end + end + local grown = false + if node_above.name == "air" and air_around then + local branching = false + local h = 0 + for y=1, 4 do + local checkpos = {x=pos.x, y=pos.y-y, z=pos.z} + local node = minetest.get_node(checkpos) + if node.name == "mcl_end:chorus_plant" then + h = y + if not branching then + for a=1, #around do + local node_side = minetest.get_node(vector.add(checkpos, around[a])) + if node_side.name == "mcl_end:chorus_plant" then + branching = true + end + end + end + else + break + end + end + + local grow_chance + if h <= 1 then + grow_chance = 100 + elseif h == 2 and branching == false then + grow_chance = 60 + elseif h == 2 and branching == true then + grow_chance = 50 + elseif h == 3 and branching == false then + grow_chance = 40 + elseif h == 3 and branching == true then + grow_chance = 25 + elseif h == 4 and branching == false then + grow_chance = 20 + end + + if grow_chance then + local new_flowers = {} + local r = math.random(1, 100) + local age = node.param2 + if r <= grow_chance then + table.insert(new_flowers, above) + else + age = age + 1 + local branches + if branching == false then + branches = math.random(1, 4) + elseif branching == true then + branches = math.random(0, 3) + end + local branch_grown = false + for b=1, branches do + local next_branch = math.random(1, #around) + local branch = vector.add(pos, around[next_branch]) + local below_branch = vector.add(branch, {x=0,y=-1,z=0}) + if minetest.get_node(below_branch).name == "air" then + table.insert(new_flowers, branch) + end + end + end + + for _, f in ipairs(new_flowers) do + if age >= MAX_FLOWER_AGE then + local nn = minetest.get_node(f).name + if nn ~= "mcl_end:chorus_flower" and nn ~= "mcl_end:chorus_flower_dead" then + minetest.set_node(f, {name="mcl_end:chorus_flower_dead"}) + grown = true + end + else + local nn = minetest.get_node(f).name + if nn ~= "mcl_end:chorus_flower" and nn ~= "mcl_end:chorus_flower_dead" then + minetest.set_node(f, {name="mcl_end:chorus_flower", param2 = age}) + table.insert(new_flower_buds, f) + grown = true + end + end + end + if #new_flowers >= 1 then + minetest.set_node(pos, {name="mcl_end:chorus_plant"}) + grown = true + end + end + end + if not grown then + -- FIXME: In the End, chorus plant fails to generate thru mapchunk borders. + -- So the chorus plants are capped at a fixed height. + -- The mapgen needs to be taught somehow how to deal with this. + minetest.set_node(pos, {name = "mcl_end:chorus_flower_dead"}) + end + return new_flower_buds +end + +--- ABM --- +minetest.register_abm({ + label = "Chorus plant growth", + nodenames = { "mcl_end:chorus_flower" }, + interval = 35.0, + chance = 4.0, + action = function(pos, node, active_object_count, active_object_count_wider) + mcl_end.grow_chorus_plant_step(pos, node) + end, +}) + +--- Chorus fruit --- + +-- Attempt to randomly teleport the player within a 8×8×8 box around. Rules: +-- * Not in solid blocks. +-- * Not in liquids. +-- * Always on top of a solid block +-- * Maximum attempts: 16 +-- +-- Returns true on success. +local random_teleport = function(player) + local pos = player:get_pos() + -- 16 attempts to find a suitable position + for a=1, 16 do + -- Teleportation box + local x,y,z + x = math.random(round(pos.x)-8, round(pos.x)+8) + y = math.random(math.ceil(pos.y)-8, math.ceil(pos.y)+8) + z = math.random(round(pos.z)-8, round(pos.z)+8) + local node_cache = {} + local ground_level = false + -- Scan nodes from selected position until we hit ground + for t=0, 16 do + local tpos = {x=x, y=y-t, z=z} + local tnode = minetest.get_node(tpos) + if tnode.name == "mcl_core:void" or tnode.name == "ignore" then + break + end + local tdef = minetest.registered_nodes[tnode.name] + table.insert(node_cache, {pos=tpos, node=tnode}) + if tdef.walkable then + ground_level = true + break + end + end + -- Ground found? Then let's check if the player has enough room + if ground_level and #node_cache >= 1 then + local streak = 0 + local last_was_walkable = true + for c=#node_cache, 1, -1 do + local tpos = node_cache[c].pos + local tnode = node_cache[c].node + local tdef = minetest.registered_nodes[tnode.name] + -- Player needs a space of 2 safe non-liquid nodes on top of a walkable node + if not tdef.walkable and tdef.liquidtype == "none" and tdef.damage_per_second <= 0 then + if (streak == 0 and last_was_walkable) or (streak > 0) then + streak = streak + 1 + end + else + streak = 0 + end + last_was_walkable = tdef.walkable + if streak >= 2 then + -- JACKPOT! Now we can teleport. + local goal = {x=tpos.x, y=tpos.y-1.5, z=tpos.z} + player:set_pos(goal) + minetest.sound_play({name="mcl_end_teleport", gain=0.8}, {pos=goal, max_hear_distance=16}, true) + return true + end + end + end + end + return false +end + +-- Randomly teleport player and update hunger +local eat_chorus_fruit = function(itemstack, player, pointed_thing) + if player and pointed_thing and pointed_thing.type == "node" and not player:get_player_control().sneak then + local node_under = minetest.get_node(pointed_thing.under) + -- Use pointed node's on_rightclick function first, if present + if minetest.registered_nodes[node_under.name] and minetest.registered_nodes[node_under.name].on_rightclick then + return minetest.registered_nodes[node_under.name].on_rightclick(pointed_thing.under, node_under, player, itemstack) or itemstack + end + end + local count = itemstack:get_count() + local new_itemstack = minetest.do_item_eat(4, nil, itemstack, player, pointed_thing) + local new_count = new_itemstack:get_count() + if count ~= new_count or new_itemstack:get_name() ~= "mcl_end:chorus_fruit" or (minetest.settings:get_bool("creative_mode") == true) then + random_teleport(player) + end + return new_itemstack +end + +minetest.register_craftitem("mcl_end:chorus_fruit", { + description = S("Chorus Fruit"), + _tt_help = S("Randomly teleports you when eaten"), + _doc_items_longdesc = S("A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to."), + wield_image = "mcl_end_chorus_fruit.png", + inventory_image = "mcl_end_chorus_fruit.png", + on_place = eat_chorus_fruit, + on_secondary_use = eat_chorus_fruit, + groups = { food = 2, transport = 1, eatable = 4, can_eat_when_full = 1 }, + _mcl_saturation = 2.4, + stack_max = 64, +}) + +minetest.register_craftitem("mcl_end:chorus_fruit_popped", { + description = S("Popped Chorus Fruit"), + _doc_items_longdesc = doc.sub.items.temp.craftitem, + wield_image = "mcl_end_chorus_fruit_popped.png", + inventory_image = "mcl_end_chorus_fruit_popped.png", + groups = { craftitem = 1 }, + stack_max = 64, +}) + +--- Crafting --- +minetest.register_craft({ + type = "cooking", + output = "mcl_end:chorus_fruit_popped", + recipe = "mcl_end:chorus_fruit", + cooktime = 10, +}) + diff --git a/mods/ITEMS/mcl_end/depends.txt b/mods/ITEMS/mcl_end/depends.txt index a1ffcc82..2adb4b59 100644 --- a/mods/ITEMS/mcl_end/depends.txt +++ b/mods/ITEMS/mcl_end/depends.txt @@ -1,4 +1,5 @@ mcl_sounds -mcl_throwing mcl_util doc_items +mcl_worlds +mcl_structures diff --git a/mods/ITEMS/mcl_end/eye_of_ender.lua b/mods/ITEMS/mcl_end/eye_of_ender.lua new file mode 100644 index 00000000..117fb73c --- /dev/null +++ b/mods/ITEMS/mcl_end/eye_of_ender.lua @@ -0,0 +1,156 @@ +-- Eye of Ender +local S = minetest.get_translator("mcl_end") + +minetest.register_entity("mcl_end:ender_eye", { + physical = false, + textures = {"mcl_end_ender_eye.png"}, + visual_size = {x=1.5, y=1.5}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + + -- Save and restore age + get_staticdata = function(self) + return tostring(self._age) + end, + on_activate = function(self, staticdata, dtime_s) + local age = tonumber(staticdata) + if type(age) == "number" then + self._age = age + if self._age >= 2 then + self._phase = 1 + else + self._phase = 0 + end + end + end, + + on_step = function(self, dtime) + self._age = self._age + dtime + if self._age >= 3 then + -- End of life + local r = math.random(1,5) + if r == 1 or minetest.settings:get_bool("creative_mode") then + -- 20% chance to get destroyed completely. + -- 100% if in Creative Mode + self.object:remove() + return + else + -- 80% to drop as an item + local pos = self.object:get_pos() + local v = self.object:get_velocity() + self.object:remove() + local item = minetest.add_item(pos, "mcl_end:ender_eye") + item:set_velocity(v) + return + end + elseif self._age >= 2 then + if self._phase == 0 then + self._phase = 1 + -- Stop the eye and wait for another second. + -- The vertical speed changes are just eye candy. + self.object:set_acceleration({x=0, y=-3, z=0}) + self.object:set_velocity({x=0, y=self.object:get_velocity().y*0.2, z=0}) + end + else + -- Fly normally and generate particles + local pos = self.object:get_pos() + pos.x = pos.x + math.random(-1, 1)*0.5 + pos.y = pos.y + math.random(-1, 0)*0.5 + pos.z = pos.z + math.random(-1, 1)*0.5 + minetest.add_particle({ + pos = pos, + texture = "mcl_particles_teleport.png", + expirationtime = 1, + velocity = {x=math.random(-1, 1)*0.1, y=math.random(-30, 0)*0.1, z=math.random(-1, 1)*0.1}, + acceleration = {x=0, y=0, z=0}, + size = 2.5, + }) + end + end, + + _age = 0, -- age in seconds + _phase = 0, -- phase 0: flying. phase 1: idling in mid air, about to drop or shatter +}) + +minetest.register_craftitem("mcl_end:ender_eye", { + description = S("Eye of Ender"), + _tt_help = S("Guides the way to the mysterious End dimension"), + _doc_items_longdesc = S("This item is used to locate End portal shrines in the Overworld and to activate End portals.") .. "\n" .. S("NOTE: The End dimension is currently incomplete and might change in future versions."), + _doc_items_usagehelp = S("Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.") .. "\n" .. S("To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame."), + wield_image = "mcl_end_ender_eye.png", + inventory_image = "mcl_end_ender_eye.png", + stack_max = 64, + -- Throw eye of ender to make it fly to the closest stronghold + on_use = function(itemstack, user, pointed_thing) + if user == nil then + return + end + local origin = user:get_pos() + origin.y = origin.y + 1.5 + local strongholds = mcl_structures.get_registered_structures("stronghold") + local dim = mcl_worlds.pos_to_dimension(origin) + local is_creative = minetest.settings:get_bool("creative_mode") + + -- Just drop the eye of ender if there are no strongholds + if #strongholds <= 0 or dim ~= "overworld" then + if not is_creative then + minetest.item_drop(ItemStack("mcl_end:ender_eye"), user, user:get_pos()) + itemstack:take_item() + end + return itemstack + end + + -- Find closest stronghold. + -- Note: Only the horizontal axes are taken into account. + local closest_stronghold + local lowest_dist + for s=1, #strongholds do + local h_pos = table.copy(strongholds[s].pos) + local h_origin = table.copy(origin) + h_pos.y = 0 + h_origin.y = 0 + local dist = vector.distance(h_origin, h_pos) + if not closest_stronghold then + closest_stronghold = strongholds[s] + lowest_dist = dist + else + if dist < lowest_dist then + closest_stronghold = strongholds[s] + lowest_dist = dist + end + end + end + + -- Throw it! + local obj = minetest.add_entity(origin, "mcl_end:ender_eye") + local dir + + if lowest_dist <= 25 then + local velocity = 4 + -- Stronghold is close: Fly directly to stronghold and take Y into account. + dir = vector.normalize(vector.direction(origin, closest_stronghold.pos)) + obj:set_velocity({x=dir.x*velocity, y=dir.y*velocity, z=dir.z*velocity}) + else + local velocity = 12 + -- Don't care about Y if stronghold is still far away. + -- Fly to direction of X/Z, and always upwards so it can be seen easily. + local o = {x=origin.x, y=0, z=origin.z} + local s = {x=closest_stronghold.pos.x, y=0, z=closest_stronghold.pos.z} + dir = vector.normalize(vector.direction(o, s)) + obj:set_acceleration({x=dir.x*-3, y=4, z=dir.z*-3}) + obj:set_velocity({x=dir.x*velocity, y=3, z=dir.z*velocity}) + end + + + if not is_creative then + itemstack:take_item() + end + return itemstack + end, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mcl_end:ender_eye", + recipe = {"mcl_mobitems:blaze_powder", "mcl_throwing:ender_pearl"}, +}) diff --git a/mods/ITEMS/mcl_end/init.lua b/mods/ITEMS/mcl_end/init.lua index 9bd21c78..e3ca8a86 100644 --- a/mods/ITEMS/mcl_end/init.lua +++ b/mods/ITEMS/mcl_end/init.lua @@ -1,322 +1,6 @@ --- Nodes -minetest.register_node("mcl_end:end_stone", { - description = "End Stone", - _doc_items_longdesc = doc.sub.items.temp.build, - tiles = {"mcl_end_end_stone.png"}, - stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 45, - _mcl_hardness = 3, -}) - -minetest.register_node("mcl_end:end_bricks", { - description = "End Stone Bricks", - _doc_items_longdesc = doc.sub.items.temp.build, - tiles = {"mcl_end_end_bricks.png"}, - is_ground_content = false, - stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, - _mcl_hardness = 0.8, -}) - -minetest.register_node("mcl_end:purpur_block", { - description = "Purpur Block", - _doc_items_longdesc = doc.sub.items.temp.build, - tiles = {"mcl_end_purpur_block.png"}, - is_ground_content = false, - stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, - _mcl_hardness = 1.5, -}) - -minetest.register_node("mcl_end:purpur_pillar", { - description = "Purpur Pillar", - _doc_items_longdesc = doc.sub.items.temp.build, - stack_max = 64, - paramtype2 = "facedir", - is_ground_content = false, - on_place = mcl_util.rotate_axis, - tiles = {"mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, - _mcl_hardness = 1.5, -}) - -minetest.register_node("mcl_end:end_rod", { - description = "End Rod", - _doc_items_longdesc = "End rods are decorational light sources.", - tiles = { - "mcl_end_end_rod_top.png", - "mcl_end_end_rod_bottom.png", - "mcl_end_end_rod_side.png", - "mcl_end_end_rod_side.png", - "mcl_end_end_rod_side.png", - "mcl_end_end_rod_side.png", - }, - drawtype = "nodebox", - is_ground_content = false, - paramtype = "light", - paramtype2 = "facedir", - light_source = 14, - sunlight_propagates = true, - groups = { dig_immediate=3, deco_block=1, destroy_by_lava_flow=1, }, - node_box = { - type = "fixed", - fixed = { - {-0.125, -0.5, -0.125, 0.125, -0.4375, 0.125}, -- Base - {-0.0625, -0.4375, -0.0625, 0.0625, 0.5, 0.0625}, -- Rod - }, - }, - selection_box = { - type = "fixed", - fixed = { - {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, -- Base - }, - }, - collision_box = { - type = "fixed", - fixed = { - {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, -- Base - }, - }, - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - - local p0 = pointed_thing.under - local p1 = pointed_thing.above - local param2 = 0 - - local placer_pos = placer:getpos() - if placer_pos then - local dir = { - x = p1.x - placer_pos.x, - y = p1.y - placer_pos.y, - z = p1.z - placer_pos.z - } - param2 = minetest.dir_to_facedir(dir) - end - - if p0.y - 1 == p1.y then - param2 = 20 - elseif p0.x - 1 == p1.x then - param2 = 16 - elseif p0.x + 1 == p1.x then - param2 = 12 - elseif p0.z - 1 == p1.z then - param2 = 8 - elseif p0.z + 1 == p1.z then - param2 = 4 - end - - return minetest.item_place(itemstack, placer, pointed_thing, param2) - end, - - sounds = mcl_sounds.node_sound_glass_defaults(), - _mcl_blast_resistance = 0, -}) - -minetest.register_node("mcl_end:dragon_egg", { - description = "Dragon Egg", - _doc_items_longdesc = "A dragon egg is a decorational item which can be placed.", - tiles = { - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - "mcl_end_dragon_egg.png", - }, - drawtype = "nodebox", - is_ground_content = false, - paramtype = "light", - light_source = 1, - node_box = { - type = "fixed", - fixed = { - {-0.375, -0.5, -0.375, 0.375, -0.4375, 0.375}, - {-0.5, -0.4375, -0.5, 0.5, -0.1875, 0.5}, - {-0.4375, -0.1875, -0.4375, 0.4375, 0, 0.4375}, - {-0.375, 0, -0.375, 0.375, 0.125, 0.375}, - {-0.3125, 0.125, -0.3125, 0.3125, 0.25, 0.3125}, - {-0.25, 0.25, -0.25, 0.25, 0.3125, 0.25}, - {-0.1875, 0.3125, -0.1875, 0.1875, 0.375, 0.1875}, - {-0.125, 0.375, -0.125, 0.125, 0.4375, 0.125}, - {-0.0625, 0.4375, -0.0625, 0.0625, 0.5, 0.0625}, - } - }, - selection_box = { - type = "regular", - }, - groups = {handy=1, falling_node = 1, deco_block = 1, not_in_creative_inventory = 1, dig_by_piston = 1 }, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 45, - _mcl_hardness = 3, - -- TODO: Make dragon egg teleport on punching -}) - -local chorus_flower_box = { - type = "fixed", - fixed = { - {-0.5, -0.375, -0.375, 0.5, 0.375, 0.375}, - {-0.375, -0.375, 0.375, 0.375, 0.375, 0.5}, - {-0.375, -0.375, -0.5, 0.375, 0.375, -0.375}, - {-0.375, 0.375, -0.375, 0.375, 0.5, 0.375}, - {-0.375, -0.5, -0.375, 0.375, -0.375, 0.375}, - } -} - -minetest.register_node("mcl_end:chorus_flower", { - description = "Chorus Flower", - tiles = { - "mcl_end_chorus_flower.png", - "mcl_end_chorus_flower.png", - "mcl_end_chorus_flower.png", - "mcl_end_chorus_flower.png", - "mcl_end_chorus_flower.png", - "mcl_end_chorus_flower.png", - }, - drawtype = "nodebox", - paramtype = "light", - sunlight_propagates = true, - node_box = chorus_flower_box, - selection_box = { type = "regular" }, - sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,}, - _mcl_blast_resistance = 2, - _mcl_hardness = 0.4, -}) - -minetest.register_node("mcl_end:chorus_flower_dead", { - description = "Dead Chorus Flower", - tiles = { - "mcl_end_chorus_flower_dead.png", - "mcl_end_chorus_flower_dead.png", - "mcl_end_chorus_flower_dead.png", - "mcl_end_chorus_flower_dead.png", - "mcl_end_chorus_flower_dead.png", - "mcl_end_chorus_flower_dead.png", - }, - drawtype = "nodebox", - paramtype = "light", - sunlight_propagates = true, - node_box = chorus_flower_box, - selection_box = { type = "regular" }, - sounds = mcl_sounds.node_sound_wood_defaults(), - drop = "mcl_end:chorus_flower", - groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,}, - _mcl_blast_resistance = 2, - _mcl_hardness = 0.4, -}) - -minetest.register_node("mcl_end:chorus_plant", { - description = "Chorus Plant", - tiles = { - "mcl_end_chorus_plant.png", - "mcl_end_chorus_plant.png", - "mcl_end_chorus_plant.png", - "mcl_end_chorus_plant.png", - "mcl_end_chorus_plant.png", - "mcl_end_chorus_plant.png", - }, - drawtype = "nodebox", - paramtype = "light", - sunlight_propagates = true, - -- TODO: Maybe improve nodebox a bit to look more “natural” - node_box = { - type = "connected", - fixed = { -0.25, -0.25, -0.25, 0.25, 0.25, 0.25 }, -- Core - connect_top = { -0.1875, 0.25, -0.1875, 0.1875, 0.5, 0.1875 }, - connect_left = { -0.5, -0.1875, -0.1875, -0.25, 0.1875, 0.1875 }, - connect_right = { 0.25, -0.1875, -0.1875, 0.5, 0.1875, 0.1875 }, - connect_bottom = { -0.1875, -0.5, -0.25, 0.1875, -0.25, 0.25 }, - connect_front = { -0.1875, -0.1875, -0.5, 0.1875, 0.1875, -0.25 }, - connect_back = { -0.1875, -0.1875, 0.25, 0.1875, 0.1875, 0.5 }, - }, - connect_sides = { "top", "bottom", "front", "back", "left", "right" }, - connects_to = {"mcl_end:chorus_plant", "mcl_end:chorus_flower", "mcl_end:chorus_flower_dead", "mcl_end:end_stone"}, - sounds = mcl_sounds.node_sound_wood_defaults(), - -- TODO: Check drop probability - drop = { items = { {items = { "mcl_end:chorus_fruit", rarity = 4 } } } }, - groups = {handy=1,axey=1, not_in_creative_inventory = 1, dig_by_piston = 1, destroy_by_lava_flow = 1 }, - _mcl_blast_resistance = 2, - _mcl_hardness = 0.4, -}) - --- Craftitems -minetest.register_craftitem("mcl_end:chorus_fruit", { - description = "Chorus Fruit", - _doc_items_longdesc = "Chorus fruits are the fruits of the chorus plant which is home to the End. They can be eaten to restore a few hunger points.", - wield_image = "mcl_end_chorus_fruit.png", - inventory_image = "mcl_end_chorus_fruit.png", - -- TODO: Teleport player - on_place = minetest.item_eat(4), - on_secondary_use = minetest.item_eat(4), - groups = { food = 2, eatable = 4, can_eat_when_full = 1 }, - _mcl_saturation = 2.4, - stack_max = 64, -}) - -minetest.register_craftitem("mcl_end:chorus_fruit_popped", { - description = "Popped Chorus Fruit", - _doc_items_longdesc = doc.sub.items.temp.craftitem, - wield_image = "mcl_end_chorus_fruit_popped.png", - inventory_image = "mcl_end_chorus_fruit_popped.png", - groups = { craftitem = 1 }, - stack_max = 64, -}) - -minetest.register_craftitem("mcl_end:ender_eye", { - description = "Eye of Ender", - _doc_items_longdesc = doc.sub.items.temp.craftitem, - wield_image = "mcl_end_ender_eye.png", - inventory_image = "mcl_end_ender_eye.png", - stack_max = 64, -}) - - --- Crafting recipes -minetest.register_craft({ - output = "mcl_end:end_bricks 4", - recipe = { - {"mcl_end:end_stone", "mcl_end:end_stone"}, - {"mcl_end:end_stone", "mcl_end:end_stone"}, - } -}) - -minetest.register_craft({ - output = "mcl_end:purpur_block 4", - recipe = { - {"mcl_end:chorus_fruit_popped", "mcl_end:chorus_fruit_popped",}, - {"mcl_end:chorus_fruit_popped", "mcl_end:chorus_fruit_popped",}, - } -}) - -minetest.register_craft({ - output = "mcl_end:end_rod 4", - recipe = { - {"mcl_mobitems:blaze_rod"}, - {"mcl_end:chorus_fruit_popped"}, - }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "mcl_end:ender_eye", - recipe = {"mcl_mobitems:blaze_powder", "mcl_throwing:ender_pearl"}, -}) - -minetest.register_craft({ - type = "cooking", - output = "mcl_end:chorus_fruit_popped", - recipe = "mcl_end:chorus_fruit", - cooktime = 10, -}) +mcl_end = {} +local basepath = minetest.get_modpath(minetest.get_current_modname()) +dofile(basepath.."/chorus_plant.lua") +dofile(basepath.."/building.lua") +dofile(basepath.."/eye_of_ender.lua") diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr new file mode 100644 index 00000000..df3ad90f --- /dev/null +++ b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr @@ -0,0 +1,28 @@ +# textdomain: mcl_end +End Stone=Endstein +End Stone Bricks=Endsteinziegel +Purpur Block=Purpurblock +Purpur Pillar=Purpursäule +End Rod=Endstab +End rods are decorative light sources.=Endstäbe sind dekorative Lichtquellen. +Dragon Egg=Drachenei +A dragon egg is a decorative item which can be placed.=Ein Drahenei ist ein dekorativer, platzierbarer Gegenstand. +Chorus Flower=Chorusblume +A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Eine Chorusblume ist der lebendige Teil einer Choruspflanze. Sie kann zu einer großen Choruspflanze heranwachsen, Schritt für Schritt. Wenn sie wächst, wird sie irgendwann am Alter absterben. Sie stirbt auch ab, wenn sie nicht weiterwachsen kann. +Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Platzieren Sie sie und warten Sie darauf, dass sie wächst. Sie kann nur auf Endstein, auf einen anderen Choruspflanzenstängel oder an der Seite von genau einem Choruspflanzenstängel platziert werden. +Dead Chorus Flower=Tote Chorusblume +This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Dies ist ein Teil einer Choruspflanze. Er wächst nicht. Chorusblumen werden mit der Zeit alt und sterben ab, sie sterben auch ab, wenn sie nicht weiterwachsen können. Eine tote Chorusblume kann geerntet werden, um eine frische neue Choruspflanze zu erhalten, die wieder wachsen kann. +Chorus Plant Stem=Choruspflanzenstängel +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Ein Choruspflanzenstängel ist der Teil einer Choruspflanze, der die gesamte Pflanze zusammenhält. Sie braucht Endstein als Untergrund. Stängel wachsen aus Chorusblumen. +Chorus Fruit=Chorusfrucht +A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Eine Chorusfrucht ist eine essbare Frucht von der Choruspflanze, die im Ende beheimatet ist. Wenn man sie isst, wird man auf einen zufälligen festen Block in der Nähe teleportiert, solange man nicht in eine Flüssigkeit, einen festen oder gefährlichen Block landen würde. Die Teleportation könnte fehlschlagen, wenn es sehr wenige oder keine Orte gibt, zu denen sie einen hinteleportieren könnte. +Popped Chorus Fruit=Aufgeploppte Chorusfrucht +Eye of Ender=Enderauge +This item is used to locate End portal shrines in the Overworld and to activate End portals.=Dieser Gegenstand wird benutzt, um Endportalschreine in der Oberwelt zu finden und Endportale zu aktivieren. +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Benutzen Sie die Angriffstaste, um das Enderauge loszulassen. Es wird aufsteigen und in einer horizontalen Richtung zum nächsten Endportalschrein fliegen. Wenn Sie sehr nah dran sind, wird das Enderauge stattdessen den direkten Weg zum Endportalschrein nehmen. Nach ein paar Sekunden hält es an. Es könnte als Gegenstand wieder herunterfallen, aber es wird mit einer 20%-Chance zerbrechen. +To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Um ein Endportal zu aktivieren, müssen Enderaugen in jeden Block eines intakten Endportalrahmens platziert werden. +NOTE: The End dimension is currently incomplete and might change in future versions.=ANMERKUNG: Die Ende-Dimension ist momentan unfertig und könnte sich in künftigen Versionen ändern. +The stem attaches itself to end stone and other chorus blocks.=Der Stängel muss sich neben anderen Chorusblöcken oder Endstein befinden. +Grows on end stone=Wächst auf Endstein +Randomly teleports you when eaten=Zufällige Teleportation, wenn gegessen +Guides the way to the mysterious End dimension=Weist den Weg zur mysteriösen Endedimension diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.es.tr b/mods/ITEMS/mcl_end/locale/mcl_end.es.tr new file mode 100644 index 00000000..c9804586 --- /dev/null +++ b/mods/ITEMS/mcl_end/locale/mcl_end.es.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_end +End Stone=Fin de la piedra +End Stone Bricks=Fin de ladrillos de piedra +Purpur Block=Bloque púrpura +Purpur Pillar=Pilar púrpura +End Rod=Barra final +End rods are decorative light sources.=Las varillas finales son fuentes de luz decorativas. +Dragon Egg=Huevo de dragón +A dragon egg is a decorative item which can be placed.=Un huevo de dragón es un elemento decorativo que se puede colocar. +Chorus Flower=Flor de coro +A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Una flor de coro es la parte viva de una planta de coro. Puede convertirse en una planta de coro alto, paso a paso. Cuando crece, puede morir con la vejez eventualmente. También muere cuando no puede crecer. +Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Colóquelo y espere a que crezca. Solo se puede colocar en la parte superior de la piedra del extremo, en la parte superior del tallo de la planta de coro, o al lado de exactamente un tallo de la planta de coro. +Dead Chorus Flower=Flor de coro muerto +This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Esta es una parte de una planta de coro. No crece Las flores de coro mueren de vejez o cuando no pueden crecer. Se puede cosechar una flor de coro muerta para obtener una flor de coro fresca que pueda crecer nuevamente. +Chorus Plant Stem=Tallo de planta de coro +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=El tallo de una planta de coro es la parte de una planta de coro que mantiene unida a toda la planta. Necesita piedra final como su suelo. Los tallos se cultivan a partir de flores de coro. +Chorus Fruit=Fruta coro +A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Una fruta de coro es una fruta comestible de la planta de coro que es el hogar del final. Comerlo te teletransporta a la parte superior de un bloque sólido aleatorio cercano, siempre que no termines dentro de un bloque líquido, sólido o dañino. La teletransportación puede fallar si hay muy pocos o ningún lugar para teletransportarse. +Popped Chorus Fruit=Fruta de coro reventado +Eye of Ender=Ojo de Ender +This item is used to locate End portal shrines in the Overworld and to activate End portals.=Este elemento se usa para localizar santuarios de portal del fin en el mundo y para activar portales del final. +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Usa la tecla de ataque para liberar el ojo de Ender. Se elevará y volará en la dirección horizontal del santuario portal más cercano. Si estás muy cerca, el ojo de Ender tomará el camino directo al Santuario del portal final. Después de unos segundos, se detiene. Puede caer como un elemento, pero hay un 20% de posibilidades de que se rompa. +To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Para activar un portal final, se deben colocar ojos de ender en cada bloque de un marco intacto del portal final. +NOTE: The End dimension is currently incomplete and might change in future versions.=NOTA: La dimensión Final está actualmente incompleta y puede cambiar en futuras versiones. +The stem attaches itself to end stone and other chorus blocks.=El tallo se adhiere al extremo de la piedra y a otros bloques de coro.. \ No newline at end of file diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.fr.tr b/mods/ITEMS/mcl_end/locale/mcl_end.fr.tr new file mode 100644 index 00000000..39140587 --- /dev/null +++ b/mods/ITEMS/mcl_end/locale/mcl_end.fr.tr @@ -0,0 +1,28 @@ +# textdomain: mcl_end +End Stone=Pierre de L'End +End Stone Bricks=Brique de l'End +Purpur Block=Bloc de Purpur +Purpur Pillar=Bloc de Purpur Sculpté +End Rod=Barre de l'End +End rods are decorative light sources.=Les barres de l'End sont des sources de lumière décoratives. +Dragon Egg=Oeuf de Dragon +A dragon egg is a decorative item which can be placed.=Un oeuf de dragon est un objet décoratif qui peut être placé. +Chorus Flower=Plante de Chorus +A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Une fleur de chorus est la partie vivante d'une plante de chorus. Il peut devenir une grande plante de chorus, étape par étape. Quand elle grandit, elle peut finir par mourir en vieillissant. Elle meurt également lorsqu'il est incapable de grandir. +Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Placez-la et attendez qu'elle grandisse. Elle ne peut être placée que sur le dessus de la pierre d'End, sur le dessus d'une tige de plante de chorus ou exactement sur le côté d'une tige de plante de chorus. +Dead Chorus Flower=Plante de Chorus Morte +This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Ceci fait partie d'une plante de chorus. Ça ne pousse pas. Les fleurs de chorus meurent de vieillesse ou lorsqu'elles ne peuvent pas pousser. Une fleur de chorus morte peut être récoltée pour obtenir une fleur de chorus fraîche qui peut repousser. +Chorus Plant Stem=Tige de Plante de Chorus +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Une tige de plante de chorus est la partie d'une plante de chorus qui maintient la plante entière ensemble. Il a besoin de pierre d'End comme sol. Les tiges sont issues de fleurs de chorus. +Chorus Fruit=Fruit de Chorus +A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Un fruit de chorus est un fruit comestible de l'usine de chorus qui abrite la fin. Le manger vous téléporte au sommet d'un bloc solide aléatoire à proximité, à condition de ne pas vous retrouver dans un bloc liquide, solide ou nuisible. La téléportation peut échouer s'il y a très peu ou pas d'endroits où se téléporter. +Popped Chorus Fruit=Chorus Eclaté +Eye of Ender=Oeil de l'Ender +This item is used to locate End portal shrines in the Overworld and to activate End portals.=Cet objet est utilisé pour localiser les sanctuaires du portail End dans l'Overworld et pour activer les portails End. +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Utilisez la touche d'attaque pour libérer l'oeil d'ender. Il s'élèvera et volera dans la direction horizontale du sanctuaire portail d'Ender le plus proche. Si vous êtes très proche, l'oeil d'ender empruntera le chemin direct vers le sanctuaire du portail de l'End. Après quelques secondes, il s'arrête. Il peut tomber en tant qu'objet, mais il y a 20% de chances qu'il se brise. +To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Pour activer un portail d'End, les yeux d'ender doivent être placés dans chaque bloc d'un cadre de portail d'End intact. +NOTE: The End dimension is currently incomplete and might change in future versions.=REMARQUE: la dimension de l'End est actuellement incomplète et pourrait changer dans les futures versions. +The stem attaches itself to end stone and other chorus blocks.=La tige s'attache à la pierre d'End et à d'autres blocs de chorus. +Grows on end stone=Pousse sur la pierre d'End +Randomly teleports you when eaten=Vous téléporte au hasard quand il est mangé +Guides the way to the mysterious End dimension=Guide le chemin vers la dimension mystérieuse de l'End diff --git a/mods/ITEMS/mcl_end/locale/template.txt b/mods/ITEMS/mcl_end/locale/template.txt new file mode 100644 index 00000000..3f024383 --- /dev/null +++ b/mods/ITEMS/mcl_end/locale/template.txt @@ -0,0 +1,28 @@ +# textdomain: mcl_end +End Stone= +End Stone Bricks= +Purpur Block= +Purpur Pillar= +End Rod= +End rods are decorative light sources.= +Dragon Egg= +A dragon egg is a decorative item which can be placed.= +Chorus Flower= +A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.= +Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.= +Dead Chorus Flower= +This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.= +Chorus Plant Stem= +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.= +Chorus Fruit= +A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.= +Popped Chorus Fruit= +Eye of Ender= +This item is used to locate End portal shrines in the Overworld and to activate End portals.= +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.= +To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.= +NOTE: The End dimension is currently incomplete and might change in future versions.= +The stem attaches itself to end stone and other chorus blocks.= +Grows on end stone= +Randomly teleports you when eaten= +Guides the way to the mysterious End dimension= diff --git a/mods/ITEMS/mcl_end/sounds/mcl_end_teleport.ogg b/mods/ITEMS/mcl_end/sounds/mcl_end_teleport.ogg new file mode 100644 index 00000000..addfe89c Binary files /dev/null and b/mods/ITEMS/mcl_end/sounds/mcl_end_teleport.ogg differ diff --git a/mods/ITEMS/mcl_end/textures/mcl_end_chorus_flower.png b/mods/ITEMS/mcl_end/textures/mcl_end_chorus_flower.png index 47798ba0..23f0e06b 100644 Binary files a/mods/ITEMS/mcl_end/textures/mcl_end_chorus_flower.png and b/mods/ITEMS/mcl_end/textures/mcl_end_chorus_flower.png differ diff --git a/mods/ITEMS/mcl_end/textures/mcl_end_chorus_flower_dead.png b/mods/ITEMS/mcl_end/textures/mcl_end_chorus_flower_dead.png index 88f798cd..6d4e2d3d 100644 Binary files a/mods/ITEMS/mcl_end/textures/mcl_end_chorus_flower_dead.png and b/mods/ITEMS/mcl_end/textures/mcl_end_chorus_flower_dead.png differ diff --git a/mods/ITEMS/mcl_end/textures/mcl_end_chorus_plant.png b/mods/ITEMS/mcl_end/textures/mcl_end_chorus_plant.png index afde6fee..920d82ec 100644 Binary files a/mods/ITEMS/mcl_end/textures/mcl_end_chorus_plant.png and b/mods/ITEMS/mcl_end/textures/mcl_end_chorus_plant.png differ diff --git a/mods/ITEMS/mcl_end/textures/mcl_end_dragon_egg.png b/mods/ITEMS/mcl_end/textures/mcl_end_dragon_egg.png index c50d8f23..1533c3b1 100644 Binary files a/mods/ITEMS/mcl_end/textures/mcl_end_dragon_egg.png and b/mods/ITEMS/mcl_end/textures/mcl_end_dragon_egg.png differ diff --git a/mods/ITEMS/mcl_end/textures/mcl_end_end_stone.png b/mods/ITEMS/mcl_end/textures/mcl_end_end_stone.png index 2254f82e..ea48cea9 100644 Binary files a/mods/ITEMS/mcl_end/textures/mcl_end_end_stone.png and b/mods/ITEMS/mcl_end/textures/mcl_end_end_stone.png differ diff --git a/mods/ITEMS/mcl_end/textures/mcl_end_endframe_side.png b/mods/ITEMS/mcl_end/textures/mcl_end_endframe_side.png index a2370ece..6922795e 100644 Binary files a/mods/ITEMS/mcl_end/textures/mcl_end_endframe_side.png and b/mods/ITEMS/mcl_end/textures/mcl_end_endframe_side.png differ diff --git a/mods/ITEMS/mcl_end/textures/mcl_end_purpur_pillar.png b/mods/ITEMS/mcl_end/textures/mcl_end_purpur_pillar.png index 4b7efbd0..2f2522e2 100644 Binary files a/mods/ITEMS/mcl_end/textures/mcl_end_purpur_pillar.png and b/mods/ITEMS/mcl_end/textures/mcl_end_purpur_pillar.png differ diff --git a/mods/ITEMS/mcl_end/textures/mcl_end_purpur_pillar_top.png b/mods/ITEMS/mcl_end/textures/mcl_end_purpur_pillar_top.png index 752e77bc..712247d8 100644 Binary files a/mods/ITEMS/mcl_end/textures/mcl_end_purpur_pillar_top.png and b/mods/ITEMS/mcl_end/textures/mcl_end_purpur_pillar_top.png differ diff --git a/mods/ITEMS/mcl_farming/beetroot.lua b/mods/ITEMS/mcl_farming/beetroot.lua index 1776ce03..7caf5103 100644 --- a/mods/ITEMS/mcl_farming/beetroot.lua +++ b/mods/ITEMS/mcl_farming/beetroot.lua @@ -1,7 +1,10 @@ +local S = minetest.get_translator("mcl_farming") + minetest.register_craftitem("mcl_farming:beetroot_seeds", { - description = "Beetroot Seeds", - _doc_items_longdesc = "Grows into a beetroot plant. Chickens like beetroot seeds.", - _doc_items_usagehelp = "Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.", + description = S("Beetroot Seeds"), + _tt_help = S("Grows on farmland"), + _doc_items_longdesc = S("Grows into a beetroot plant. Chickens like beetroot seeds."), + _doc_items_usagehelp = S("Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds."), groups = { craftitem=1 }, inventory_image = "mcl_farming_beetroot_seeds.png", wield_image = "mcl_farming_beetroot_seeds.png", @@ -11,9 +14,9 @@ minetest.register_craftitem("mcl_farming:beetroot_seeds", { }) minetest.register_node("mcl_farming:beetroot_0", { - description = "Premature Beetroot Plant (First Stage)", - _doc_items_longdesc = "Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.", - _doc_items_entry_name = "Premature Beetroot Plant", + description = S("Premature Beetroot Plant (Stage 1)"), + _doc_items_longdesc = S("Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature."), + _doc_items_entry_name = S("Premature Beetroot Plant"), paramtype = "light", paramtype2 = "meshoptions", sunlight_propagates = true, @@ -36,7 +39,7 @@ minetest.register_node("mcl_farming:beetroot_0", { }) minetest.register_node("mcl_farming:beetroot_1", { - description = "Premature Beetroot Plant (Second Stage)", + description = S("Premature Beetroot Plant (Stage 2)"), _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", @@ -60,7 +63,7 @@ minetest.register_node("mcl_farming:beetroot_1", { }) minetest.register_node("mcl_farming:beetroot_2", { - description = "Premature Beetroot Plant (Third Stage)", + description = S("Premature Beetroot Plant (Stage 3)"), _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", @@ -84,8 +87,8 @@ minetest.register_node("mcl_farming:beetroot_2", { }) minetest.register_node("mcl_farming:beetroot", { - description = "Mature Beetroot Plant", - _doc_items_longdesc = "A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.", + description = S("Mature Beetroot Plant"), + _doc_items_longdesc = S("A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further."), _doc_items_create_entry = true, paramtype = "light", paramtype2 = "meshoptions", @@ -94,6 +97,12 @@ minetest.register_node("mcl_farming:beetroot", { walkable = false, drawtype = "plantlike", drop = { + --[[ drops 1 beetroot guaranteed. + drops 0-3 beetroot seeds: + 0 seeds: 42.18% + 1 seed: 14.06% + 2 seeds: 18.75% + 3 seeds: 25% ]] max_items = 2, items = { { items = {"mcl_farming:beetroot_item"}, rarity = 1 }, @@ -117,9 +126,9 @@ minetest.register_node("mcl_farming:beetroot", { }) minetest.register_craftitem("mcl_farming:beetroot_item", { - description = "Beetroot", - _doc_items_longdesc = "Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.", - _doc_items_usagehelp = "Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.", + description = S("Beetroot"), + _doc_items_longdesc = S("Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too."), + _doc_items_usagehelp = S("Hold it in your hand and right-click to eat it. Rightclick an animal to feed it."), inventory_image = "mcl_farming_beetroot.png", wield_image = "mcl_farming_beetroot.png", on_place = minetest.item_eat(1), @@ -129,8 +138,8 @@ minetest.register_craftitem("mcl_farming:beetroot_item", { }) minetest.register_craftitem("mcl_farming:beetroot_soup", { - description = "Beetroot Soup", - _doc_items_longdesc = "Beetroot soup is a food item.", + description = S("Beetroot Soup"), + _doc_items_longdesc = S("Beetroot soup is a food item."), stack_max = 1, inventory_image = "mcl_farming_beetroot_soup.png", wield_image = "mcl_farming_beetroot_soup.png", diff --git a/mods/ITEMS/mcl_farming/carrots.lua b/mods/ITEMS/mcl_farming/carrots.lua index 29490677..4599d39e 100644 --- a/mods/ITEMS/mcl_farming/carrots.lua +++ b/mods/ITEMS/mcl_farming/carrots.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_farming") + for i=1, 7 do local texture, sel_height if i < 3 then @@ -14,13 +16,13 @@ for i=1, 7 do local create, name, longdesc if i == 1 then create = true - name = "Premature Carrot Plant" - longdesc = "Carrot plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature." + name = S("Premature Carrot Plant") + longdesc = S("Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") else create = false end minetest.register_node("mcl_farming:carrot_"..i, { - description = string.format("Premature Carrot Plant (Stage %d)", i), + description = S("Premature Carrot Plant (Stage @1)", i), _doc_items_create_entry = create, _doc_items_entry_name = name, _doc_items_longdesc = longdesc, @@ -47,8 +49,8 @@ for i=1, 7 do end minetest.register_node("mcl_farming:carrot", { - description = "Mature Carrot Plant", - _doc_items_longdesc = "Mature carrot plants are ready to be harvested for carrots. They won't grow any further.", + description = S("Mature Carrot Plant"), + _doc_items_longdesc = S("Mature carrot plants are ready to be harvested for carrots. They won't grow any further."), paramtype = "light", sunlight_propagates = true, paramtype2 = "meshoptions", @@ -79,9 +81,10 @@ minetest.register_node("mcl_farming:carrot", { }) minetest.register_craftitem("mcl_farming:carrot_item", { - description = "Carrot", - _doc_items_longdesc = "Carrots can be eaten and planted. Pigs and rabbits like carrots.", - _doc_items_usagehelp = "Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.", + description = S("Carrot"), + _tt_help = S("Grows on farmland"), + _doc_items_longdesc = S("Carrots can be eaten and planted. Pigs and rabbits like carrots."), + _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), inventory_image = "farming_carrot.png", groups = { food = 2, eatable = 3 }, _mcl_saturation = 3.6, @@ -97,8 +100,8 @@ minetest.register_craftitem("mcl_farming:carrot_item", { }) minetest.register_craftitem("mcl_farming:carrot_item_gold", { - description = "Golden Carrot", - _doc_items_longdesc = "A golden carrot is a precious food item which can be eaten. It is really, really filling!", + description = S("Golden Carrot"), + _doc_items_longdesc = S("A golden carrot is a precious food item which can be eaten. It is really, really filling!"), inventory_image = "farming_carrot_gold.png", on_place = minetest.item_eat(6), on_secondary_use = minetest.item_eat(6), diff --git a/mods/ITEMS/mcl_farming/depends.txt b/mods/ITEMS/mcl_farming/depends.txt index 7cdd8c91..0ed4f3f5 100644 --- a/mods/ITEMS/mcl_farming/depends.txt +++ b/mods/ITEMS/mcl_farming/depends.txt @@ -2,6 +2,7 @@ mcl_core mcl_sounds mcl_wool mcl_torches -weather_pack +mcl_weather +mcl_armor? mobs_mc doc? diff --git a/mods/ITEMS/mcl_farming/hoes.lua b/mods/ITEMS/mcl_farming/hoes.lua index aad4ed7c..f296bd83 100644 --- a/mods/ITEMS/mcl_farming/hoes.lua +++ b/mods/ITEMS/mcl_farming/hoes.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_farming") + local function create_soil(pos, inv) if pos == nil then return false @@ -9,30 +11,22 @@ local function create_soil(pos, inv) if above.name == "air" then node.name = "mcl_farming:soil" minetest.set_node(pos, node) - minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.5 }) + minetest.sound_play("default_dig_crumbly", { 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("default_dig_crumbly", { pos = pos, gain = 0.6 }) + minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.6 }, true) return true end end return false end -local hoe_longdesc = "Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch." -local hoe_usagehelp = "Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt." - -minetest.register_tool("mcl_farming:hoe_wood", { - description = "Wood Hoe", - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - _doc_items_hidden = false, - inventory_image = "farming_tool_woodhoe.png", - on_place = function(itemstack, user, pointed_thing) +local hoe_on_place_function = function(wear_divisor) + return function(itemstack, user, pointed_thing) -- Call on_rightclick if the pointed node defines it local node = minetest.get_node(pointed_thing.under) if user and not user:get_player_control().sneak then @@ -41,18 +35,48 @@ minetest.register_tool("mcl_farming:hoe_wood", { 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 create_soil(pointed_thing.under, user:get_inventory()) then if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/60) + itemstack:add_wear(65535/wear_divisor) end return itemstack end - end, - groups = { tool=1 }, + end +end + +local uses = { + wood = 60, + stone = 132, + iron = 251, + gold = 33, + diamond = 1562, +} + +local hoe_tt = S("Turns block into farmland") +local hoe_longdesc = S("Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.") +local hoe_usagehelp = S("Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.") + +minetest.register_tool("mcl_farming:hoe_wood", { + description = S("Wood Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.wood), + _doc_items_longdesc = hoe_longdesc, + _doc_items_usagehelp = hoe_usagehelp, + _doc_items_hidden = false, + inventory_image = "farming_tool_woodhoe.png", + wield_scale = { x = 1.8, y = 1.8, z = 1 }, + on_place = hoe_on_place_function(uses.wood), + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 1, - damage_groups = { fleshy = 1, } + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.wood, }, + _repair_material = "group:wood", }) minetest.register_craft({ @@ -78,31 +102,20 @@ minetest.register_craft({ }) minetest.register_tool("mcl_farming:hoe_stone", { - description = "Stone Hoe", + description = S("Stone Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.stone), _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_stonehoe.png", - on_place = function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - 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 create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/132) - end - return itemstack - end - end, - groups = { tool=1 }, + wield_scale = { x = 1.8, y = 1.8, z = 1 }, + on_place = hoe_on_place_function(uses.stone), + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 0.5, - damage_groups = { fleshy = 1, } + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.stone, }, + _repair_material = "mcl_core:cobblestone", }) minetest.register_craft({ @@ -123,32 +136,21 @@ minetest.register_craft({ }) minetest.register_tool("mcl_farming:hoe_iron", { - description = "Iron Hoe", + description = S("Iron Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.iron), _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_steelhoe.png", - on_place = function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - 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 create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/251) - end - return itemstack - end - end, - groups = { tool=1 }, + wield_scale = { x = 1.8, y = 1.8, z = 1 }, + on_place = hoe_on_place_function(uses.iron), + groups = { tool=1, hoe=1 }, tool_capabilities = { -- 1/3 full_punch_interval = 0.33333333, - damage_groups = { fleshy = 1, } + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.iron, }, + _repair_material = "mcl_core:iron_ingot", }) minetest.register_craft({ @@ -176,31 +178,20 @@ minetest.register_craft({ }) minetest.register_tool("mcl_farming:hoe_gold", { - description = "Golden Hoe", + description = S("Golden Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.gold), _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_goldhoe.png", - on_place = function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - 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 create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/33) - end - return itemstack - end - end, - groups = { tool=1 }, + wield_scale = { x = 1.8, y = 1.8, z = 1 }, + on_place = hoe_on_place_function(uses.gold), + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 1, - damage_groups = { fleshy = 1, } + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.gold, }, + _repair_material = "mcl_core:gold_ingot", }) minetest.register_craft({ @@ -230,31 +221,20 @@ minetest.register_craft({ }) minetest.register_tool("mcl_farming:hoe_diamond", { - description = "Diamond Hoe", + description = S("Diamond Hoe"), + _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.diamond), _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_diamondhoe.png", - on_place = function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - 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 create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/1562) - end - return itemstack - end - end, - groups = { tool=1 }, + wield_scale = { x = 1.8, y = 1.8, z = 1 }, + on_place = hoe_on_place_function(uses.diamond), + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 0.25, - damage_groups = { fleshy = 1, } + damage_groups = { fleshy = 1, }, + punch_attack_uses = uses.diamond, }, + _repair_material = "mcl_core:diamond", }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_farming/init.lua b/mods/ITEMS/mcl_farming/init.lua index 19be5380..adce058e 100644 --- a/mods/ITEMS/mcl_farming/init.lua +++ b/mods/ITEMS/mcl_farming/init.lua @@ -1,4 +1,3 @@ -local init = os.clock() mcl_farming = {} -- IMPORTANT API AND HELPER FUNCTIONS -- @@ -28,6 +27,3 @@ dofile(minetest.get_modpath("mcl_farming").."/potatoes.lua") -- ========= BEETROOT ========= dofile(minetest.get_modpath("mcl_farming").."/beetroot.lua") - -local time_to_load= os.clock() - init -print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load)) diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr new file mode 100644 index 00000000..54b35630 --- /dev/null +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr @@ -0,0 +1,99 @@ +# textdomain: mcl_farming +Beetroot Seeds=Rote-Beete-Samen +Grows into a beetroot plant. Chickens like beetroot seeds.=Wachsen zu Rote Beete heran. Hühner mögen Rote-Beete-Samen. +Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Platzieren Sie die Rote-Beete-Samen auf Ackerboden (der mit einer Hacke gemacht werden kann), um Rote Beete zu pflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es mit Rote-Beete-Samen zu füttern. +Premature Beetroot Plant (Stage 1)=Junge Rote Beete (1. Stufe) +Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Rote Beete ist eine Pflanze, die auf Ackerboden im Sonnenlicht in 4 Stufen wächst. Auf bewässertem Ackerboden wächst sie etwas schneller. Sie kann jederzeit abgeerntet werden, aber wird nur einen Ertrag abwerfen, wenn sie ausgewachsen ist. +Premature Beetroot Plant=Junge Rote Beete +Premature Beetroot Plant (Stage 2)=Junge Rote Beete (2. Stufe) +Premature Beetroot Plant (Stage 3)=Junge Rote Beete (3. Stufe) +Mature Beetroot Plant=Ausgewachsene Rote Beete +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Eine ausgewachsene Rote Beete ist eine erntereife Pflanze, die für eine Rote-Beete-Rübe und ein paar Rote-Beete-Samen abgeerntet werden kann. Sie wächst nicht weiter. +Beetroot=Rote-Beete-Rübe +Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Rote-Beete-Rüben sind eine Speise und nützlich zur Herstellung von Farbstoffen. Schweine mögen sie auch. +Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Halten Sie es in der Hand und rechtsklicken Sie, um es zu essen. Rechtsklicken Sie auf ein Tier, um es zu füttern. +Beetroot Soup=Rote-Beete-Suppe +Beetroot soup is a food item.=Rote-Beete-Suppe ist ein Lebensmittel. +Premature Carrot Plant=Junge Karottenpflanze +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Karottenpflanzen sind Pflanzen, die auf Ackerboden im Sonnenlicht in 8 Stufen wachsen, aber es gibt nur 4 sichtbar unterscheidbare Stufen. Auf bewässertem Ackerboden wachsen sie etwas schneller. Sie können jederzeit abgeerntet werden, aber werden nur einen Ertrag abwerfen, wenn sie ausgewachsen sind. +Premature Carrot Plant (Stage @1)=Junge Karottenpflanze (@1. Stufe) +Mature Carrot Plant=Ausgewachsene Karottenpflanze +Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Ausgewachsene Karottenpflanzen können für Karotten abgeerntet werden. Sie werden nicht weiter wachsen. +Carrot=Karotte +Carrots can be eaten and planted. Pigs and rabbits like carrots.=Karotten können gegessen und gepflanzt werden. Schweine und Kaninchen mögen Karotten. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Halten Sie es in ihrer Hand und rechtsklicken Sie, um es zu essen. Platzieren Sie sie auf Ackerboden, um sie einzupflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es zu füttern. +Golden Carrot=Goldene Karotte +A golden carrot is a precious food item which can be eaten. It is really, really filling!=Eine goldene Karotte ist ein kostbares Lebensmittel. Es ist sehr, sehr sättigend! +Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Hacken sind unerlässliche Werkzeuge für die Zucht von Feldpflanzen. Sie können benutzt werden, um einen Ackerboden zu machen, auf dem Samen gepflanzt werden können. Hacken können zur Not auch als sehr schwache Waffen benutzt werden. +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Benutzen Sie die Hacke auf einen beackerbaren Block (indem Sie ihn rechtsklicken), um ihn zu Ackerboden in verwandeln. Erde, Grasblöcke und Graspfade können beackert werden. Grobe Erde wird zu Erde. +Wood Hoe=Holzhacke +Stone Hoe=Steinhacke +Iron Hoe=Eisenhacke +Golden Hoe=Goldhacke +Diamond Hoe=Diamanthacke +Melon Seeds=Melonensamen +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Platzieren Sie die Melonensamen auf Ackerboden (der mit einer Hacke gemacht werden kann), um einen Melonenstängel zu pflanzen. Melonenstängel wachsen im Sonnenlicht und wachen auf bewässertem Ackerboden schneller. Ausgewachsen wird der Melonenstängel versuchen, an der Seite eine Melone wachsen zu lassen. Rechtsklicken Sie auf ein Tier, um es mit Melonensamen zu füttern. +Melon=Melone +Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Wächst zu einem Melonenstängel heran, aus dem wiederum Melonen wachsen. Hühner mögen Melonensamen. +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Eine Melone ist ein Block, der von Melonenstängeln wächst, der wiederum aus Melonensamen wächst. Er kann für Melonenstücke abgeerntet werden. +Premature Melon Stem=Junger Melonenstängel +Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Melonenstängel wachsen auf Ackerboden in 8 Stufen. Auf bewässertem Ackerboden ist das Wachstum etwas schneller. Aus ausgewachsenen Melonenstängeln können Melonen wachsen. +Premature Melon Stem (Stage @1)=Junger Melonenstängel (@1. Stufe) +Mature Melon Stem=Ausgewachsener Melonenstängel +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Ein ausgewachsener Melonenstängel versucht, auf einem seiner vier benachbarten Blöcke eine Melone wachsen zu lassen. Eine Melone kann nur auf Ackerboden, Erde oder einem Grasblock wachsen. Wenn sich eine Melone neben einem Melonenstängel befindet, verbiegt sich der Melonenstängel und verbindet sich mit der Melone. Solange der Stängel verbunden ist, kann aus ihm keine neue Melone wachsen. Wenn alle Melonen um den Melonenstängel entfernt wurden, verliert er die Verbindung und aus ihm kann eine weitere Melone wachsen. +Melon Slice=Melonenstück +This is a food item which can be eaten.=Ein essbares Lebensmittel. +Premature Potato Plant=Junge Kartoffelpflanze +Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Kartoffelpflanzen sind Pflanzen, die auf Ackerboden im Sonnenlicht in 8 Stufen wachsen, aber es gibt nur 4 sichtbar unterscheidbare Stufen. Auf bewässertem Ackerboden wachsen sie etwas schneller. Sie können jederzeit abgeerntet werden, aber werden nur einen Ertrag abwerfen, wenn sie ausgewachsen sind. +Premature Potato Plant (Stage @1)=Junge Kartoffelpflanze (@1. Stufe) +Mature Potato Plant=Ausgewachsene Kartoffelpflanze +Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Ausgewachsene Kartoffelpflanzen können für Kartoffeln abgeerntet werden. Sie wachsen nicht weiter. +Potato=Kartoffel +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Kartoffeln sind essbare Lebensmittel, können im Ofen gebacken und eingepflanzt werden. Schweine mögen Kartoffeln. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Halten Sie sie in der Hand und rechtsklicken Sie zum Essen. Platzieren Sie sie auf Ackerboden, um sie zu pflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es zu füttern. +Baked Potato=Ofenkartoffel +Baked potatoes are food items which are more filling than the unbaked ones.=Ofenkartoffeln sind Lebensmittel, die etwas nahrhafter als rohe Kartoffeln sind. +Poisonous Potato=Giftige Kartoffel +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Diese Kartoffel sieht nicht gerade gesund aus. Sie kann gegessen werden, um Hungerpunkte zu erhalten, aber es gibt eine Chance von 60%, dass das Sie kurz vergiften wird. +Pumpkin Seeds=Kürbissamen +Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Wächst zu einem Kürbisstängel heran, aus dem wiederum Kürbisse wachsen. Hühner mögen Kürbissamen. +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Platzieren Sie die Kürbissamen auf Ackerboden (der mit einer Hacke gemacht werden kann), um einen Kürbisstängel zu pflanzen. Kürbisstängel wachsen im Sonnenlicht und wachsen auf bewässertem Ackerboden schneller. Ausgewachsen wird der Kürbisstängel versuchen, einen Kürbis an einem benachbartem Feld wachsen zu lassen. Rechtsklicken Sie auf ein Tier, um es mit Kürbissamen zu füttern. +Premature Pumpkin Stem=Junger Kürbisstängel +Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Kürbisstängel wachsen auf Ackerboden in 8 Stufen. Auf bewässertem Ackerboden ist das Wachstum etwas schneller. Aus ausgewachsenen Kürbisstängeln können Kürbisse wachsen. +Premature Pumpkin Stem (Stage @1)=Junger Kürbisstängel (@1. Stufe) +Mature Pumpkin Stem=Ausgewachsener Kürbisstängel +A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Ein ausgewachsener Kürbisstängel versucht, auf einem seiner vier benachbarten Blöcke einen Kürbis wachsen zu lassen. Ein Kürbis kann nur auf Ackerboden, Erde oder einem Grasblock wachsen. Wenn sich ein Kürbis neben einem Kürbisstängel befindet, verbiegt sich der Kürbisstängel und verbindet sich mit dem Kürbis. Solange der Stängel verbunden ist, kann aus ihm kein neuer Kürbis wachsen. Wenn alle Kürbisse um den Kürbisstängel entfernt wurden, verliert er die Verbindung und aus ihm kann ein weiterer Kürbis wachsen. +Faceless Pumpkin=Gesichtsloser Kürbis +A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Ein gesichtsloser Kürbis ist ein dekorativer Block. Mit einer Schere kann man in ihm ein Muster schnitzen, um Kürbissamen zu erhalten. +Pumpkin=Kürbis +A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Einen Kürbis kann zum Spaß als Helm getragen werden, aber er bietet keinen Schutz. Kürbisse wachsen aus Kürbisstängeln, welche wiederum aus Kürbissamen wachsen. +Jack o'Lantern=Kürbislaterne +A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Eine Kürbislaterne ist eine traditionelle Dekoration für Halloween. Sie leuchtet hell. +Pumpkin Pie=Kürbiskuchen +A pumpkin pie is a tasty food item which can be eaten.=Ein Kürbiskuchen ist ein leckeres essbares Lebensmittel. +Farmland=Ackerboden +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Ackerboden wird für den Ackerbau genutzt, ein unerlässlicher Boden zum Anbau von Nutzpflanzen. Er wird erstellt, wenn eine Hacke auf Erde oder einem ähnlichen Block benutzt wird. Pflanzen können auf Ackerboden wachsen, aber nur langsam. Ackerboden wird zu bewässertem Ackerboden (auf dem Pflanzen schneller wachsen), wenn es regnet oder sich eine Wasserquelle in der Nähe befindet. Dieser Block wird sich zurück zu Erde verwandeln, wenn über ihn ein fester Block auftaucht oder sich über ihn ein Kolbenarm ausbreitet. +Hydrated Farmland=Bewässerter Ackerboden +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Bewässerter Ackerboden wird für den Ackerbau benutzt, auf ihm kann man Nutzpflanzen züchten. Er entsteht, wenn sich Ackerboden unter Regen oder in der Nähe von Wasser befindet. Ohne Wasser wird dieser Block irgendwann austrocknen. Dieser Block verwandelt sich zurück zu Erde, wenn über ihm ein fester Block auftaucht, oder ein Kolbenarm sich über ihn bewegt. +Wheat Seeds=Weizensamen +Grows into a wheat plant. Chickens like wheat seeds.=Wachsen zu einer Weizenpflanze heran. Hühner mögen Weizensamen. +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Platzieren Sie die Weizensamen auf Ackerboden (welcher mit einer Hacke gemacht werden kann), um eine Weizenpflanze zu pflanzen. Sie wächst im Sonnenlicht und wächst schneller auf bewässertem Ackerboden. Rechtsklicken Sie auf ein Tier, um es mit Weizensamen zu füttern. +Premature Wheat Plant=Junge Weizenpflanze +Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Junge Weizenpflanzen wachsen auf Ackerboden im Sonnenlicht in 8 Stufen. Auf bewässertem Ackerboden wachsen sie schneller. Sie können jederzeit abgeerntet werden, aber werden nur ertragreich sein, wenn sie ausgewachsen sind. +Premature Wheat Plant (Stage @1)=Junge Weizenpflanze (@1. Stufe) +Mature Wheat Plant=Ausgewachsene Weizenpflanze +Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Ausgewachsene Weizenpflanzen können für Weizen und Weizensamen abgeerntet werden. Sie wachsen nicht weiter. +Wheat=Weizen +Wheat is used in crafting. Some animals like wheat.=Weizen wird in der Herstellung gebraucht. Einige Tiere mögen Weizen. +Cookie=Keks +Bread=Brot +Hay Bale=Heuballen +Hay bales are decorative blocks made from wheat.=Heuballen sind dekorative Blöcke, die aus Weizen gemacht sind. +To carve a face into the pumpkin, use the shears on the side you want to carve.=Um ein Gesicht in den Kürbis zu schnitzen, benutzen Sie die Schere an der Seite, die Sie schnitzen wollen. +Use the “Place” key on an animal to try to feed it wheat.=Benutzen Sie die „Platzieren“-Taste auf einem Tier, um zu versuchen, es zu füttern. +Grows on farmland=Wächst auf Ackerboden +Turns block into farmland=Macht Block zu Ackerboden +60% chance of poisoning=60% Vergiftungswahrscheinlichkeit +Surface for crops=Boden für Nutzpflanzen +Can become wet=Kann nass werden +Uses: @1=Verwendungen: @1 diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.es.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.es.tr new file mode 100644 index 00000000..8366e825 --- /dev/null +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.es.tr @@ -0,0 +1,93 @@ +# textdomain: mcl_farming +Beetroot Seeds=Semillas de remolacha +Grows into a beetroot plant. Chickens like beetroot seeds.=Crece en una planta de remolacha. A los pollos les gustan las semillas de remolacha. +Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Coloque las semillas de remolacha en tierras de cultivo (que se pueden crear con una azada) para plantar una planta de remolacha. Crecen a la luz del sol y crecen más rápido en tierras de cultivo hidratadas. Haga clic derecho en un animal para alimentarlo con semillas de remolacha. +Premature Beetroot Plant (Stage 1)=Planta de remolacha prematura (Etapa 1) +Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Las plantas de remolacha son plantas que crecen en tierras de cultivo bajo la luz solar en 4 etapas. En tierras de cultivo hidratadas, crecen un poco más rápido. Se pueden cosechar en cualquier momento, pero solo generarán ganancias cuando maduren. +Premature Beetroot Plant=Planta de remolacha prematura +Premature Beetroot Plant (Stage 2)=Planta de remolacha prematura (Etapa 2) +Premature Beetroot Plant (Stage 3)=Planta de remolacha prematura (Etapa 3) +Mature Beetroot Plant=Planta de remolacha madura +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Una planta de remolacha madura es una planta de cultivo que está lista para ser cosechada para una remolacha y algunas semillas de remolacha. No crecerá más. +Beetroot=Remolacha +Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Las remolachas se usan como alimento y como colorante. A los cerdos también les gustan las remolachas. +Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Sostenlo en tu mano y haz clic derecho para comértelo. Haga clic derecho en un animal para alimentarlo. +Beetroot Soup=Estofado de remolacha +Beetroot soup is a food item.=El estofado de remolacha es un alimento. +Premature Carrot Plant=Planta de zanahoria prematura +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Las plantas de zanahoria son plantas que crecen en tierras de cultivo bajo la luz solar en 8 etapas, pero solo 4 etapas se pueden distinguir visualmente. En tierras de cultivo hidratadas, crecen un poco más rápido. Se pueden cosechar en cualquier momento, pero solo generarán ganancias cuando maduren. +Premature Carrot Plant (Stage @1)=Planta de zanahoria prematura (Etapa @1) +Mature Carrot Plant=Planta de zanahoria madura +Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Las plantas de zanahoria maduras están listas para ser cosechadas para zanahorias. No crecerán más. +Carrot=Zanahoria +Carrots can be eaten and planted. Pigs and rabbits like carrots.=Las zanahorias se pueden comer y plantar. A los cerdos y conejos les gustan las zanahorias. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Sostenlo en tu mano y haz clic derecho para comértelo. Colóquelo encima de las tierras de cultivo para plantar la zanahoria. Crece a la luz del sol y crece más rápido en tierras de cultivo hidratadas. Haga clic derecho en un animal para alimentarlo. +Golden Carrot=Zanahoria dorada +A golden carrot is a precious food item which can be eaten. It is really, really filling!=Una zanahoria dorada es un alimento precioso que se puede comer. ¡Es realmente, realmente abundante! +Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Las azadas son herramientas esenciales para el cultivo. Se utilizan para crear tierras de cultivo para plantar semillas en él. Las azadas también se pueden usar como armas muy débiles en caso de apuro. +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Use la azada en un bloque cultivable (al hacer clic derecho) para convertirlo en tierras de cultivo. La tierra, los bloques de hierba y los caminos de hierba son bloques cultivables. Usar una azada en tierra gruesa la convierte en tierra. +Wood Hoe=Azada de madera +Stone Hoe=Azada de piedra +Iron Hoe=Azada de hierro +Golden Hoe=Azada de oro +Diamond Hoe=Azada de diamante +Melon Seeds=Semillas de sandía +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Coloque las semillas de sandía en tierras de cultivo (que se pueden crear con una azada) para plantar un tallo de sandía. Los tallos de sandía crecen a la luz del sol y crecen más rápido en tierras de cultivo hidratadas. Cuando esté maduro, el tallo intentará cultivar un sandía a un lado. Haga clic derecho en un animal para alimentarlo con semillas de sandía. +Melon=Sandía +Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Crece en un tallo de sandía que a su vez produce melones. A las gallinas les gustan las semillas de sandía. +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Un sandía es un bloque que se puede cultivar a partir de tallos de sandía, que a su vez se cultivan a partir de semillas de sandía. Se puede cosechar para rebanadas de sandía. +Premature Melon Stem=Tallo de sandía prematuro +Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Los tallos de sandía crecen en tierras de cultivo en 8 etapas. En tierras de cultivo hidratadas, el crecimiento es un poco más rápido. Los tallos de sandía maduros pueden cultivar melones. +Premature Melon Stem (Stage @1)=Tallo de sandía prematuro (Etapa @1) +Mature Melon Stem=Tallo de sandía maduro +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Un tallo de sandía maduro intenta cultivar un sandía en uno de sus cuatro bloques adyacentes. Un sandía solo puede crecer sobre tierras de cultivo, tierra o un bloque de hierba. Cuando un sandía está al lado de un tallo, el tallo se dobla inmediatamente y se conecta al sandía. Mientras está conectado, un tallo de sandía no puede cultivar otro sandía. Tan pronto como se hayan eliminado todos los melones alrededor del tallo, pierde la conexión y está listo para cultivar otro sandía. +Melon Slice=Rodaja de sandía +This is a food item which can be eaten.=Este es un alimento que se puede comer. +Premature Potato Plant=Planta de patata prematura +Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Las plantas de patata son plantas que crecen en tierras de cultivo bajo la luz solar en 8 etapas, pero solo 4 etapas se pueden distinguir visualmente. En tierras de cultivo hidratadas, crecen un poco más rápido. Se pueden cosechar en cualquier momento, pero solo generarán ganancias cuando maduren. +Premature Potato Plant (Stage @1)=Planta de patata prematura (Etapa @1) +Mature Potato Plant=Planta de patata madura +Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Las plantas de patatas maduras están listas para ser cosechadas. No crecerán más. +Potato=Patata +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Las patatas son alimentos que se pueden comer, cocinar en el horno y plantar. A los cerdos les gustan las patatas. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Sostenlo en tu mano y haz clic derecho para comértelo. Colóquelo encima de las tierras de cultivo para plantarlo. Crece a la luz del sol y crece más rápido en tierras de cultivo hidratadas. Haga clic derecho en un animal para alimentarlo. +Baked Potato=Patata cocida +Baked potatoes are food items which are more filling than the unbaked ones.=Las patatas cocidas son alimentos que llenan más que las que no están cocidas. +Poisonous Potato=Patata venenosa +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Esta patata no se ve muy saludable. Puedes comerla para restablecer los puntos de hambre, pero hay un 60% de posibilidades de que te envenene brevemente. +Pumpkin Seeds=Semillas de calabaza +Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Crece en un tallo de calabaza que a su vez produce calabazas. A los pollos les gustan las semillas de calabaza. +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Coloque las semillas de calabaza en tierras de cultivo (que se pueden crear con una azada) para plantar un tallo de calabaza. Los tallos de calabaza crecen a la luz del sol y crecen más rápido en tierras de cultivo hidratadas. Cuando está maduro, el tallo intenta cultivar una calabaza junto a él. Haga clic derecho en un animal para alimentarlo con semillas de calabaza. +Premature Pumpkin Stem=Tallo de calabaza prematuro +Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Los tallos de calabaza crecen en tierras de cultivo en 8 etapas. En tierras de cultivo hidratadas, el crecimiento es un poco más rápido. Los tallos de calabaza maduros pueden cultivar calabazas. +Premature Pumpkin Stem (Stage @1)=Tallo de calabaza prematuro (Etapa @1) +Mature Pumpkin Stem=Tallo maduro de calabaza +A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Un tallo maduro de calabaza intenta cultivar una calabaza en uno de sus cuatro bloques adyacentes. Una calabaza solo puede crecer sobre tierras de cultivo, tierra o un bloque de hierba. Cuando una calabaza está al lado de un tallo de calabaza, el tallo de la calabaza se dobla inmediatamente y se conecta a la calabaza. Un tallo de calabaza conectado no puede cultivar otra calabaza. Tan pronto como se hayan eliminado todas las calabazas alrededor del tallo, pierde la conexión y está lista para cultivar otra calabaza. +Faceless Pumpkin=Calabaza sin rostro +A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Una calabaza sin rostro es un bloque decorativo. Se puede tallar con tijeras para obtener semillas de calabaza. +Pumpkin=Calabaza +A pumpkin can be worn as a helmet for fun, but it doesn't offer any protection. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Una calabaza se puede usar como casco por diversión, pero no ofrece ninguna protección. Las calabazas crecen de tallos de calabaza, que a su vez crecen de semillas de calabaza. +Jack o'Lantern=Calabaza de Halloween +A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=La calabaza de Halloween es una decoración tradicional de Halloween hecha de una calabaza. Brilla intensamente. +Pumpkin Pie=Tarta de calabaza +A pumpkin pie is a tasty food item which can be eaten.=Un tarta de calabaza es un alimento sabroso que se puede comer. +Farmland=Tierra de cultivo +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Las tierras de cultivo se utilizan para la agricultura, una superficie necesaria para plantar cultivos. Se crea cuando se usa una azada sobre tierra o un bloque similar. Las plantas pueden crecer en tierras de cultivo, pero lentamente. Las tierras de cultivo se convertirán en tierras de cultivo hidratadas (en las cuales las plantas crecen más rápido) cuando llueve o hay una fuente de agua cerca. Este bloque volverá a convertirse en tierra cuando aparezca un bloque sólido sobre él o un brazo de pistón se extienda sobre él. +Hydrated Farmland=Tierra de cultivo hidratada +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Las tierras de cultivo hidratadas se usan en la agricultura, aquí es donde puedes plantar y cultivar algunas plantas. Se crea cuando las tierras de cultivo están bajo la lluvia o cerca del agua. Sin agua, este bloque se secará eventualmente. Este bloque volverá a convertirse en tierra cuando aparezca un bloque sólido sobre él o un brazo de pistón se extienda sobre él. +Wheat Seeds=Semillas de trigo +Grows into a wheat plant. Chickens like wheat seeds.=Crece en una planta de trigo. A las gallinas les gustan las semillas de trigo. +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Coloque las semillas de trigo en tierras de cultivo (que se pueden crear con una azada) para plantar una planta de trigo. Crecen a la luz del sol y crecen más rápido en tierras de cultivo hidratadas. Haga clic derecho en un animal para alimentarlo con semillas de trigo. +Premature Wheat Plant=Planta de trigo prematuro +Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Las plantas de trigo prematuras crecen en tierras de cultivo bajo la luz solar en 8 etapas. En tierras de cultivo hidratadas, crecen más rápido. Se pueden cosechar en cualquier momento, pero solo generarán ganancias cuando maduren. +Premature Wheat Plant (Stage @1)=Planta de trigo prematuro (Etapa @1) +Mature Wheat Plant=Planta de trigo maduro +Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Las plantas maduras de trigo están listas para ser cosechadas, las semillas de trigo no crecerán más. +Wheat=Trigo +Wheat is used in crafting. Some animals like wheat.=El trigo se usa en la elaboración. A algunos animales les gusta el trigo. +Cookie=Galleta +Bread=Pan +Hay Bale=Fardo de heno +Hay bales are decorative blocks made from wheat.=Las balas de heno son bloques decorativos hechos de trigo. +To carve a face into the pumpkin, use the shears on the side you want to carve.=Para tallar una cara en la calabaza, use las tijeras en el lado que desea tallar. +Use the “Place” key on an animal to try to feed it wheat.=Use la tecla "Colocar" en un animal para tratar de alimentarlo con trigo. diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr new file mode 100644 index 00000000..5ee1bcdf --- /dev/null +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr @@ -0,0 +1,99 @@ +# textdomain: mcl_farming +Beetroot Seeds=Graines de Betterave +Grows into a beetroot plant. Chickens like beetroot seeds.=Pousse en bettrave. Les poulets aiment les graines de betterave +Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Placez les graines de betterave sur les terres agricoles (qui peuvent être créées avec une houe) pour planter un plant de betterave. Elles poussent au soleil et poussent plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir de graines de betteraves. +Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de betteraves poussent sur les terres agricoles sous le soleil en 4 étapes. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Elles peuvent être récoltées à tout moment mais ne rapporteront de bénéfices qu'à maturité. +Premature Beetroot Plant=Plant de Betterave Prématurée +Premature Beetroot Plant (Stage 1)=Plant de Betterave Prématurée (Etape 1) +Premature Beetroot Plant (Stage 2)=Plant de Betterave Prématurée (Etape 2) +Premature Beetroot Plant (Stage 3)=Plant de Betterave Prématurée (Etape 3) +Mature Beetroot Plant=Betterave Mature +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Une betterave mature est une plante agricole prête à être récoltée pour une betterave et quelques graines de betterave. Elle ne grandira plus. +Beetroot=Betterave +Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Les betteraves sont à la fois utilisées comme aliment et comme ingrédient colorant. Les porcs aiment aussi les betteraves. +Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Tenez-le dans votre main et faites un clic droit pour le manger. Faites un clic droit sur un animal pour le nourrir. +Beetroot Soup=Soupe de Betterave +Beetroot soup is a food item.=La soupe de betterave est un aliment. +Premature Carrot Plant=Plant de Carrote Prématurée +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de carotte sont des plantes qui poussent sur les terres agricoles sous la lumière du soleil en 8 étapes, mais seulement 4 étapes peuvent être distinguées visuellement. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. +Premature Carrot Plant (Stage @1)=Plant de Carrote Prématurée (Etape 1) +Mature Carrot Plant=Plant de Carotte Mature +Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Les plants de carottes matures sont prêts à être récoltés pour les carottes. Ils ne grandiront plus. +Carrot=Carrotte +Carrots can be eaten and planted. Pigs and rabbits like carrots.=Les carottes peuvent être mangées et plantées. Les cochons et les lapins comme les carottes. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Tenez-la dans votre main et faites un clic droit pour le manger. Placez-le au-dessus des terres agricoles pour planter la carotte. Elle pousse au soleil et pousse plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir. +Golden Carrot=Carrot Dorée +A golden carrot is a precious food item which can be eaten. It is really, really filling!=Une carotte dorée est un aliment précieux qui peut être mangé. C'est vraiment, vraiment rassasiant! +Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Les houes sont des outils essentiels pour faire pousser des cultures. Ils sont utilisés pour créer des terres agricoles afin d'y planter des graines. Les houes peuvent également être utilisées comme armes très faibles à la rigueur. +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Utilisez la houe sur un bloc cultivable (en cliquant dessus avec le bouton droit) pour le transformer en terre agricole. La saleté, les blocs d'herbe et les chemins d'herbe sont des blocs cultivables. L'utilisation d'une houe sur la terre grossière la transforme en terre. +Wood Hoe=Houe en Bois +Stone Hoe=Houe en Pierre +Iron Hoe=Houe en Fer +Golden Hoe=Houe en Or +Diamond Hoe=Houe en Diamant +Melon Seeds=Graine de Pastèque +Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Se développe en une tige de pastèque qui à son tour forme des pastèques. Les poulets aiment les graines de pastèque. +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Placez les graines de pastèque sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une tige de pastèque. Les tiges de pastèque poussent au soleil et se développent plus rapidement sur les terres agricoles hydratées. À maturité, la tige tentera de faire pousser une pastèque sur le côté. Faites un clic droit sur un animal pour le nourrir de graines de pastèque. +Melon=Pastèque +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Une pastèque est un bloc qui peut être cultivé à partir de tiges de pastèque, qui à leur tour sont cultivées à partir de graines de pastèque. Elle peut être récoltée pour des tranches de pastèque. +Premature Melon Stem=Tige de Pastèque Prématurée +Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Les tiges de pastèque poussent sur les terres agricoles en 8 étapes. Sur les terres agricoles hydratées, la croissance est un peu plus rapide. Les tiges de pastèque matures sont capables de faire pousser des pastèques. +Premature Melon Stem (Stage @1)=Tige de Pastèque Prématurée (Etape @1) +Mature Melon Stem=Tige de Pastèque Mature +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Une tige de pastèque mature tente de faire pousser un pastèque sur l'un de ses quatre blocs adjacents. Une pastèque ne peut pousser que sur des terres agricoles, de la terre ou un bloc d'herbe. Lorsqu'une pastèque est à côté d'une tige de pastèque, la tige de pastèque se plie immédiatement et se connecte au melon. Lorsqu'elle est connectée, une tige de pastèque ne peut pas faire pousser une autre pastèque. Dès que tous les pastèques autour de la tige ont été supprimés, elle perd la connexion et est prêt à faire pousser une autre pastèque. +Melon Slice=Tranche de Pastèque +This is a food item which can be eaten.=Il s'agit d'un aliment qui peut être mangé. +Premature Potato Plant=Plant de Pomme de Terre Prématuré +Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de pommes de terre sont des plants qui poussent sur les terres agricoles sous la lumière du soleil en 8 étapes, mais seulement 4 étapes peuvent être distinguées visuellement. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. +Premature Potato Plant (Stage @1)=Plant de pomme de terre prématuré (Etape @1) +Mature Potato Plant=Plant de Pomme de Terre Mature +Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Les plants de pommes de terre matures sont prêts à être récoltés pour les pommes de terre. Ils ne grandiront plus. +Potato=Pomme de terre +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Les pommes de terre sont des aliments qui peuvent être consommés, cuits au four et plantés. Des porcs comme des pommes de terre. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Tenez-le dans votre main et faites un clic droit pour le manger. Placez-le au-dessus des terres agricoles pour le planter. Il pousse au soleil et pousse plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir. +Baked Potato=Pomme de Terre au Four +Baked potatoes are food items which are more filling than the unbaked ones.=Les pommes de terre au four sont des aliments qui sont plus copieux que ceux non cuits. +Poisonous Potato=Pomme de Terre Toxique +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Cette pomme de terre n'a pas l'air trop saine. Vous pouvez le manger pour restaurer des points de faim, mais il y a 60% de chances qu'il vous empoisonne brièvement. +Pumpkin Seeds=Graines de Citrouille +Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Pousse dans une tige de citrouille qui à son tour fait pousser des citrouilles. Les poulets aiment des graines de citrouille. +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Placez les graines de citrouille sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une tige de citrouille. Les tiges de citrouille poussent au soleil et poussent plus vite sur les terres agricoles hydratées. À maturité, la tige tente de faire pousser une citrouille à côté d'elle. Faites un clic droit sur un animal pour le nourrir de graines de citrouille. +Premature Pumpkin Stem=Tige de Citrouille Prématurée +Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Les tiges de citrouille poussent sur les terres agricoles en 8 étapes. Sur les terres agricoles hydratées, la croissance est un peu plus rapide. Les tiges de citrouille matures peuvent faire pousser des citrouilles. +Premature Pumpkin Stem (Stage @1)=Tige de Citrouille Prématurée (Etape @1) +Mature Pumpkin Stem=Tige de Citrouille Mature +A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Une tige de citrouille mature tente de faire pousser une citrouille dans l'un de ses quatre blocs adjacents. Une citrouille ne peut pousser que sur des terres agricoles, de la terre ou un bloc d'herbe. Lorsqu'une citrouille est à côté d'une tige de citrouille, la tige de citrouille se plie immédiatement et se connecte à la citrouille. Une tige de citrouille connectée ne peut pas faire pousser une autre citrouille. Dès que toutes les citrouilles autour de la tige ont été retirées, elle perd la connexion et est prête à faire pousser une autre citrouille. +Faceless Pumpkin=Citrouille sans visage +A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Une citrouille sans visage est un bloc décoratif. Il peut être sculpté avec une cisaille pour obtenir des graines de citrouille. +Pumpkin=Citrouille +A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Une citrouille peut être portée comme un casque. Les citrouilles poussent à partir de tiges de citrouille, qui à leur tour poussent à partir de graines de citrouille. +Jack o'Lantern=Citrouille-lanterne +A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Une citrouille-lanterne est une décoration traditionnelle d'Halloween à base de citrouille. Il brille de mille feux. +Pumpkin Pie=Tarte à la Citrouille +A pumpkin pie is a tasty food item which can be eaten.=Une tarte à la citrouille est un aliment savoureux qui peut être mangé. +Farmland=Terres Agricoles +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Les terres agricoles sont utilisées pour l'agriculture, une surface nécessaire pour planter des cultures. Il est créé lorsqu'une houe est utilisée sur de la terre ou un bloc similaire. Les plantes peuvent pousser sur les terres agricoles, mais lentement. Les terres agricoles deviendront des terres agricoles hydratées (sur lesquelles les plantes poussent plus rapidement) lorsqu'il pleut ou lorsqu'une source d'eau est à proximité. Ce bloc redeviendra de la terre lorsqu'un bloc solide apparaît au-dessus ou qu'un bras de piston s'étend au-dessus. +Hydrated Farmland=Terres Agricoles Hydratées +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Les terres agricoles hydratées sont utilisées dans l'agriculture, c'est là que vous pouvez planter et faire pousser certaines plantes. Il est créé lorsque les terres agricoles sont sous la pluie ou près de l'eau. Sans eau, ce bloc finira par se dessécher. Ce bloc redeviendra de la terre lorsqu'un bloc solide apparaît au-dessus ou qu'un bras de piston s'étend au-dessus. +Wheat Seeds=Graines de blé +Grows into a wheat plant. Chickens like wheat seeds.=Se transforme en blé. Les poulets aiment les graines de blé. +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Placez les graines de blé sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une plante de blé. Ils poussent au soleil et poussent plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir de graines de blé. +Premature Wheat Plant=Plant de Blé Prématurée +Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de blé prématurés poussent sur les terres agricoles sous la lumière du soleil en 8 étapes. Sur les terres agricoles hydratées, ils croissent plus rapidement. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. +Premature Wheat Plant (Stage @1)=Plant de blé prématurée (Etape @1) +Mature Wheat Plant=Plant de Blé Maturée +Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Les plants de blé matures sont prêts à être récoltés pour le blé et les graines de blé. Ils ne grandiront plus. +Wheat=Blé +Wheat is used in crafting. Some animals like wheat.=Le blé est utilisé dans l'artisanat. Certains animaux aiment le blé. +Cookie=Cookie +Bread=Pain +Hay Bale=Balle de Foin +Hay bales are decorative blocks made from wheat.=Les balles de foin sont des blocs décoratifs en blé. +To carve a face into the pumpkin, use the shears on the side you want to carve.=Pour sculpter un visage dans la citrouille, utilisez les cisailles du côté que vous souhaitez sculpter. +Use the “Place” key on an animal to try to feed it wheat.=Utilisez la touche "Placer" sur un animal pour essayer de le nourrir de blé. +Grows on farmland=Pousse sur les terres agricoles +Turns block into farmland=Transforme un bloc en terres agricoles +60% chance of poisoning=60% de chances d'empoisonnement +Surface for crops=Surface pour les cultures +Can become wet=Peut devenir humide +Uses: @1=Utilisations: @1 diff --git a/mods/ITEMS/mcl_farming/locale/template.txt b/mods/ITEMS/mcl_farming/locale/template.txt new file mode 100644 index 00000000..7359fefa --- /dev/null +++ b/mods/ITEMS/mcl_farming/locale/template.txt @@ -0,0 +1,99 @@ +# textdomain: mcl_farming +Beetroot Seeds= +Grows into a beetroot plant. Chickens like beetroot seeds.= +Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.= +Premature Beetroot Plant (Stage 1)= +Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= +Premature Beetroot Plant= +Premature Beetroot Plant (Stage 2)= +Premature Beetroot Plant (Stage 3)= +Mature Beetroot Plant= +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.= +Beetroot= +Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.= +Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.= +Beetroot Soup= +Beetroot soup is a food item.= +Premature Carrot Plant= +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= +Premature Carrot Plant (Stage @1)= +Mature Carrot Plant= +Mature carrot plants are ready to be harvested for carrots. They won't grow any further.= +Carrot= +Carrots can be eaten and planted. Pigs and rabbits like carrots.= +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.= +Golden Carrot= +A golden carrot is a precious food item which can be eaten. It is really, really filling!= +Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.= +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.= +Wood Hoe= +Stone Hoe= +Iron Hoe= +Golden Hoe= +Diamond Hoe= +Melon Seeds= +Grows into a melon stem which in turn grows melons. Chickens like melon seeds.= +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.= +Melon= +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.= +Premature Melon Stem= +Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.= +Premature Melon Stem (Stage @1)= +Mature Melon Stem= +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.= +Melon Slice= +This is a food item which can be eaten.= +Premature Potato Plant= +Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= +Premature Potato Plant (Stage @1)= +Mature Potato Plant= +Mature potato plants are ready to be harvested for potatoes. They won't grow any further.= +Potato= +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.= +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.= +Baked Potato= +Baked potatoes are food items which are more filling than the unbaked ones.= +Poisonous Potato= +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.= +Pumpkin Seeds= +Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.= +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.= +Premature Pumpkin Stem= +Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.= +Premature Pumpkin Stem (Stage @1)= +Mature Pumpkin Stem= +A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.= +Faceless Pumpkin= +A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.= +Pumpkin= +A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.= +Jack o'Lantern= +A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.= +Pumpkin Pie= +A pumpkin pie is a tasty food item which can be eaten.= +Farmland= +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.= +Hydrated Farmland= +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.= +Wheat Seeds= +Grows into a wheat plant. Chickens like wheat seeds.= +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.= +Premature Wheat Plant= +Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.= +Premature Wheat Plant (Stage @1)= +Mature Wheat Plant= +Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.= +Wheat= +Wheat is used in crafting. Some animals like wheat.= +Cookie= +Bread= +Hay Bale= +Hay bales are decorative blocks made from wheat.= +To carve a face into the pumpkin, use the shears on the side you want to carve.= +Use the “Place” key on an animal to try to feed it wheat.= +Grows on farmland= +Turns block into farmland= +60% chance of poisoning= +Surface for crops= +Can become wet= +Uses: @1= diff --git a/mods/ITEMS/mcl_farming/melon.lua b/mods/ITEMS/mcl_farming/melon.lua index fa8929c0..43ff7b0f 100644 --- a/mods/ITEMS/mcl_farming/melon.lua +++ b/mods/ITEMS/mcl_farming/melon.lua @@ -1,11 +1,14 @@ +local S = minetest.get_translator("mcl_farming") + -- Seeds minetest.register_craftitem("mcl_farming:melon_seeds", { - description = "Melon Seeds", - _doc_items_longdesc = "Grows into a melon. Chickens like melon seeds.", - _doc_items_usagehelp = "Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melons grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it melon seeds.", + description = S("Melon Seeds"), + _tt_help = S("Grows on farmland"), + _doc_items_longdesc = S("Grows into a melon stem which in turn grows melons. Chickens like melon seeds."), + _doc_items_usagehelp = S("Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds."), stack_max = 64, groups = { craftitem=1 }, - inventory_image = "farming_melon_seed.png", + inventory_image = "mcl_farming_melon_seeds.png", on_place = function(itemstack, placer, pointed_thing) return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:melontige_1") end, @@ -14,12 +17,11 @@ minetest.register_craftitem("mcl_farming:melon_seeds", { -- Melon template (will be fed into mcl_farming.register_gourd local melon_base_def = { - description = "Melon", - _doc_items_longdesc = "A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.", + description = S("Melon"), + _doc_items_longdesc = S("A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices."), stack_max = 64, tiles = {"farming_melon_top.png", "farming_melon_top.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png"}, groups = {handy=1,axey=1, plant=1,building_block=1,enderman_takable=1,dig_by_piston=1}, - paramtype = "light", drop = { max_items = 1, items = { @@ -31,14 +33,14 @@ local melon_base_def = { } }, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 5, + _mcl_blast_resistance = 1, _mcl_hardness = 1, } -- Drop proabilities for melon stem local stem_drop = { max_items = 1, - -- FIXME: The probabilities are slightly off from the original. + -- The probabilities are slightly off from the original. -- Update this drop list when the Minetest drop probability system -- is more powerful. items = { @@ -69,12 +71,13 @@ for s=1,7 do local doc = s == 1 local longdesc, entry_name if doc then - entry_name = "Premature Melon Stem" - longdesc = "Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons." + entry_name = S("Premature Melon Stem") + longdesc = S("Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.") end local colorstring = mcl_farming:stem_color(startcolor, endcolor, s, 8) + local texture = "([combine:16x16:0,"..((8-s)*2).."=mcl_farming_melon_stem_disconnected.png)^[colorize:"..colorstring..":127" minetest.register_node("mcl_farming:melontige_"..s, { - description = string.format("Premature Melon Stem (Stage %d)", s), + description = S("Premature Melon Stem (Stage @1)", s), _doc_items_create_entry = doc, _doc_items_entry_name = entry_name, _doc_items_longdesc = longdesc, @@ -83,7 +86,9 @@ for s=1,7 do drawtype = "plantlike", sunlight_propagates = true, drop = stem_drop, - tiles = {"([combine:16x16:0,"..((8-s)*2).."=mcl_farming_melon_stem_disconnected.png)^[colorize:"..colorstring..":127"}, + tiles = {texture}, + wield_image = texture, + inventory_image = texture, selection_box = { type = "fixed", fixed = { @@ -98,10 +103,12 @@ end -- Full melon stem, able to spawn melons local stem_def = { - description = "Mature Melon Stem", + description = S("Mature Melon Stem"), _doc_items_create_entry = true, - _doc_items_longdesc = "A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.", + _doc_items_longdesc = S("A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon."), tiles = {"mcl_farming_melon_stem_disconnected.png^[colorize:#FFA800:127"}, + wield_image = "mcl_farming_melon_stem_disconnected.png^[colorize:#FFA800:127", + inventory_image = "mcl_farming_melon_stem_disconnected.png^[colorize:#FFA800:127", } -- Register stem growth @@ -113,8 +120,8 @@ mcl_farming:add_gourd("mcl_farming:melontige_unconnect", "mcl_farming:melontige_ -- Items and crafting minetest.register_craftitem("mcl_farming:melon_item", { -- Original name: “Melon” - description = "Melon Slice", - _doc_items_longdesc = "This is a food item which can be eaten.", + description = S("Melon Slice"), + _doc_items_longdesc = S("This is a food item which can be eaten."), stack_max = 64, inventory_image = "farming_melon.png", on_place = minetest.item_eat(2), diff --git a/mods/ITEMS/mcl_farming/potatoes.lua b/mods/ITEMS/mcl_farming/potatoes.lua index db9a963e..2d8978df 100644 --- a/mods/ITEMS/mcl_farming/potatoes.lua +++ b/mods/ITEMS/mcl_farming/potatoes.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_farming") + -- Premature potato plants for i=1, 7 do @@ -16,8 +18,8 @@ for i=1, 7 do local create, name, longdesc if i==1 then create = true - name = "Premature Potato Plant" - longdesc = "Potato plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature." + name = S("Premature Potato Plant") + longdesc = S("Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") else create = false if minetest.get_modpath("doc") then @@ -26,7 +28,7 @@ for i=1, 7 do end minetest.register_node("mcl_farming:potato_"..i, { - description = string.format("Premature Potato Plant (Stage %d)", i), + description = S("Premature Potato Plant (Stage @1)", i), _doc_items_create_entry = create, _doc_items_entry_name = name, _doc_items_longdesc = longdesc, @@ -38,6 +40,8 @@ for i=1, 7 do drawtype = "plantlike", drop = "mcl_farming:potato_item", tiles = { texture }, + inventory_image = texture, + wield_image = texture, selection_box = { type = "fixed", fixed = { selbox }, @@ -50,8 +54,8 @@ end -- Mature plant minetest.register_node("mcl_farming:potato", { - description = "Mature Potato Plant", - _doc_items_longdesc = "Mature potato plants are ready to be harvested for potatoes. They won't grow any further.", + description = S("Mature Potato Plant"), + _doc_items_longdesc = S("Mature potato plants are ready to be harvested for potatoes. They won't grow any further."), paramtype = "light", paramtype2 = "meshoptions", sunlight_propagates = true, @@ -59,6 +63,8 @@ minetest.register_node("mcl_farming:potato", { walkable = false, drawtype = "plantlike", tiles = {"mcl_farming_potatoes_stage_3.png"}, + wield_image = "mcl_farming_potatoes_stage_3.png", + inventory_image = "mcl_farming_potatoes_stage_3.png", drop = { items = { { items = {'mcl_farming:potato_item 1'} }, @@ -80,9 +86,10 @@ minetest.register_node("mcl_farming:potato", { }) minetest.register_craftitem("mcl_farming:potato_item", { - description = "Potato", - _doc_items_longdesc = "Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.", - _doc_items_usagehelp = "Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.", + description = S("Potato"), + _tt_help = S("Grows on farmland"), + _doc_items_longdesc = S("Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes."), + _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), inventory_image = "farming_potato.png", groups = { food = 2, eatable = 1 }, _mcl_saturation = 0.6, @@ -99,8 +106,8 @@ minetest.register_craftitem("mcl_farming:potato_item", { }) minetest.register_craftitem("mcl_farming:potato_item_baked", { - description = "Baked Potato", - _doc_items_longdesc = "Baked potatoes are food items which are more filling than the unbaked ones.", + description = S("Baked Potato"), + _doc_items_longdesc = S("Baked potatoes are food items which are more filling than the unbaked ones."), stack_max = 64, inventory_image = "farming_potato_baked.png", on_place = minetest.item_eat(5), @@ -110,8 +117,9 @@ minetest.register_craftitem("mcl_farming:potato_item_baked", { }) minetest.register_craftitem("mcl_farming:potato_item_poison", { - description = "Poisonous Potato", - _doc_items_longdesc = "This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.", + description = S("Poisonous Potato"), + _tt_help = minetest.colorize("#FFFF00", S("60% chance of poisoning")), + _doc_items_longdesc = S("This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly."), stack_max = 64, inventory_image = "farming_potato_poison.png", -- TODO: Cause status effects diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 8a01caf7..5fc9a4e3 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -1,10 +1,19 @@ +local S = minetest.get_translator("mcl_farming") + +local mod_screwdriver = minetest.get_modpath("screwdriver") ~= nil +local on_rotate +if mod_screwdriver then + on_rotate = screwdriver.rotate_simple +end + -- Seeds minetest.register_craftitem("mcl_farming:pumpkin_seeds", { - description = "Pumpkin Seeds", - _doc_items_longdesc = "Grows into a pumpkin. Chickens like pumpkin seeds.", - _doc_items_usagehelp = "Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkins grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it pumpkin seeds.", + description = S("Pumpkin Seeds"), + _tt_help = S("Grows on farmland"), + _doc_items_longdesc = S("Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds."), + _doc_items_usagehelp = S("Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds."), stack_max = 64, - inventory_image = "farming_pumpkin_seed.png", + inventory_image = "mcl_farming_pumpkin_seeds.png", groups = { craftitem=1 }, on_place = function(itemstack, placer, pointed_thing) return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:pumpkin_1") @@ -13,7 +22,7 @@ minetest.register_craftitem("mcl_farming:pumpkin_seeds", { local stem_drop = { max_items = 1, - -- FIXME: The probabilities are slightly off from the original. + -- The probabilities are slightly off from the original. -- Update this drop list when the Minetest drop probability system -- is more powerful. items = { @@ -42,12 +51,13 @@ for s=1,7 do local doc = s == 1 local longdesc, entry_name if doc then - entry_name = "Premature Pumpkin Stem" - longdesc = "Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins." + entry_name = S("Premature Pumpkin Stem") + longdesc = S("Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.") end local colorstring = mcl_farming:stem_color(startcolor, endcolor, s, 8) + local texture = "([combine:16x16:0,"..((8-s)*2).."=mcl_farming_pumpkin_stem_disconnected.png)^[colorize:"..colorstring..":127" minetest.register_node("mcl_farming:pumpkin_"..s, { - description = string.format("Premature Pumpkin Stem (Stage %d)", s), + description = S("Premature Pumpkin Stem (Stage @1)", s), _doc_items_entry_name = entry_name, _doc_items_create_entry = doc, _doc_items_longdesc = longdesc, @@ -56,7 +66,9 @@ for s=1,7 do drawtype = "plantlike", sunlight_propagates = true, drop = stem_drop, - tiles = {"([combine:16x16:0,"..((8-s)*2).."=mcl_farming_pumpkin_stem_disconnected.png)^[colorize:"..colorstring..":127"}, + tiles = {texture}, + inventory_image = texture, + wield_image = texture, selection_box = { type = "fixed", fixed = { @@ -71,30 +83,48 @@ end -- Full stem (not connected) local stem_def = { - description = "Mature Pumpkin Stem", - _doc_items_longdesc = "A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.", + description = S("Mature Pumpkin Stem"), + _doc_items_longdesc = S("A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin."), tiles = {"mcl_farming_pumpkin_stem_disconnected.png^[colorize:#FFA800:127"}, + wield_image = "mcl_farming_pumpkin_stem_disconnected.png^[colorize:#FFA800:127", + inventory_image = "mcl_farming_pumpkin_stem_disconnected.png^[colorize:#FFA800:127", } -- Template for pumpkin local pumpkin_base_def = { - description = "Pumpkin", - _doc_items_longdesc = "A pumpkin is a naturally occouring block from the grasslands and is remarkable for its strange face-like cavity, which is developed naturally. A pumpkin can be worn as a helmet for fun, but it doesn't offer any protection. Pumpkins are grown from pumpkin stems, which in turn are grown from pumpkin seeds.", + description = S("Faceless Pumpkin"), + _doc_items_longdesc = S("A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds."), + _doc_items_usagehelp = S("To carve a face into the pumpkin, use the shears on the side you want to carve."), stack_max = 64, - paramtype = "light", paramtype2 = "facedir", - tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face.png"}, - groups = {handy=1,axey=1, plant=1,building_block=1, armor_head=1,non_combat_armor=1, dig_by_piston=1, enderman_takable=1}, + tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png"}, + groups = {handy=1,axey=1, plant=1,building_block=1, dig_by_piston=1, enderman_takable=1}, sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 5, + on_rotate = on_rotate, + _mcl_blast_resistance = 1, _mcl_hardness = 1, } +minetest.register_node("mcl_farming:pumpkin", pumpkin_base_def) + +local pumpkin_face_base_def = table.copy(pumpkin_base_def) +pumpkin_face_base_def.description = S("Pumpkin") +pumpkin_face_base_def._doc_items_longdesc = S("A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.") +pumpkin_face_base_def._doc_items_usagehelp = nil +pumpkin_face_base_def.tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face.png"} +pumpkin_face_base_def.groups.armor_head=1 +pumpkin_face_base_def._mcl_armor_mob_range_factor = 0 +pumpkin_face_base_def._mcl_armor_mob_range_mob = "mobs_mc:enderman" +pumpkin_face_base_def.groups.non_combat_armor=1 +if minetest.get_modpath("mcl_armor") then + pumpkin_face_base_def.on_secondary_use = armor.on_armor_use +end +minetest.register_node("mcl_farming:pumpkin_face", pumpkin_face_base_def) -- Register stem growth mcl_farming:add_plant("plant_pumpkin_stem", "mcl_farming:pumpkintige_unconnect", {"mcl_farming:pumpkin_1", "mcl_farming:pumpkin_2", "mcl_farming:pumpkin_3", "mcl_farming:pumpkin_4", "mcl_farming:pumpkin_5", "mcl_farming:pumpkin_6", "mcl_farming:pumpkin_7"}, 30, 5) -- Register actual pumpkin, connected stems and stem-to-pumpkin growth -mcl_farming:add_gourd("mcl_farming:pumpkintige_unconnect", "mcl_farming:pumpkintige_linked", "mcl_farming:pumpkintige_unconnect", stem_def, stem_drop, "mcl_farming:pumpkin_face", pumpkin_base_def, 30, 15, "mcl_farming_pumpkin_stem_connected.png^[colorize:#FFA800:127", +mcl_farming:add_gourd("mcl_farming:pumpkintige_unconnect", "mcl_farming:pumpkintige_linked", "mcl_farming:pumpkintige_unconnect", stem_def, stem_drop, "mcl_farming:pumpkin", pumpkin_base_def, 30, 15, "mcl_farming_pumpkin_stem_connected.png^[colorize:#FFA800:127", function(pos) -- Attempt to spawn iron golem or snow golem mobs_mc.tools.check_iron_golem_summon(pos) @@ -103,14 +133,13 @@ end) -- Jack o'Lantern minetest.register_node("mcl_farming:pumpkin_face_light", { - description = "Jack o'Lantern", - _doc_items_longdesc = "A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.", + description = S("Jack o'Lantern"), + _doc_items_longdesc = S("A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly."), is_ground_content = false, stack_max = 64, paramtype = "light", paramtype2 = "facedir", - -- Real light level: 15 (Minetest caps at 14) - light_source = 14, + light_source = minetest.LIGHT_MAX, tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face_light.png"}, groups = {handy=1,axey=1, building_block=1, dig_by_piston=1 }, sounds = mcl_sounds.node_sound_wood_defaults(), @@ -119,7 +148,8 @@ minetest.register_node("mcl_farming:pumpkin_face_light", { mobs_mc.tools.check_iron_golem_summon(pos) mobs_mc.tools.check_snow_golem_summon(pos) end, - _mcl_blast_resistance = 5, + on_rotate = on_rotate, + _mcl_blast_resistance = 1, _mcl_hardness = 1, }) @@ -131,14 +161,19 @@ minetest.register_craft({ {"mcl_torches:torch"}} }) +minetest.register_craft({ + output = "mcl_farming:pumpkin_seeds 4", + recipe = {{"mcl_farming:pumpkin"}} +}) + minetest.register_craft({ output = "mcl_farming:pumpkin_seeds 4", recipe = {{"mcl_farming:pumpkin_face"}} }) minetest.register_craftitem("mcl_farming:pumpkin_pie", { - description = "Pumpkin Pie", - _doc_items_longdesc = "A pumpkin pie is a tasty food item which can be eaten.", + description = S("Pumpkin Pie"), + _doc_items_longdesc = S("A pumpkin pie is a tasty food item which can be eaten."), stack_max = 64, inventory_image = "mcl_farming_pumpkin_pie.png", wield_image = "mcl_farming_pumpkin_pie.png", @@ -148,12 +183,18 @@ minetest.register_craftitem("mcl_farming:pumpkin_pie", { _mcl_saturation = 4.8, }) +minetest.register_craft({ + type = "shapeless", + output = "mcl_farming:pumpkin_pie", + recipe = {"mcl_farming:pumpkin", "mcl_core:sugar", "mcl_throwing:egg"}, +}) minetest.register_craft({ type = "shapeless", output = "mcl_farming:pumpkin_pie", recipe = {"mcl_farming:pumpkin_face", "mcl_core:sugar", "mcl_throwing:egg"}, }) + if minetest.get_modpath("doc") then for i=2,8 do doc.add_entry_alias("nodes", "mcl_farming:pumpkin_1", "nodes", "mcl_farming:pumpkin_"..i) diff --git a/mods/ITEMS/mcl_farming/shared_functions.lua b/mods/ITEMS/mcl_farming/shared_functions.lua index 486f9359..0c366af2 100644 --- a/mods/ITEMS/mcl_farming/shared_functions.lua +++ b/mods/ITEMS/mcl_farming/shared_functions.lua @@ -24,14 +24,15 @@ end -- pos: Position -- node: Node table -- stages: Number of stages to advance (optional, defaults to 1) +-- ignore_light: if true, ignore light requirements for growing -- Returns true if plant has been grown by 1 or more stages. -- Returns false if nothing changed. -function mcl_farming:grow_plant(identifier, pos, node, stages) - if not minetest.get_node_light(pos) then +function mcl_farming:grow_plant(identifier, pos, node, stages, ignore_light) + if not minetest.get_node_light(pos) and not ignore_light then return false end - if minetest.get_node_light(pos) < 10 then + if minetest.get_node_light(pos) < 10 and not ignore_light then return false end @@ -83,7 +84,7 @@ function mcl_farming:place_seed(itemstack, placer, pointed_thing, plantname) local place_s = minetest.get_node(pos) if string.find(farmland.name, "mcl_farming:soil") and string.find(place_s.name, "air") then - minetest.sound_play(minetest.registered_nodes[plantname].sounds.place, {pos = pos}) + minetest.sound_play(minetest.registered_nodes[plantname].sounds.place, {pos = pos}, true) minetest.add_node(pos, {name=plantname, param2 = minetest.registered_nodes[plantname].place_param2}) else return @@ -278,7 +279,6 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s walkable = false, drop = stem_drop, drawtype = "nodebox", - paramtype = "light", node_box = { type = "fixed", fixed = connected_stem_nodebox[i] @@ -322,7 +322,7 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s floor = minetest.get_node(floorpos) local block = minetest.get_node(blockpos) local soilgroup = minetest.get_item_group(floor.name, "soil") - if not ((floor.name=="mcl_core:dirt_with_grass" or floor.name=="mcl_core:dirt_with_grass_snow" or floor.name=="mcl_core:dirt" or soilgroup == 2 or soilgroup == 3) and block.name == "air") then + if not ((minetest.get_item_group(floor.name, "grass_block") == 1 or floor.name=="mcl_core:dirt" or soilgroup == 2 or soilgroup == 3) and block.name == "air") then table.remove(neighbors, n) end end diff --git a/mods/ITEMS/mcl_farming/soil.lua b/mods/ITEMS/mcl_farming/soil.lua index 4c5882ee..0c0e3b83 100644 --- a/mods/ITEMS/mcl_farming/soil.lua +++ b/mods/ITEMS/mcl_farming/soil.lua @@ -1,7 +1,10 @@ +local S = minetest.get_translator("mcl_farming") + minetest.register_node("mcl_farming:soil", { - tiles = {"farming_soil.png", "default_dirt.png", "default_dirt.png", "default_dirt.png", "default_dirt.png", "default_dirt.png"}, - description = "Farmland", - _doc_items_longdesc = "Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.", + tiles = {"mcl_farming_farmland_dry.png", "default_dirt.png"}, + description = S("Farmland"), + _tt_help = S("Surface for crops").."\n"..S("Can become wet"), + _doc_items_longdesc = S("Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it."), drop = "mcl_core:dirt", drawtype = "nodebox", paramtype = "light", @@ -16,16 +19,16 @@ minetest.register_node("mcl_farming:soil", { local meta = minetest.get_meta(pos) meta:set_int("wet", 0) end, - groups = {handy=1,shovely=1, not_in_creative_inventory=1, dirtifies_below_solid=1, soil=2, soil_sapling=1 }, + groups = {handy=1,shovely=1, dirtifies_below_solid=1, dirtifier=1, soil=2, soil_sapling=1, deco_block=1 }, sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_blast_resistance = 3, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.6, }) minetest.register_node("mcl_farming:soil_wet", { - tiles = {"farming_soil_wet.png", "default_dirt.png", "default_dirt.png", "default_dirt.png", "default_dirt.png", "default_dirt.png"}, - description = "Hydrated Farmland", - _doc_items_longdesc = "Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmlands is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.", + tiles = {"mcl_farming_farmland_wet.png", "default_dirt.png"}, + description = S("Hydrated Farmland"), + _doc_items_longdesc = S("Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it."), drop = "mcl_core:dirt", drawtype = "nodebox", paramtype = "light", @@ -39,9 +42,9 @@ minetest.register_node("mcl_farming:soil_wet", { local meta = minetest.get_meta(pos) meta:set_int("wet", 7) end, - groups = {handy=1,shovely=1, not_in_creative_inventory=1, dirtifies_below_solid=1, soil=3, soil_sapling=1 }, + groups = {handy=1,shovely=1, not_in_creative_inventory=1, dirtifies_below_solid=1, dirtifier=1, soil=3, soil_sapling=1 }, sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_blast_resistance = 3, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.6, }) @@ -88,8 +91,8 @@ minetest.register_abm({ -- The decay branch (make farmland dry or turn back to dirt) -- Don't decay while it's raining - if rain.raining then - if weather.is_outdoor(pos) then + if mcl_weather.rain.raining then + if mcl_weather.is_outdoor(pos) then return end end diff --git a/mods/ITEMS/mcl_farming/textures/farming_carrot_4.png b/mods/ITEMS/mcl_farming/textures/farming_carrot_4.png index d1017eee..403257f4 100644 Binary files a/mods/ITEMS/mcl_farming/textures/farming_carrot_4.png and b/mods/ITEMS/mcl_farming/textures/farming_carrot_4.png differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_melon_side.png b/mods/ITEMS/mcl_farming/textures/farming_melon_side.png index 6630ce52..0979b720 100644 Binary files a/mods/ITEMS/mcl_farming/textures/farming_melon_side.png and b/mods/ITEMS/mcl_farming/textures/farming_melon_side.png differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_melon_top.png b/mods/ITEMS/mcl_farming/textures/farming_melon_top.png index 770871c9..8738599c 100644 Binary files a/mods/ITEMS/mcl_farming/textures/farming_melon_top.png and b/mods/ITEMS/mcl_farming/textures/farming_melon_top.png differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_potato.png b/mods/ITEMS/mcl_farming/textures/farming_potato.png index 6614adcb..70e3a7e0 100644 Binary files a/mods/ITEMS/mcl_farming/textures/farming_potato.png and b/mods/ITEMS/mcl_farming/textures/farming_potato.png differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_seed.png b/mods/ITEMS/mcl_farming/textures/farming_pumpkin_seed.png deleted file mode 100644 index 52c239c7..00000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_seed.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_side.png b/mods/ITEMS/mcl_farming/textures/farming_pumpkin_side.png index 9ed67ca2..a1a4fa9b 100644 Binary files a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_side.png and b/mods/ITEMS/mcl_farming/textures/farming_pumpkin_side.png differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_top.png b/mods/ITEMS/mcl_farming/textures/farming_pumpkin_top.png index 73d1ef54..01cde9e9 100644 Binary files a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_top.png and b/mods/ITEMS/mcl_farming/textures/farming_pumpkin_top.png differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_soil.png b/mods/ITEMS/mcl_farming/textures/farming_soil.png deleted file mode 100644 index 4606f6fa..00000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_soil.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_soil_wet.png b/mods/ITEMS/mcl_farming/textures/farming_soil_wet.png deleted file mode 100644 index bad8fb00..00000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_soil_wet.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_tool_diamondhoe.png b/mods/ITEMS/mcl_farming/textures/farming_tool_diamondhoe.png index 0adc102a..f74cc4af 100644 Binary files a/mods/ITEMS/mcl_farming/textures/farming_tool_diamondhoe.png and b/mods/ITEMS/mcl_farming/textures/farming_tool_diamondhoe.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_dry.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_dry.png new file mode 100644 index 00000000..44c956b6 Binary files /dev/null and b/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_dry.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_wet.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_wet.png new file mode 100644 index 00000000..f5ebf2de Binary files /dev/null and b/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_wet.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_side.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_side.png index ec51c0d7..4d994067 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_side.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_side.png differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_melon_seed.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_seeds.png similarity index 100% rename from mods/ITEMS/mcl_farming/textures/farming_melon_seed.png rename to mods/ITEMS/mcl_farming/textures/mcl_farming_melon_seeds.png diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_seeds.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_seeds.png new file mode 100644 index 00000000..24e2c80c Binary files /dev/null and b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_seeds.png differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_wheat_seed.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_seeds.png similarity index 100% rename from mods/ITEMS/mcl_farming/textures/farming_wheat_seed.png rename to mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_seeds.png diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_2.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_2.png index 3788a40d..323cc830 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_2.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_2.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_3.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_3.png index 889a56d6..247c9e05 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_3.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_3.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_4.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_4.png index 91bdd2b3..7410aa01 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_4.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_4.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_6.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_6.png index 6b2b2307..04221b43 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_6.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_6.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_7.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_7.png index 83d25927..bff840d3 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_7.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_7.png differ diff --git a/mods/ITEMS/mcl_farming/wheat.lua b/mods/ITEMS/mcl_farming/wheat.lua index 1396ec0a..9a8a9f65 100644 --- a/mods/ITEMS/mcl_farming/wheat.lua +++ b/mods/ITEMS/mcl_farming/wheat.lua @@ -1,10 +1,13 @@ +local S = minetest.get_translator("mcl_farming") + minetest.register_craftitem("mcl_farming:wheat_seeds", { -- Original Minecraft name: “Seeds” - description = "Wheat Seeds", - _doc_items_longdesc = "Grows into a wheat plant. Chickens like wheat seeds.", - _doc_items_usagehelp = "Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.", + description = S("Wheat Seeds"), + _tt_help = S("Grows on farmland"), + _doc_items_longdesc = S("Grows into a wheat plant. Chickens like wheat seeds."), + _doc_items_usagehelp = S("Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds."), groups = { craftitem=1 }, - inventory_image = "farming_wheat_seed.png", + inventory_image = "mcl_farming_wheat_seeds.png", on_place = function(itemstack, placer, pointed_thing) return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:wheat_1") end @@ -24,14 +27,14 @@ for i=1,7 do local create, name, longdesc if i == 1 then create = true - name = "Premature Wheat Plant" - longdesc = "Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature." + name = S("Premature Wheat Plant") + longdesc = S("Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.") else create = false end minetest.register_node("mcl_farming:wheat_"..i, { - description = string.format("Premature Wheat Plant (Stage %d)", i), + description = S("Premature Wheat Plant (Stage @1)", i), _doc_items_create_entry = create, _doc_items_entry_name = name, _doc_items_longdesc = longdesc, @@ -58,8 +61,8 @@ for i=1,7 do end minetest.register_node("mcl_farming:wheat", { - description = "Mature Wheat Plant", - _doc_items_longdesc = "Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.", + description = S("Mature Wheat Plant"), + _doc_items_longdesc = S("Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further."), sunlight_propagates = true, paramtype = "light", paramtype2 = "meshoptions", @@ -86,9 +89,9 @@ minetest.register_node("mcl_farming:wheat", { mcl_farming:add_plant("plant_wheat", "mcl_farming:wheat", {"mcl_farming:wheat_1", "mcl_farming:wheat_2", "mcl_farming:wheat_3", "mcl_farming:wheat_4", "mcl_farming:wheat_5", "mcl_farming:wheat_6", "mcl_farming:wheat_7"}, 25, 20) minetest.register_craftitem("mcl_farming:wheat_item", { - description = "Wheat", - _doc_items_longdesc = "Wheat is used in crafting. Some animals like wheat.", - _doc_items_usagehelp = "Rightclick an animal to try to feed it wheat.", + description = S("Wheat"), + _doc_items_longdesc = S("Wheat is used in crafting. Some animals like wheat."), + _doc_items_usagehelp = S("Use the “Place” key on an animal to try to feed it wheat."), inventory_image = "farming_wheat_harvested.png", groups = { craftitem = 1 }, }) @@ -108,8 +111,8 @@ minetest.register_craft({ }) minetest.register_craftitem("mcl_farming:cookie", { - description = "Cookie", - _doc_items_longdesc = "This is a food item which can be eaten.", + description = S("Cookie"), + _doc_items_longdesc = S("This is a food item which can be eaten."), inventory_image = "farming_cookie.png", groups = {food=2, eatable=2}, _mcl_saturation = 0.4, @@ -119,8 +122,8 @@ minetest.register_craftitem("mcl_farming:cookie", { minetest.register_craftitem("mcl_farming:bread", { - description = "Bread", - _doc_items_longdesc = "This is a food item which can be eaten.", + description = S("Bread"), + _doc_items_longdesc = S("This is a food item which can be eaten."), inventory_image = "farming_bread.png", groups = {food=2, eatable=5}, _mcl_saturation = 6.0, @@ -128,18 +131,25 @@ minetest.register_craftitem("mcl_farming:bread", { on_secondary_use = minetest.item_eat(5), }) +local mod_screwdriver = minetest.get_modpath("screwdriver") ~= nil +local on_rotate +if mod_screwdriver then + on_rotate = screwdriver.rotate_3way +end + minetest.register_node("mcl_farming:hay_block", { - description = "Hay Bale", - _doc_items_longdesc = "Hay bales are decorative blocks made from wheat.", + description = S("Hay Bale"), + _doc_items_longdesc = S("Hay bales are decorative blocks made from wheat."), tiles = {"mcl_farming_hayblock_top.png", "mcl_farming_hayblock_top.png", "mcl_farming_hayblock_side.png"}, is_ground_content = false, stack_max = 64, paramtype2 = "facedir", is_ground_content = false, on_place = mcl_util.rotate_axis, - groups = {handy=1, flammable=2, building_block=1}, + groups = {handy=1, flammable=2, fire_encouragement=60, fire_flammability=20, building_block=1, fall_damage_add_percent=-80}, sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 2.5, + on_rotate = on_rotate, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, }) diff --git a/mods/ITEMS/mcl_fences/depends.txt b/mods/ITEMS/mcl_fences/depends.txt index cbc0405c..217875c5 100644 --- a/mods/ITEMS/mcl_fences/depends.txt +++ b/mods/ITEMS/mcl_fences/depends.txt @@ -1,3 +1,4 @@ mcl_core mcl_sounds doc? +screwdriver? diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index 5d8f8042..650854f8 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -1,4 +1,4 @@ -local init = os.clock() +local S = minetest.get_translator("mcl_fences") -- Node box local p = {-2/16, -0.5, -2/16, 2/16, 0.5, 2/16} @@ -12,11 +12,11 @@ local z2 = {-1/16, 4/16, 2/16, 1/16, 7/16, 0.5} --oben(quer) z local z22 = {-1/16, -2/16, 2/16, 1/16, 1/16, 0.5} --unten(quer) z -- Collision box -local cp = {-2/16, -0.5, -2/16, 2/16, 1, 2/16} -local cx1 = {-0.5, -2/16, -2/16, -2/16, 1, 2/16} --unten(quer) -x -local cx2 = {2/16, -2/16, -2/16, 0.5, 1, 2/16} --unten(quer) x -local cz1 = {-2/16, -2/16, -0.5, 2/16, 1, -2/16} --unten(quer) -z -local cz2 = {-2/16, -2/16, 2/16, 2/16, 1, 0.5} --unten(quer) z +local cp = {-2/16, -0.5, -2/16, 2/16, 1.01, 2/16} +local cx1 = {-0.5, -0.5, -2/16, -2/16, 1.01, 2/16} --unten(quer) -x +local cx2 = {2/16, -0.5, -2/16, 0.5, 1.01, 2/16} --unten(quer) x +local cz1 = {-2/16, -0.5, -0.5, 2/16, 1.01, -2/16} --unten(quer) -z +local cz2 = {-2/16, -0.5, 2/16, 2/16, 1.01, 0.5} --unten(quer) z mcl_fences = {} @@ -36,7 +36,7 @@ mcl_fences.register_fence = function(id, fence_name, texture, groups, hardness, table.insert(connects_to, fence_id) minetest.register_node(fence_id, { description = fence_name, - _doc_items_longdesc = "Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.", + _doc_items_longdesc = S("Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump."), tiles = {texture}, inventory_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", wield_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", @@ -100,30 +100,34 @@ mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, local tmp_node2 if state2 == 1 then state2 = 0 - minetest.sound_play(sound_close, {gain = sound_gain_close, max_hear_distance = 10, pos = pos}) + minetest.sound_play(sound_close, {gain = sound_gain_close, max_hear_distance = 10, pos = pos}, true) tmp_node2 = {name=gate_id, param1=node.param1, param2=node.param2} else state2 = 1 - minetest.sound_play(sound_open, {gain = sound_gain_open, max_hear_distance = 10, pos = pos}) + minetest.sound_play(sound_open, {gain = sound_gain_open, max_hear_distance = 10, pos = pos}, true) tmp_node2 = {name=open_gate_id, param1=node.param1, param2=node.param2} end update_gate(pos, tmp_node2) meta2:set_int("state", state2) end + local on_rotate + if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple + end + local cgroups = table.copy(groups) if cgroups == nil then cgroups = {} end cgroups.fence_gate = 1 cgroups.deco_block = 1 + cgroups.mesecon_ignore_opaque_dig = 1 cgroups.mesecon_effector_on = 1 cgroups.fence_gate = 1 minetest.register_node(open_gate_id, { tiles = {texture}, paramtype = "light", paramtype2 = "facedir", - inventory_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", - wield_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", is_ground_content = false, sunlight_propagates = true, walkable = false, @@ -153,10 +157,11 @@ mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, punch_gate(pos, node) end, mesecons = {effector = { - action_on = (function(pos, node) + action_off = (function(pos, node) punch_gate(pos, node) end), }}, + on_rotate = on_rotate, sounds = sounds, _mcl_blast_resistance = blast_resistance, _mcl_hardness = hardness, @@ -167,8 +172,9 @@ mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, cgroups_closed.mesecon_effector_off = nil minetest.register_node(gate_id, { description = fence_gate_name, - _doc_items_longdesc = "Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.", - _doc_items_usagehelp = "Right-click the fence gate to open or close it.", + _tt_help = S("Openable by players and redstone power"), + _doc_items_longdesc = S("Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates."), + _doc_items_usagehelp = S("Right-click the fence gate to open or close it."), tiles = {texture}, inventory_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", wield_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", @@ -215,6 +221,7 @@ mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, punch_gate(pos, node) end), }}, + on_rotate = on_rotate, on_rightclick = function(pos, node, clicker) punch_gate(pos, node) end, @@ -239,17 +246,17 @@ mcl_fences.register_fence_and_fence_gate = function(id, fence_name, fence_gate_n return fence_id, gate_id, open_gate_id end -local wood_groups = {handy=1,axey=1, flammable=2,fence_wood=1} +local wood_groups = {handy=1,axey=1, flammable=2,fence_wood=1, fire_encouragement=5, fire_flammability=20} local wood_connect = {"group:fence_wood"} local wood_sounds = mcl_sounds.node_sound_wood_defaults() local woods = { - {"", "Oak Fence", "Oak Fence Gate", "mcl_fences_fence_oak.png", "mcl_fences_fence_gate_oak.png", "mcl_core:wood"}, - {"spruce", "Spruce Fence", "Spruce Fence Gate", "mcl_fences_fence_spruce.png", "mcl_fences_fence_gate_spruce.png", "mcl_core:sprucewood"}, - {"birch", "Birch Fence", "Birch Fence Gate", "mcl_fences_fence_birch.png", "mcl_fences_fence_gate_birch.png", "mcl_core:birchwood"}, - {"jungle", "Jungle Fence", "Jungle Fence Gate", "mcl_fences_fence_jungle.png", "mcl_fences_fence_gate_jungle.png", "mcl_core:junglewood"}, - {"dark_oak", "Dark Oak Fence", "Dark Oak Fence Gate", "mcl_fences_fence_big_oak.png", "mcl_fences_fence_gate_big_oak.png", "mcl_core:darkwood"}, - {"acacia", "Acacia Fence", "Acacia Fence Gate", "mcl_fences_fence_acacia.png", "mcl_fences_fence_gate_acacia.png", "mcl_core:acaciawood"}, + {"", S("Oak Fence"), S("Oak Fence Gate"), "mcl_fences_fence_oak.png", "mcl_fences_fence_gate_oak.png", "mcl_core:wood"}, + {"spruce", S("Spruce Fence"), S("Spruce Fence Gate"), "mcl_fences_fence_spruce.png", "mcl_fences_fence_gate_spruce.png", "mcl_core:sprucewood"}, + {"birch", S("Birch Fence"), S("Birch Fence Gate"), "mcl_fences_fence_birch.png", "mcl_fences_fence_gate_birch.png", "mcl_core:birchwood"}, + {"jungle", S("Jungle Fence"), S("Jungle Fence Gate"), "mcl_fences_fence_jungle.png", "mcl_fences_fence_gate_jungle.png", "mcl_core:junglewood"}, + {"dark_oak", S("Dark Oak Fence"), S("Dark Oak Fence Gate"), "mcl_fences_fence_big_oak.png", "mcl_fences_fence_gate_big_oak.png", "mcl_core:darkwood"}, + {"acacia", S("Acacia Fence"), S("Acacia Fence Gate"), "mcl_fences_fence_acacia.png", "mcl_fences_fence_gate_acacia.png", "mcl_core:acaciawood"}, } for w=1, #woods do @@ -282,13 +289,13 @@ end -- Nether Brick Fence (without fence gate!) -mcl_fences.register_fence("nether_brick_fence", "Nether Brick Fence", "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults()) +mcl_fences.register_fence("nether_brick_fence", S("Nether Brick Fence"), "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults()) minetest.register_craft({ output = 'mcl_fences:nether_brick_fence 6', recipe = { - {"mcl_nether:nether_brick", "mcl_nether:nether_brick", "mcl_nether:nether_brick"}, - {"mcl_nether:nether_brick", "mcl_nether:nether_brick", "mcl_nether:nether_brick"}, + {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, + {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, } }) @@ -297,8 +304,3 @@ minetest.register_craft({ recipe = "group:fence_wood", burntime = 15, }) - -local time_to_load= os.clock() - init -print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load)) - - diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr new file mode 100644 index 00000000..5a76fc59 --- /dev/null +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr @@ -0,0 +1,18 @@ +# textdomain: mcl_fences +Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Zäune sind Gebäude, die den Weg blockieren. Sie verbinden sich gegenseitig und anderen festen Blöcken. Man kann sie nicht mit normalen Sprüngen überspringen. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Zauntore können geöffnet und geschlossen werden und können nicht übersprungen werden. Zäune werden sich gut mit Zauntoren verbinden. +Right-click the fence gate to open or close it.=Rechtsklicken Sie auf ein Zauntor, um es zu öffnen oder zu schließen. +Oak Fence=Eichenzaun +Oak Fence Gate=Eichenzauntor +Spruce Fence=Fichtenzaun +Spruce Fence Gate=Fichtenzauntor +Birch Fence=Birkenzaun +Birch Fence Gate=Birkenzauntor +Jungle Fence=Dschungelzaun +Jungle Fence Gate=Dschungelzauntor +Dark Oak Fence=Schwarzeichenzaun +Dark Oak Fence Gate=Schwarzeichenzauntor +Acacia Fence=Akazienzaun +Acacia Fence Gate=Akazienzauntor +Nether Brick Fence=Netherziegelzaun +Openable by players and redstone power=Zu öffnen von Spielern und Redstoneenergie diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.es.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.es.tr new file mode 100644 index 00000000..1e8c3798 --- /dev/null +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.es.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_fences +Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Las cercas son estructuras que bloquean el camino. Las cercas se conectarán entre sí y con los bloques sólidos. No se pueden saltar con un simple salto. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Las puertas de valla se pueden abrir o cerrar y no se pueden saltar. Las cercas se conectarán muy bien a las puertas de la cerca. +Right-click the fence gate to open or close it.=Haga clic derecho en la puerta de la cerca para abrirla o cerrarla. +Oak Fence=Valla de roble +Oak Fence Gate=Puerta de roble +Spruce Fence=Valla de abeto +Spruce Fence Gate=Puerta de abeto +Birch Fence=Valla de abedul +Birch Fence Gate=Puerta de abedul +Jungle Fence=Valla de la selva +Jungle Fence Gate=Puerta de valla de la selva +Dark Oak Fence=Valla de roble oscuro +Dark Oak Fence Gate=Puerta de roble oscuro +Acacia Fence=Valla de acacia +Acacia Fence Gate=Puerta de acacia +Nether Brick Fence=Valla de ladrillo abisal \ No newline at end of file diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr new file mode 100644 index 00000000..ccfb86d9 --- /dev/null +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr @@ -0,0 +1,18 @@ +# textdomain: mcl_fences +Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Les barrières sont des structures qui bloquent le chemin. Les barrières se connecteront les unes aux autres et aux blocs solides. Ils ne peuvent pas être sautés par un simple saut. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Les portillions peuvent être ouvertes ou fermées et ne peuvent pas être sautées. Les barrières se connecteront bien aux portillions. +Right-click the fence gate to open or close it.=Cliquez avec le bouton droit sur le portillion pour l'ouvrir ou la fermer. +Oak Fence=Barrière en bois de Chêne +Oak Fence Gate=Portillion en bois de Chêne +Spruce Fence=Barrière en bois de Sapin +Spruce Fence Gate=Portillion en bois de Sapin +Birch Fence=Barrière en bois de Bouleau +Birch Fence Gate=Portillion en bois de Bouleau +Jungle Fence=Barrière en bois d'Acajou +Jungle Fence Gate=Portillion en bois d'Acajou +Dark Oak Fence=Barrière en bois de Chêne Noir +Dark Oak Fence Gate=Portillion en bois de Chêne Noir +Acacia Fence=Barrière en bois d'Acacia +Acacia Fence Gate=Portillion en bois d'Acacia +Nether Brick Fence=Barrière en Brique du Nether +Openable by players and redstone power=Ouvrable par les joueurs et la puissance redstone diff --git a/mods/ITEMS/mcl_fences/locale/template.txt b/mods/ITEMS/mcl_fences/locale/template.txt new file mode 100644 index 00000000..a4cd1cbe --- /dev/null +++ b/mods/ITEMS/mcl_fences/locale/template.txt @@ -0,0 +1,18 @@ +# textdomain: mcl_fences +Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.= +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.= +Right-click the fence gate to open or close it.= +Oak Fence= +Oak Fence Gate= +Spruce Fence= +Spruce Fence Gate= +Birch Fence= +Birch Fence Gate= +Jungle Fence= +Jungle Fence Gate= +Dark Oak Fence= +Dark Oak Fence Gate= +Acacia Fence= +Acacia Fence Gate= +Nether Brick Fence= +Openable by players and redstone power= diff --git a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_acacia.png b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_acacia.png index 85dae567..b62dd747 100644 Binary files a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_acacia.png and b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_acacia.png differ diff --git a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_big_oak.png b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_big_oak.png index de8648e8..5068a71a 100644 Binary files a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_big_oak.png and b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_big_oak.png differ diff --git a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_birch.png b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_birch.png index 96121e12..b52db65d 100644 Binary files a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_birch.png and b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_birch.png differ diff --git a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_gate_big_oak.png b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_gate_big_oak.png index f7c0eccd..68a4323f 100644 Binary files a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_gate_big_oak.png and b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_gate_big_oak.png differ diff --git a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_jungle.png b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_jungle.png index dbc5684a..4324b3ef 100644 Binary files a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_jungle.png and b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_jungle.png differ diff --git a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_mask.png b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_mask.png index dfa9b34d..35d16291 100644 Binary files a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_mask.png and b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_mask.png differ diff --git a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_nether_brick.png b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_nether_brick.png index f8160903..7f7c461b 100644 Binary files a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_nether_brick.png and b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_nether_brick.png differ diff --git a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_oak.png b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_oak.png index 6c48e53e..90c36edf 100644 Binary files a/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_oak.png and b/mods/ITEMS/mcl_fences/textures/mcl_fences_fence_oak.png differ diff --git a/mods/ITEMS/mcl_fire/README.txt b/mods/ITEMS/mcl_fire/README.txt index 1b32a4a0..af46528a 100644 --- a/mods/ITEMS/mcl_fire/README.txt +++ b/mods/ITEMS/mcl_fire/README.txt @@ -30,3 +30,5 @@ http://www.freesound.org/people/Dynamicell/sounds/17548/ Benboncan (CC BY 3.0) https://www.freesound.org/people/Benboncan/sounds/66457/ fire_flint_and_steel.ogg + +Other sound files by Perttu Ahola (celeron55) (CC BY-SA 3.0). diff --git a/mods/ITEMS/mcl_fire/depends.txt b/mods/ITEMS/mcl_fire/depends.txt index a9b74053..3d76c648 100644 --- a/mods/ITEMS/mcl_fire/depends.txt +++ b/mods/ITEMS/mcl_fire/depends.txt @@ -1,3 +1,4 @@ mcl_core +mcl_worlds mcl_sounds -mcl_nether? +mcl_portals? diff --git a/mods/ITEMS/mcl_fire/fire_charge.lua b/mods/ITEMS/mcl_fire/fire_charge.lua index 83612b87..9f4f6bc0 100644 --- a/mods/ITEMS/mcl_fire/fire_charge.lua +++ b/mods/ITEMS/mcl_fire/fire_charge.lua @@ -1,8 +1,11 @@ +local S = minetest.get_translator("mcl_fire") + -- Fire Charge minetest.register_craftitem("mcl_fire:fire_charge", { - description = "Fire Charge", - _doc_items_longdesc = "Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.", - _doc_items_usagehelp = "Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.", + description = S("Fire Charge"), + _tt_help = S("Dispenser projectile").."\n"..S("Starts fires and ignites blocks"), + _doc_items_longdesc = S("Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly."), + _doc_items_usagehelp = S("Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up."), inventory_image = "mcl_fire_fire_charge.png", liquids_pointable = false, stack_max = 64, @@ -15,13 +18,23 @@ minetest.register_craftitem("mcl_fire:fire_charge", { end end + -- Check protection + local protname = user:get_player_name() + if minetest.is_protected(pointed_thing.under, protname) then + minetest.record_protection_violation(pointed_thing.under, protname) + return itemstack + end + -- Ignite/light fire if pointed_thing.type == "node" then local nodedef = minetest.registered_nodes[node.name] if nodedef and nodedef._on_ignite then - nodedef._on_ignite(user, pointed_thing) + local overwrite = nodedef._on_ignite(user, pointed_thing) + if not overwrite then + mcl_fire.set_fire(pointed_thing, user, false) + end else - mcl_fire.set_fire(pointed_thing) + mcl_fire.set_fire(pointed_thing, user, false) end if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() @@ -29,6 +42,17 @@ minetest.register_craftitem("mcl_fire:fire_charge", { end return itemstack end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Throw fire charge + local shootpos = vector.add(pos, vector.multiply(dropdir, 0.51)) + local fireball = minetest.add_entity(shootpos, "mobs_mc:blaze_fireball") + local ent = fireball:get_luaentity() + ent._shot_from_dispenser = true + local v = ent.velocity or 1 + fireball:set_velocity(vector.multiply(dropdir, v)) + ent.switch = 1 + stack:take_item() + end, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua index 91e46861..d8833840 100644 --- a/mods/ITEMS/mcl_fire/flint_and_steel.lua +++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua @@ -1,8 +1,11 @@ +local S = minetest.get_translator("mcl_fire") + -- Flint and Steel minetest.register_tool("mcl_fire:flint_and_steel", { - description = "Flint and Steel", - _doc_items_longdesc = "Flint and steel is a tool to start fires, ignite blocks and open portals.", - _doc_items_usagehelp = "Rightclick the surface of a block to attempt to light a fire in front of it. On netherrack it will start an eternal fire. Using it on TNT will ignite it. To open a Nether portal, place an upright frame of obsidian with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the flint and steel on inside of the frame.", + description = S("Flint and Steel"), + _tt_help = S("Starts fires and ignites blocks"), + _doc_items_longdesc = S("Flint and steel is a tool to start fires and ignite blocks."), + _doc_items_usagehelp = S("Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited."), inventory_image = "mcl_fire_flint_and_steel.png", liquids_pointable = false, stack_max = 1, @@ -15,30 +18,57 @@ minetest.register_tool("mcl_fire:flint_and_steel", { return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack end end + -- Check protection + local protname = user:get_player_name() + if minetest.is_protected(pointed_thing.under, protname) then + minetest.record_protection_violation(pointed_thing.under, protname) + return itemstack + end local idef = itemstack:get_definition() minetest.sound_play( "fire_flint_and_steel", - {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8} + {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8}, + true ) local used = false if pointed_thing.type == "node" then local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] if nodedef and nodedef._on_ignite then - nodedef._on_ignite(user, pointed_thing) + local overwrite = nodedef._on_ignite(user, pointed_thing) + if not overwrite then + mcl_fire.set_fire(pointed_thing, user, false) + end else - mcl_fire.set_fire(pointed_thing) + mcl_fire.set_fire(pointed_thing, user, false) end used = true end if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then - minetest.sound_play(idef.sound.breaks, {pos=user:getpos(), gain=0.5}) + minetest.sound_play(idef.sound.breaks, {pos=user:get_pos(), gain=0.5}, true) end if not minetest.settings:get_bool("creative_mode") and used == true then itemstack:add_wear(65535/65) -- 65 uses end return itemstack end, + _dispense_into_walkable = true, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Ignite air + if dropnode.name == "air" then + minetest.add_node(droppos, {name="mcl_fire:fire"}) + if not minetest.settings:get_bool("creative_mode") then + stack:add_wear(65535/65) -- 65 uses + end + -- Ignite TNT + elseif dropnode.name == "mcl_tnt:tnt" then + tnt.ignite(droppos) + if not minetest.settings:get_bool("creative_mode") then + stack:add_wear(65535/65) -- 65 uses + end + end + return stack + end, sound = { breaks = "default_tool_breaks" }, }) diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 45eb4497..9ae8ce99 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -2,6 +2,8 @@ mcl_fire = {} +local S = minetest.get_translator("mcl_fire") +local N = function(s) return s end -- -- Items @@ -9,11 +11,46 @@ mcl_fire = {} -- Flame nodes -local fire_help = "Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire." -local eternal_fire_help = "Eternal fire is a damaging and destructive block. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside." +-- Fire settings + +-- When enabled, fire destroys other blocks. +local fire_enabled = minetest.settings:get_bool("enable_fire", true) + +-- Enable sound +local flame_sound = minetest.settings:get_bool("flame_sound", true) + +-- Help texts +local fire_help, eternal_fire_help +if fire_enabled then + fire_help = S("Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.") +else + fire_help = S("Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.") +end + +if fire_enabled then + eternal_fire_help = S("Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.") +else + eternal_fire_help = S("Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.") +end + +local fire_death_messages = { + N("@1 has been cooked crisp."), + N("@1 felt the burn."), + N("@1 died in the flames."), + N("@1 died in a fire."), +} + +local fire_timer = function(pos) + minetest.get_node_timer(pos):start(math.random(3, 7)) +end + +local spawn_fire = function(pos, age) + minetest.set_node(pos, {name="mcl_fire:fire", param2 = age}) + minetest.check_single_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) +end minetest.register_node("mcl_fire:fire", { - description = "Fire", + description = S("Fire"), _doc_items_longdesc = fire_help, drawtype = "firelike", tiles = { @@ -29,55 +66,118 @@ minetest.register_node("mcl_fire:fire", { }, inventory_image = "fire_basic_flame.png", paramtype = "light", - -- Real light level: 15 (but Minetest caps at 14) - light_source = 14, + light_source = minetest.LIGHT_MAX, walkable = false, buildable_to = true, sunlight_propagates = true, damage_per_second = 1, - groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston=1}, + _mcl_node_death_message = fire_death_messages, + groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston=1, destroys_items=1 }, + floodable = true, + on_flood = function(pos, oldnode, newnode) + if minetest.get_item_group(newnode.name, "water") ~= 0 then + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + end + end, on_timer = function(pos) - local airs = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"air"}) - if #airs == 0 then + local node = minetest.get_node(pos) + -- Age is a number from 0 to 15 and is increased every timer step. + -- "old" fire is more likely to be extinguished + local age = node.param2 + local flammables = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"group:flammable"}) + local below = minetest.get_node({x=pos.x, y=pos.z-1, z=pos.z}) + local below_is_flammable = minetest.get_item_group(below.name, "flammable") > 0 + -- Extinguish fire + if (not fire_enabled) and (math.random(1,3) == 1) then minetest.remove_node(pos) return end - local burned = false - if math.random(1,2) == 1 then - while #airs > 0 do - local r = math.random(1, #airs) - if minetest.find_node_near(airs[r], 1, {"group:flammable"}) then - minetest.set_node(airs[r], {name="mcl_fire:fire"}) - burned = true - break - else - table.remove(airs, r) + if age == 15 and not below_is_flammable then + minetest.remove_node(pos) + return + elseif age > 3 and #flammables == 0 and not below_is_flammable and math.random(1,4) == 1 then + minetest.remove_node(pos) + return + end + local age_add = 1 + -- If fire spread is disabled, we have to skip the "destructive" code + if (not fire_enabled) then + if age + age_add <= 15 then + node.param2 = age + age_add + minetest.set_node(pos, node) + end + -- Restart timer + fire_timer(pos) + return + end + -- Spawn fire to nearby flammable nodes + local is_next_to_flammable = minetest.find_node_near(pos, 2, {"group:flammable"}) ~= nil + if is_next_to_flammable and math.random(1,2) == 1 then + -- The fire we spawn copies the age of this fire. + -- This prevents fire from spreading infinitely far as the fire fire dies off + -- quicker the further it has spreaded. + local age_next = math.min(15, age + math.random(0, 1)) + -- Select random type of fire spread + local burntype = math.random(1,2) + if burntype == 1 then + -- Spawn fire in air + local nodes = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"air"}) + while #nodes > 0 do + local r = math.random(1, #nodes) + if minetest.find_node_near(nodes[r], 1, {"group:flammable"}) then + spawn_fire(nodes[r], age_next) + break + else + table.remove(nodes, r) + end + end + else + -- Burn flammable block + local nodes = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"group:flammable"}) + if #nodes > 0 then + local r = math.random(1, #nodes) + local nn = minetest.get_node(nodes[r]).name + local ndef = minetest.registered_nodes[nn] + local fgroup = minetest.get_item_group(nn, "flammable") + if ndef and ndef._on_burn then + ndef._on_burn(nodes[r]) + elseif fgroup ~= -1 then + spawn_fire(nodes[r], age_next) + end end end end - if not burned then - if math.random(1,3) == 1 then - minetest.remove_node(pos) - return - end + -- Regular age increase + if age + age_add <= 15 then + node.param2 = age + age_add + minetest.set_node(pos, node) end -- Restart timer - minetest.get_node_timer(pos):start(math.random(3, 7)) + fire_timer(pos) end, drop = "", sounds = {}, + -- Turn into eternal fire on special blocks, light Nether portal (if possible), start burning timer on_construct = function(pos) - local under = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name - if under == "mcl_nether:magma" or under == "mcl_nether:netherrack" then + local bpos = {x=pos.x, y=pos.y-1, z=pos.z} + local under = minetest.get_node(bpos).name + + local dim = mcl_worlds.pos_to_dimension(bpos) + if under == "mcl_nether:magma" or under == "mcl_nether:netherrack" or (under == "mcl_core:bedrock" and dim == "end") then minetest.swap_node(pos, {name = "mcl_fire:eternal_fire"}) end - minetest.get_node_timer(pos):start(math.random(3, 7)) + + if minetest.get_modpath("mcl_portals") then + mcl_portals.light_nether_portal(pos) + end + + fire_timer(pos) end, _mcl_blast_resistance = 0, }) minetest.register_node("mcl_fire:eternal_fire", { - description = "Eternal Fire", + description = S("Eternal Fire"), _doc_items_longdesc = eternal_fire_help, drawtype = "firelike", tiles = { @@ -93,75 +193,52 @@ minetest.register_node("mcl_fire:eternal_fire", { }, inventory_image = "fire_basic_flame.png", paramtype = "light", - -- Real light level: 15 (but Minetest caps at 14) - light_source = 14, + light_source = minetest.LIGHT_MAX, walkable = false, buildable_to = true, sunlight_propagates = true, damage_per_second = 1, - groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1}, + _mcl_node_death_message = fire_death_messages, + groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1, destroys_items = 1}, + floodable = true, + on_flood = function(pos, oldnode, newnode) + if minetest.get_item_group(newnode.name, "water") ~= 0 then + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + end + end, on_timer = function(pos) - local airs = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"air"}) - while #airs > 0 do - local r = math.random(1, #airs) - if minetest.find_node_near(airs[r], 1, {"group:flammable"}) then - minetest.set_node(airs[r], {name="mcl_fire:fire"}) - break - else - table.remove(airs, r) + if fire_enabled then + local airs = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"air"}) + while #airs > 0 do + local r = math.random(1, #airs) + if minetest.find_node_near(airs[r], 1, {"group:flammable"}) then + spawn_fire(airs[r], age_next) + break + else + table.remove(airs, r) + end end end -- Restart timer - minetest.get_node_timer(pos):start(math.random(3, 7)) + fire_timer(pos) end, + -- Start burning timer and light Nether portal (if possible) on_construct = function(pos) - minetest.get_node_timer(pos):start(math.random(3, 7)) + fire_timer(pos) + + if minetest.get_modpath("mcl_portals") then + mcl_portals.light_nether_portal(pos) + end end, sounds = {}, drop = "", _mcl_blast_resistance = 0, }) --- Also make lava set fire to air blocks above -minetest.override_item("mcl_core:lava_source", { - on_timer = function(pos) - local function try_ignite(airs) - while #airs > 0 do - local r = math.random(1, #airs) - if minetest.find_node_near(airs[r], 1, {"group:flammable", "group:flammable_lava"}) then - minetest.set_node(airs[r], {name="mcl_fire:fire"}) - return true - else - table.remove(airs, r) - end - end - return false - end - local airs1 = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y+1, z=pos.z-1}, {x=pos.x+1, y=pos.y+1, z=pos.z+1}, {"air"}) - local ok = try_ignite(airs1) - if not ok then - local airs2 = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y+2, z=pos.z-2}, {x=pos.x+2, y=pos.y+2, z=pos.z+2}, {"air"}) - try_ignite(airs2) - end - - -- Restart timer - minetest.get_node_timer(pos):start(math.random(5, 10)) - end, - on_construct = function(pos) - minetest.get_node_timer(pos):start(math.random(5, 10)) - end -}) - -- -- Sound -- -local flame_sound = minetest.settings:get_bool("flame_sound") -if flame_sound == nil then - -- Enable if no setting present - flame_sound = true -end - if flame_sound then local handles = {} @@ -177,7 +254,7 @@ if flame_sound then function mcl_fire.update_player_sound(player) local player_name = player:get_player_name() -- Search for flame nodes in radius around player - local ppos = player:getpos() + 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( @@ -190,7 +267,7 @@ if flame_sound then (num["mcl_fire:eternal_fire"] or 0) -- Stop previous sound if handles[player_name] then - minetest.sound_stop(handles[player_name]) + minetest.sound_fade(handles[player_name], -0.4, 0.0) handles[player_name] = nil end -- If flames @@ -276,7 +353,7 @@ end -- Extinguish all flames quickly with water and such minetest.register_abm({ - label = "Extinguish flame", + label = "Extinguish fire", nodenames = {"mcl_fire:fire", "mcl_fire:eternal_fire"}, neighbors = {"group:puts_out_fire"}, interval = 3, @@ -285,45 +362,47 @@ minetest.register_abm({ action = function(pos, node, active_object_count, active_object_count_wider) minetest.remove_node(pos) minetest.sound_play("fire_extinguish_flame", - {pos = pos, max_hear_distance = 16, gain = 0.15}) + {pos = pos, max_hear_distance = 16, gain = 0.15}, true) end, }) -- Enable the following ABMs according to 'enable fire' setting -local fire_enabled = minetest.settings:get_bool("enable_fire") -if fire_enabled == nil then - -- New setting not specified, check for old setting. - -- If old setting is also not specified, 'not nil' is true. - fire_enabled = not minetest.settings:get_bool("disable_fire") -end - if not fire_enabled then - -- Remove fire only if fire disabled + -- Occasionally remove fire if fire disabled + -- NOTE: Fire is normally extinguished in timer function minetest.register_abm({ label = "Remove disabled fire", nodenames = {"mcl_fire:fire"}, - interval = 7, - chance = 1, + interval = 10, + chance = 10, catch_up = false, action = minetest.remove_node, }) +else -- Fire enabled + -- Set fire to air nodes (inverse pyramid pattern) above lava source minetest.register_abm({ label = "Ignite fire by lava", - nodenames = {"mcl_core:lava_source"}, + nodenames = {"group:lava"}, interval = 7, chance = 2, catch_up = false, action = function(pos) - function try_ignite(airs) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + -- Check if liquid source node + if def and def.liquidtype ~= "source" then + return + end + local function try_ignite(airs) while #airs > 0 do local r = math.random(1, #airs) - if minetest.find_node_near(airs[r], 1, {"group:flammable", "group:flammable_lava"}) then - minetest.set_node(airs[r], {name="mcl_fire:fire"}) + if minetest.find_node_near(airs[r], 1, {"group:flammable"}) then + spawn_fire(airs[r]) return true else table.remove(airs, r) @@ -332,71 +411,39 @@ if not fire_enabled then return false end local airs1 = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y+1, z=pos.z-1}, {x=pos.x+1, y=pos.y+1, z=pos.z+1}, {"air"}) - local ok = try_ignite(airs1) - if not ok then + local h = math.random(1, 2) + if h == 2 and #airs1 > 0 then local airs2 = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y+2, z=pos.z-2}, {x=pos.x+2, y=pos.y+2, z=pos.z+2}, {"air"}) try_ignite(airs2) - end - end, - }) - -else -- Fire enabled - - -- Turn flammable nodes around fire into fire - minetest.register_abm({ - label = "Remove flammable nodes", - nodenames = {"group:fire"}, - neighbors = {"group:flammable"}, - interval = 5, - chance = 18, - catch_up = false, - action = function(pos, node, active_object_count, active_object_count_wider) - local p = minetest.find_node_near(pos, 1, {"group:flammable"}) - if p then - 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.set_node(p, {name="mcl_fire:fire"}) - minetest.check_for_falling(p) - end + else + try_ignite(airs1) end end, }) end --- Spawn eternal fire when using flint and steel on netherrack or magma block - -local eternal_override = { - after_destruct = function(pos, oldnode) - pos.y = pos.y + 1 - if minetest.get_node(pos).name == "mcl_fire:eternal_fire" then - minetest.remove_node(pos) - end - end, - _on_ignite = function(player, pointed_thing) - local pos = pointed_thing.under - local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} - local fn = minetest.get_node(flame_pos) - if fn.name == "air" and not minetest.is_protected(flame_pos, "fire") and pointed_thing.under.y < pointed_thing.above.y then - minetest.set_node(flame_pos, {name = "mcl_fire:eternal_fire"}) - else - mcl_fire.set_fire(pointed_thing) - end - end, -} - -if minetest.get_modpath("mcl_nether") then - minetest.override_item("mcl_nether:netherrack", eternal_override) - minetest.override_item("mcl_nether:magma", eternal_override) -end - --- Set pointed_thing on (normal) fire -mcl_fire.set_fire = function(pointed_thing) +-- Set pointed_thing on (normal) fire. +-- * pointed_thing: Pointed thing to ignite +-- * player: Player who sets fire or nil if nobody +-- * allow_on_fire: If false, can't ignite fire on fire (default: true) +mcl_fire.set_fire = function(pointed_thing, player, allow_on_fire) + local pname + if player == nil then + pname = "" + else + pname = player:get_player_name() + end local n = minetest.get_node(pointed_thing.above) - if n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then + local nu = minetest.get_node(pointed_thing.under) + if allow_on_fire == false and minetest.get_item_group(nu.name, "fire") ~= 0 then + return + end + if minetest.is_protected(pointed_thing.above, pname) then + minetest.record_protection_violation(pointed_thing.above, pname) + return + end + if n.name == "air" then minetest.add_node(pointed_thing.above, {name="mcl_fire:fire"}) end end diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr new file mode 100644 index 00000000..e3c30880 --- /dev/null +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_fire +Fire Charge=Feuerkugel +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Feuerkugeln sind hauptsächlich Projektile, die von Werfern geworfen werden können, sie werden in einer geraden Linie fliegen und gehen beim Einschlag in Flammen auf. Alternativ können sie benutzt werden, um direkt ein Feuer zu entfachen. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Legen Sie die Feuerkugel in den Werfer und versorgen Sie ihn mit Redstone-Energie, um sie abzufeuern. Um ein Feuer zu entfachen, platzieren Sie die Feuerkugel auf den Boden, was die Kugel verbraucht. +Flint and Steel=Feuerzeug +Flint and steel is a tool to start fires and ignite blocks.=Ein Feuerzeug ist ein Werkzeug, um Feuer zu entfachen und Blöcke anzuzünden. +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Rechtsklicken Sie auf die Oberfläche eines Blocks, um zu versuchen, ein Feuer auf ihm zu entfachen, oder den Block selbst anzuzünden. Ein paar Blocke reagieren besonders, wenn sie angezündet werden. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Feuer ist ein schädlicher und destruktiver aber kurzlebiger Block. Es wird sich zu entzündlichen Blöcken ausbreiten und sie zerstören, aber Feuer wird verschwinden, wenn es nichts brennbares mehr gibt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Feuer ist ein schädlicher aber nicht-destruktiver kurzlebiger Block. Es wird verschwinden, wenn sich keine entzündlichen Blöcke in der Nähe befinden. Feuer breitet sich nicht aus und zerstört keine Blöcke, zumindest nicht in dieser Welt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Ewiges Feuer ist ein schädlicher Block, der mehr Feuer machen kann. Er wird um sich Feuer machen, wenn entflammbare Blöcke in der Nähe sind. Ewiges Feuer kann von Schlägen und Wasserblöcken in der Nähe gelöscht werden. Anders als (normales) Feuer geht ein ewiges Feuer nicht von alleine aus, auch nicht unter Regen. Es ist sicher, ein ewiges Feuer zu schlagen, aber es tut weh, wenn man direkt in einem steht. +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Ewiges Feuer ist ein schädlicher Block. Ewiges Feuer kann von Schlägen und Wasserblöcken in der Nähe gelöscht werden. Anders als (normales) Feuer geht ein ewiges Feuer nicht von alleine aus, auch nicht unter Regen. Es ist sicher, ein ewiges Feuer zu schlagen, aber es tut weh, wenn man direkt in einem steht. +@1 has been cooked crisp.=@1 wurde knusprig gebraten. +@1 felt the burn.=@1 ist völlig verbrannt. +@1 died in the flames.=@1 starb in den Flammen. +@1 died in a fire.=@1 starb in einem Feuer. +Fire=Feuer +Eternal Fire=Ewiges Feuer +Dispenser projectile=Werferprojektil +Starts fires and ignites blocks=Entfacht Feuer und zündet Blöcke an diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr new file mode 100644 index 00000000..6f36b293 --- /dev/null +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_fire +Fire Charge=Carga de fuego +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Las cargas de fuego son principalmente proyectiles que se pueden lanzar desde dispensadores, volarán en línea recta y estallarán en un incendio al impactar. Alternativamente, se pueden usar para encender incendios directamente. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Ponga la carga de fuego en un dispensador y suminístrele poder de redstone para lanzarlo. Para encender un fuego directamente, simplemente coloque la carga de fuego en el suelo, que la usa. +Flint and Steel=Mechero +Flint and steel is a tool to start fires and ignite blocks.=El mechero es una herramienta para iniciar incendios y encender bloques. +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Haga clic derecho en la superficie de un bloque para intentar encender un fuego frente a él o encender el bloque. Unos pocos bloques tienen una reacción única cuando se encienden. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino y destructivo pero de corta duración. Destruirá y se extenderá hacia bloques casi inflamables, pero el fuego desaparecerá cuando no quede nada para quemar. Se extinguirá por el agua y la lluvia cercanas. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de la base o un bloque de magma, se convertirá inmediatamente en un fuego eterno. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino pero no destructivo de corta duración. Desaparecerá cuando no haya un bloque inflamable alrededor. El fuego no destruye bloques, al menos no en este mundo. Se extinguirá por el agua y la lluvia cercanas. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de la base o un bloque de magma, se convertirá inmediatamente en un fuego eterno. +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=El fuego eterno es un bloque dañino que podría crear más fuego. Creará fuego alrededor cuando haya bloques inflamables cerca. El fuego eterno se puede extinguir con golpes y bloques de agua cercanos. Aparte del fuego (normal), el fuego eterno no se extingue por sí solo y también continúa ardiendo bajo la lluvia. Golpear el fuego eterno es seguro, pero duele si te paras dentro. +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=El fuego eterno es un bloque dañino. El fuego eterno se puede extinguir con golpes y bloques de agua cercanos. Aparte del fuego (normal), el fuego eterno no se extingue por sí solo y también continúa ardiendo bajo la lluvia. Golpear el fuego eterno es seguro, pero duele si te paras dentro. +@1 has been cooked crisp.=@1 se ha cocinado crujientemente. +@1 felt the burn.=@1 sintió la quemadura. +@1 died in the flames.=@1 murió en las llamas. +@1 died in a fire.=@ 1 murió en un incendio. +Fire=Fuego +Eternal Fire=Fuego eterno diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr new file mode 100644 index 00000000..60b6ffd0 --- /dev/null +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_fire +Fire Charge=Boule de Feu +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Les boules de feu sont principalement des projectiles qui peuvent être lancés à partir de distributeurs, ils voleront en ligne droite et éclateront en feu à l'impact. Alternativement, ils peuvent être utilisés pour allumer des incendies directement. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Mettez la boule de feu dans un distributeur et alimentez-la en redstone pour la lancer. Pour allumer un feu directement, placez simplement la charge de feu sur le sol, et utiliser le. +Flint and Steel=Briquet +Flint and steel is a tool to start fires and ignite blocks.=Le Briquet est uo outil pour allumer un feu ou allumer des blocs. +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Cliquez avec le bouton droit sur la surface d'un bloc pour tenter d'allumer un feu devant lui ou d'allumer le bloc. Quelques blocs ont une réaction unique lorsqu'ils sont enflammés. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Le feu est un type de bloc dommageable et destructeur mais de courte durée. Il se détruira et se propagera vers des blocs proches de produits inflammables, mais le feu disparaîtra lorsqu'il n'y aura plus rien à brûler. Il sera éteint par l'eau et la pluie à proximité. Le feu peut être détruit en toute sécurité en le frappant, mais il est blessant si vous vous tenez directement dedans. Si un feu est déclenché au-dessus d'un netherrack ou d'un bloc de magma, il se transformera immédiatement en un feu éternel. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Le feu est un type de bloc éphémère mais non destructif de courte durée. Il disparaîtra en l'absence de bloc inflammable. Le feu ne détruit pas les blocs, du moins pas dans ce monde. Il sera éteint par l'eau et la pluie à proximité. Le feu peut être détruit en toute sécurité en le frappant, mais il est blessant si vous vous tenez directement dedans. Si un feu est déclenché au-dessus d'un netherrack ou d'un bloc de magma, il se transformera immédiatement en un feu éternel. +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Le feu éternel est un bloc endommageant qui pourrait créer plus de feu. Il créera du feu autour de lui lorsque des blocs inflammables sont à proximité. Le feu éternel peut être éteint par des coups de poing et des blocs d'eau à proximité. À part le feu (normal), le feu éternel ne s'éteint pas tout seul et continue de brûler sous la pluie. Frapper le feu éternel est sûr, mais ça fait mal si vous vous tenez à l'intérieur. +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Le feu éternel est un bloc dommageable. Le feu éternel peut être éteint par des coups de poing et des blocs d'eau à proximité. À part le feu (normal), le feu éternel ne s'éteint pas tout seul et continue de brûler sous la pluie. Frapper le feu éternel est sûr, mais ça fait mal si vous vous tenez à l'intérieur. +@1 has been cooked crisp.=@1 a été cuit croustillant. +@1 felt the burn.=@1 sent le brûler. +@1 died in the flames.=@1 est mort dans les flammes. +@1 died in a fire.=@1 est mort dans un incendie. +Fire=Feu +Eternal Fire=Feu Eternel +Dispenser projectile=Distributeur de Projectile +Starts fires and ignites blocks=Démarre les incendies et allume les blocs diff --git a/mods/ITEMS/mcl_fire/locale/template.txt b/mods/ITEMS/mcl_fire/locale/template.txt new file mode 100644 index 00000000..0bc7d254 --- /dev/null +++ b/mods/ITEMS/mcl_fire/locale/template.txt @@ -0,0 +1,19 @@ +# textdomain: mcl_fire +Fire Charge= +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.= +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.= +Flint and Steel= +Flint and steel is a tool to start fires and ignite blocks.= +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.= +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.= +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.= +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.= +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.= +@1 has been cooked crisp.= +@1 felt the burn.= +@1 died in the flames.= +@1 died in a fire.= +Fire= +Eternal Fire= +Dispenser projectile= +Starts fires and ignites blocks= diff --git a/mods/ITEMS/mcl_fire/textures/fire_basic_flame.png b/mods/ITEMS/mcl_fire/textures/fire_basic_flame.png index 5ed32ec0..f87969a3 100644 Binary files a/mods/ITEMS/mcl_fire/textures/fire_basic_flame.png and b/mods/ITEMS/mcl_fire/textures/fire_basic_flame.png differ diff --git a/mods/ITEMS/mcl_fishing/depends.txt b/mods/ITEMS/mcl_fishing/depends.txt index f910e230..93ef0bf5 100644 --- a/mods/ITEMS/mcl_fishing/depends.txt +++ b/mods/ITEMS/mcl_fishing/depends.txt @@ -1,3 +1,4 @@ mcl_core mcl_sounds mcl_loot +mcl_mobs diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 09c56c15..53eefdad 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -1,96 +1,323 @@ -local go_fishing = function(itemstack, user, pointed_thing) - if pointed_thing and pointed_thing.under then - -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(pointed_thing.under) - 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 +--Fishing Rod, Bobber, and Flying Bobber mechanics and Bobber artwork by Rootyjr. - if string.find(node.name, "mcl_core:water") then - local itemname - local itemcount = 1 - local itemwear = 0 - -- FIXME: Maybe use a better seeding - local pr = PseudoRandom(os.time() * math.random(1, 100)) - local r = pr:next(1, 100) - if r <= 85 then - -- Fish - items = mcl_loot.get_loot({ - items = { - { itemstring = "mcl_fishing:fish_raw", weight = 60 }, - { itemstring = "mcl_fishing:salmon_raw", weight = 25 }, - { itemstring = "mcl_fishing:clownfish_raw", weight = 2 }, - { itemstring = "mcl_fishing:pufferfish_raw", weight = 13 }, - } - }, pr) - elseif r <= 95 then - -- Junk - items = mcl_loot.get_loot({ - items = { - { itemstring = "mcl_core:bowl", weight = 10 }, - { itemstring = "mcl_fishing:fishing_rod", weight = 2, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage - { itemstring = "mcl_mobitems:leather", weight = 10 }, - { itemstring = "3d_armor:boots_leather", weight = 10, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage - { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, - { itemstring = "mcl_core:stick", weight = 5 }, - { itemstring = "mcl_mobitems:string", weight = 5 }, - { itemstring = "mcl_potions:potion_water", weight = 10 }, - { itemstring = "mcl_mobitems:bone", weight = 10 }, - { itemstring = "mcl_dye:black", weight = 1, amount_min = 10, amount_max = 10 }, - { itemstring = "mcl_mobitems:string", weight = 10 }, -- TODO: Tripwire Hook - } - }, pr) - else - -- Treasure - items = mcl_loot.get_loot({ - items = { - -- TODO: Enchanted Bow - { itemstring = "mcl_throwing:bow", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage - -- TODO: Enchanted Book - { itemstring = "mcl_books:book" }, - -- TODO: Enchanted Fishing Rod - { itemstring = "mcl_fishing:fishing_rod", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage - { itemstring = "mobs:nametag", }, - { itemstring = "mcl_mobitems:saddle", }, - { itemstring = "mcl_flowers:waterlily", }, - } - }, pr) - end - local item - if #items >= 1 then - item = ItemStack(items[1]) - else - item = ItemStack() - end - local inv = user:get_inventory() - if inv:room_for_item("main", item) then - inv:add_item("main", item) - end - if not minetest.settings:get_bool("creative_mode") then - local idef = itemstack:get_definition() - itemstack:add_wear(65535/65) -- 65 uses - if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then - minetest.sound_play(idef.sound.breaks, {pos=pointed_thing.above, gain=0.5}) +local S = minetest.get_translator("mcl_fishing") +local mod_throwing = minetest.get_modpath("mcl_throwing") + +local entity_mapping = { + ["mcl_fishing:bobber"] = "mcl_fishing:bobber_entity", +} + +local bobber_ENTITY={ + physical = false, + timer=0, + textures = {"mcl_fishing_bobber.png"}, + visual_size = {x=0.5, y=0.5}, + collisionbox = {0.45,0.45,0.45,0.45,0.45,0.45}, + pointable = false, + static_save = false, + + _lastpos={}, + _dive = false, + _waittick = nil, + _tick = 0, + player=nil, + _oldy = nil, + objtype="fishing", +} + +local fish = function(itemstack, player) + local pos = player:get_pos() + + local objs = minetest.get_objects_inside_radius(pos, 125) + local num = 0 + local ent = nil + local noent = true + + --Check for bobber if so handle. + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent.player and ent.objtype=="fishing" then + if (player:get_player_name() == ent.player) then + noent = false + if ent._dive == true then + local itemname + local items + local itemcount = 1 + local itemwear = 0 + -- FIXME: Maybe use a better seeding + local pr = PseudoRandom(os.time() * math.random(1, 100)) + local r = pr:next(1, 100) + if r <= 85 then + -- Fish + items = mcl_loot.get_loot({ + items = { + { itemstring = "mcl_fishing:fish_raw", weight = 60 }, + { itemstring = "mcl_fishing:salmon_raw", weight = 25 }, + { itemstring = "mcl_fishing:clownfish_raw", weight = 2 }, + { itemstring = "mcl_fishing:pufferfish_raw", weight = 13 }, + } + }, pr) + elseif r <= 95 then + -- Junk + items = mcl_loot.get_loot({ + items = { + { itemstring = "mcl_core:bowl", weight = 10 }, + { itemstring = "mcl_fishing:fishing_rod", weight = 2, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage + { itemstring = "mcl_mobitems:leather", weight = 10 }, + { itemstring = "mcl_armor:boots_leather", weight = 10, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, + { itemstring = "mcl_core:stick", weight = 5 }, + { itemstring = "mcl_mobitems:string", weight = 5 }, + { itemstring = "mcl_potions:potion_water", weight = 10 }, + { itemstring = "mcl_mobitems:bone", weight = 10 }, + { itemstring = "mcl_dye:black", weight = 1, amount_min = 10, amount_max = 10 }, + { itemstring = "mcl_mobitems:string", weight = 10 }, -- TODO: Tripwire Hook + } + }, pr) + else + -- Treasure + items = mcl_loot.get_loot({ + items = { + -- TODO: Enchanted Bow + { itemstring = "mcl_bows:bow", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage + -- TODO: Enchanted Book + { itemstring = "mcl_books:book" }, + -- TODO: Enchanted Fishing Rod + { itemstring = "mcl_fishing:fishing_rod", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage + { itemstring = "mcl_mobs:nametag", }, + { itemstring = "mcl_mobitems:saddle", }, + { itemstring = "mcl_flowers:waterlily", }, + } + }, pr) + end + local item + if #items >= 1 then + item = ItemStack(items[1]) + else + item = ItemStack() + end + local inv = player:get_inventory() + if inv:room_for_item("main", item) then + inv:add_item("main", item) + end + if not minetest.settings:get_bool("creative_mode") then + local idef = itemstack:get_definition() + itemstack:add_wear(65535/65) -- 65 uses + if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then + minetest.sound_play(idef.sound.breaks, {pos=player:get_pos(), gain=0.5}, true) + end + end + end + --Check if object is on land. + local epos = ent.object:get_pos() + epos.y = math.floor(epos.y) + local node = minetest.get_node(epos) + local def = minetest.registered_nodes[node.name] + if def.walkable then + if not minetest.settings:get_bool("creative_mode") then + local idef = itemstack:get_definition() + itemstack:add_wear((65535/65)*2) -- if so and not creative then wear double like in MC. + if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then + minetest.sound_play(idef.sound.breaks, {pos=player:get_pos(), gain=0.5}, true) + end + end + end + --Destroy bobber. + ent.object:remove() + return itemstack + end end end - return itemstack + end + --Check for flying bobber. + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent._thrower and ent.objtype=="fishing" then + if player:get_player_name() == ent._thrower then + noent = false + break + end + end + end + end + --If no bobber or flying_bobber exists then throw bobber. + if noent == true then + local playerpos = player:get_pos() + local dir = player:get_look_dir() + local obj = mcl_throwing.throw("mcl_throwing:flying_bobber", {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, 15, player:get_player_name()) + end +end + +-- Movement function of bobber +local bobber_on_step = function(self, dtime) + self.timer=self.timer+dtime + local epos = self.object:get_pos() + epos.y = math.floor(epos.y) + local node = minetest.get_node(epos) + local def = minetest.registered_nodes[node.name] + + --If we have no player, remove self. + if self.player == nil or self.player == "" then + self.object:remove() + return + end + local player = minetest.get_player_by_name(self.player) + if not player then + self.object:remove() + return + end + + --Check if player is nearby + if self._tick % 5 == 0 and self.player ~= nil and player ~= nil then + --Destroy bobber if item not wielded. + local wield = player:get_wielded_item() + if ((not wield) or (wield:get_name() ~= "mcl_fishing:fishing_rod")) then + self.object:remove() + return + end + + --Destroy bobber if player is too far away. + local objpos = self.object:get_pos() + local playerpos = player:get_pos() + if (((playerpos.y - objpos.y) >= 33) or ((playerpos.y - objpos.y) <= -33)) then + self.object:remove() + return + elseif (((playerpos.x - objpos.x) >= 33) or ((playerpos.x - objpos.x) <= -33)) then + self.object:remove() + return + elseif (((playerpos.z - objpos.z) >= 33) or ((playerpos.z - objpos.z) <= -33)) then + self.object:remove() + return + elseif ((((playerpos.z + playerpos.x) - (objpos.z + objpos.x)) >= 33) or ((playerpos.z + playerpos.x) - (objpos.z + objpos.x)) <= -33) then + self.object:remove() + return + elseif ((((playerpos.y + playerpos.x) - (objpos.y + objpos.x)) >= 33) or ((playerpos.y + playerpos.x) - (objpos.y + objpos.x)) <= -33) then + self.object:remove() + return + elseif ((((playerpos.z + playerpos.y) - (objpos.z + objpos.y)) >= 33) or ((playerpos.z + playerpos.y) - (objpos.z + objpos.y)) <= -33) then + self.object:remove() + return + end + + end + -- If in water, then bob. + if def.liquidtype == "source" and minetest.get_item_group(def.name, "water") ~= 0 then + if self._oldy == nil then + self.object:set_pos({x=self.object:get_pos().x,y=math.floor(self.object:get_pos().y)+.5,z=self.object:get_pos().z}) + self._oldy = self.object:get_pos().y + end + -- reset to original position after dive. + if self.object:get_pos().y > self._oldy then + self.object:set_pos({x=self.object:get_pos().x,y=self._oldy,z=self.object:get_pos().z}) + self.object:set_velocity({x=0,y=0,z=0}) + self.object:set_acceleration({x=0,y=0,z=0}) + end + if self._dive then + for i=1,2 do + -- Spray bubbles when there's a fish. + minetest.add_particle({ + pos = {x=epos["x"]+math.random(-1,1)*math.random()/2,y=epos["y"]+0.1,z=epos["z"]+math.random(-1,1)*math.random()/2}, + velocity = {x=0, y=4, z=0}, + acceleration = {x=0, y=-5, z=0}, + expirationtime = math.random(), + size = math.random()+0.5, + collisiondetection = true, + vertical = false, + texture = "mcl_particles_bubble.png", + }) + end + if self._tick ~= self._waittick then + self._tick = self._tick + 1 + else + self._waittick = nil + self._tick = 0 + self._dive = false + end + else if self._waittick == nil then + -- wait for random number of ticks. + self._waittick = math.random(50,800) + else + if self._tick ~= self._waittick then + self._tick = self._tick + 1 + else + --wait time is over time to dive. + self._dive = true + self.object:set_velocity({x=0,y=-2,z=0}) + self.object:set_acceleration({x=0,y=5,z=0}) + self._waittick = 30 + self._tick = 0 + end end end - return nil +end + + -- TODO: Destroy when hitting a solid node + --if self._lastpos.x~=nil then + -- if (def and def.walkable) or not def then + --self.object:remove() + -- return + -- end + --end + --self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node end +bobber_ENTITY.on_step = bobber_on_step + +minetest.register_entity("mcl_fishing:bobber_entity", bobber_ENTITY) + +-- If player leaves area, remove bobber. +minetest.register_on_leaveplayer(function(player) + local objs = minetest.get_objects_inside_radius(player:get_pos(), 250) + local num = 0 + local ent = nil + local noent = true + + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent.player and ent.objtype=="fishing" then + ent.object:remove() + elseif ent._thrower and ent.objtype=="fishing" then + ent.object:remove() + end + end + end +end) + +-- If player dies, remove bobber. +minetest.register_on_dieplayer(function(player) + local objs = minetest.get_objects_inside_radius(player:get_pos(), 250) + local num = 0 + local ent = nil + local noent = true + + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent.player and ent.objtype=="fishing" then + ent.object:remove() + elseif ent._thrower and ent.objtype=="fishing" then + ent.object:remove() + end + end + end +end) + -- Fishing Rod minetest.register_tool("mcl_fishing:fishing_rod", { - description = "Fishing Rod", - _doc_items_longdesc = "Fishing rods can be used to catch fish.", - _doc_items_usagehelp = "Rightclick a water source to try to go fishing. Who knows what you're going to catch?", + description = S("Fishing Rod"), + _tt_help = S("Catches fish in water"), + _doc_items_longdesc = S("Fishing rods can be used to catch fish."), + _doc_items_usagehelp = S("Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?"), groups = { tool=1 }, inventory_image = "mcl_fishing_fishing_rod.png", + wield_image = "mcl_fishing_fishing_rod.png^[transformR270", + wield_scale = { x = 1.5, y = 1.5, z = 1 }, stack_max = 1, - liquids_pointable = true, - on_place = go_fishing, + on_place = fish, + on_secondary_use = fish, sound = { breaks = "default_tool_breaks" }, }) @@ -110,7 +337,6 @@ minetest.register_craft({ {'mcl_mobitems:string','','mcl_core:stick'}, } }) - minetest.register_craft({ type = "fuel", recipe = "mcl_fishing:fishing_rod", @@ -120,8 +346,8 @@ minetest.register_craft({ -- Fish minetest.register_craftitem("mcl_fishing:fish_raw", { - description = "Raw Fish", - _doc_items_longdesc = "Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.", + description = S("Raw Fish"), + _doc_items_longdesc = S("Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value."), inventory_image = "mcl_fishing_fish_raw.png", on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), @@ -131,8 +357,8 @@ minetest.register_craftitem("mcl_fishing:fish_raw", { }) minetest.register_craftitem("mcl_fishing:fish_cooked", { - description = "Cooked Fish", - _doc_items_longdesc = "Mmh, fish! This is a healthy food item.", + description = S("Cooked Fish"), + _doc_items_longdesc = S("Mmh, fish! This is a healthy food item."), inventory_image = "mcl_fishing_fish_cooked.png", on_place = minetest.item_eat(5), on_secondary_use = minetest.item_eat(5), @@ -150,8 +376,8 @@ minetest.register_craft({ -- Salmon minetest.register_craftitem("mcl_fishing:salmon_raw", { - description = "Raw Salmon", - _doc_items_longdesc = "Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.", + description = S("Raw Salmon"), + _doc_items_longdesc = S("Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value."), inventory_image = "mcl_fishing_salmon_raw.png", on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), @@ -161,8 +387,8 @@ minetest.register_craftitem("mcl_fishing:salmon_raw", { }) minetest.register_craftitem("mcl_fishing:salmon_cooked", { - description = "Cooked Salmon", - _doc_items_longdesc = "This is a healthy food item which can be eaten.", + description = S("Cooked Salmon"), + _doc_items_longdesc = S("This is a healthy food item which can be eaten."), inventory_image = "mcl_fishing_salmon_cooked.png", on_place = minetest.item_eat(6), on_secondary_use = minetest.item_eat(6), @@ -180,8 +406,8 @@ minetest.register_craft({ -- Clownfish minetest.register_craftitem("mcl_fishing:clownfish_raw", { - description = "Clownfish", - _doc_items_longdesc = "Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.", + description = S("Clownfish"), + _doc_items_longdesc = S("Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely."), inventory_image = "mcl_fishing_clownfish_raw.png", on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), @@ -193,8 +419,9 @@ minetest.register_craftitem("mcl_fishing:clownfish_raw", { -- Pufferfish -- TODO: Add real status effect minetest.register_craftitem("mcl_fishing:pufferfish_raw", { - description = "Pufferfish", - _doc_items_longdesc = "Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).", + description = S("Pufferfish"), + _tt_help = minetest.colorize("#FFFF00", S("Very poisonous")), + _doc_items_longdesc = S("Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger)."), inventory_image = "mcl_fishing_pufferfish_raw.png", on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr new file mode 100644 index 00000000..10f90859 --- /dev/null +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr @@ -0,0 +1,18 @@ +# textdomain: mcl_fishing +Fishing Rod=Angel +Fishing rods can be used to catch fish.=Mit Angeln fängt man Fische. +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Rechtsklicken, um den Schwimmer auszuwerfen. Wenn er sinkt, erneut rechtsklicken, um etwas zu fangen. Wer weiß, was Sie fangen werden? +Raw Fish=Roher Fisch +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Rohen Fisch kann man mit Angeln fangen. Er ist ein Lebensmittel, den man sicher verzehren kann. Er kann gekocht werden, um seinen Nährwert zu erhöhen. +Cooked Fish=Gekochter Fisch +Mmh, fish! This is a healthy food item.=Mhh, Fisch! Ein gesundes Lebensmittel. +Raw Salmon=Roher Lachs +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Lohen Lachs erhält man beim Angeln. Er ist ein Lebensmittel, der sicher verzehrt werden kann. +Cooked Salmon=Gekochter Lachs +This is a healthy food item which can be eaten.=Ein gesundes essbares Lebensmittel. +Clownfish=Clownfisch +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=Einen Clownfisch kann man beim Angeln mit etwas Glück fangen. Er ist ein Lebensmittel, der sicher verzehrt werden kann. +Pufferfish=Kugelfisch +Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=Kugelfische sind eine verbreitete Fischart, die geangelt werden können. Sie können theoretisch gegessen werden, aber sie sind sehr schlecht für Menschen. Es gibt nur 1 Hungerpunkt und es wird Sie schwer vergiften (was Ihre Gesundheit verringert, aber nicht bis zum Tod) und Ihr Hungerpegel wird aufgrund der schweren Lebensmittelvergiftung stark ansteigen. +Catches fish in water=Fängt Fische im Wasser +Very poisonous=Sehr giftig diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.es.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.es.tr new file mode 100644 index 00000000..27972dce --- /dev/null +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.es.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_fishing +Fishing Rod=Caña de pescar +Fishing rods can be used to catch fish.=Las cañas de pescar se pueden utilizar para pescar. +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Haga clic derecho para iniciar el bobber. Cuando se hunda, haga clic derecho nuevamente para enrollar un elemento. ¿Quién sabe lo que vas a atrapar? +Raw Fish=Bacalao crudo +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=El bacalao crudo se obtiene pescando y es un alimento que se puede comer de forma segura. Cocinarlo mejora su valor nutricional. +Cooked Fish=Bacalao cocinado +Mmh, fish! This is a healthy food item.=Mmh, ¡pez! Este es un alimento saludable. +Raw Salmon=Salmón crudo +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=El salmón crudo se obtiene pescando y es un alimento que se puede comer de manera segura. Cocinarlo mejora su valor nutricional. +Cooked Salmon=Salmón cocinado +This is a healthy food item which can be eaten.=Este es un alimento saludable que se puede comer. +Clownfish=Pez tropical +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=El pez tropical se puede obtener pescando (y por suerte) y es un alimento que se puede comer de forma segura. +Pufferfish=Pez globo +Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=El pez globo es una especie común de pescado y se puede obtener mediante la pesca. Técnicamente se pueden comer, pero son muy malos para los humanos. Comer un pez globo solo restaura 1 punto de hambre y te envenena mucho (lo que drena tu salud de manera no fatal) y causa una intoxicación alimentaria grave (lo que aumenta tu hambre). diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.fr.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.fr.tr new file mode 100644 index 00000000..2bac42bb --- /dev/null +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.fr.tr @@ -0,0 +1,18 @@ +# textdomain: mcl_fishing +Fishing Rod=Canne à pêche +Fishing rods can be used to catch fish.=Les cannes à pêche peuvent être utilisées pour attraper du poisson. +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Clic droit pour lancer le bouchon. Lorsqu'il s'enfonce, cliquez de nouveau avec le bouton droit pour rembobiner. Qui sait ce que tu vas attraper? +Raw Fish=Poisson Cru +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Le poisson cru est obtenu par la pêche et est un aliment qui peut être mangé en toute sécurité. La cuisson améliore sa valeur nutritive. +Cooked Fish=Poisson cuit +Mmh, fish! This is a healthy food item.=Mmh, poisson! Il s'agit d'un aliment sain. +Raw Salmon=Saumon cru +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Le saumon cru est obtenu par la pêche et est un aliment qui peut être consommé en toute sécurité. La cuisson améliore sa valeur nutritive. +Cooked Salmon=Saumon cuit +This is a healthy food item which can be eaten.=Il s'agit d'un aliment sain qui peut être consommé. +Clownfish=Poisson-Clown +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=Le poisson-clown peut être obtenu par la pêche (et la chance) et est un aliment qui peut être mangé en toute sécurité. +Pufferfish=Poisson-Globe +Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=Le poisson-globe est une espèce de poisson commune et peut être obtenu par la pêche. Ils peuvent techniquement être mangés, mais ils sont très mauvais pour les humains. Manger un poisson-globe ne restaure que 1 point de faim et vous empoisonnera fortement (ce qui draine votre santé de manière non fatale) et provoque une grave intoxication alimentaire (qui augmente votre faim). +Catches fish in water=Attrape les poissons dans l'eau +Very poisonous=Très toxique diff --git a/mods/ITEMS/mcl_fishing/locale/template.txt b/mods/ITEMS/mcl_fishing/locale/template.txt new file mode 100644 index 00000000..a1544666 --- /dev/null +++ b/mods/ITEMS/mcl_fishing/locale/template.txt @@ -0,0 +1,18 @@ +# textdomain: mcl_fishing +Fishing Rod= +Fishing rods can be used to catch fish.= +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?= +Raw Fish= +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.= +Cooked Fish= +Mmh, fish! This is a healthy food item.= +Raw Salmon= +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.= +Cooked Salmon= +This is a healthy food item which can be eaten.= +Clownfish= +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.= +Pufferfish= +Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).= +Catches fish in water= +Very poisonous= diff --git a/mods/ITEMS/mcl_fishing/textures/mcl_fishing_bobber.png b/mods/ITEMS/mcl_fishing/textures/mcl_fishing_bobber.png new file mode 100644 index 00000000..6086ecad Binary files /dev/null and b/mods/ITEMS/mcl_fishing/textures/mcl_fishing_bobber.png differ diff --git a/mods/ITEMS/mcl_fishing/textures/mcl_fishing_fishing_rod.png b/mods/ITEMS/mcl_fishing/textures/mcl_fishing_fishing_rod.png index f8b4f871..580e974a 100644 Binary files a/mods/ITEMS/mcl_fishing/textures/mcl_fishing_fishing_rod.png and b/mods/ITEMS/mcl_fishing/textures/mcl_fishing_fishing_rod.png differ diff --git a/mods/ITEMS/mcl_flowerpots/init.lua b/mods/ITEMS/mcl_flowerpots/init.lua index bddbcbe3..d2c634bd 100644 --- a/mods/ITEMS/mcl_flowerpots/init.lua +++ b/mods/ITEMS/mcl_flowerpots/init.lua @@ -1,3 +1,202 @@ -local path = minetest.get_modpath("mcl_flowerpots") +local S = minetest.get_translator("mcl_flowerpots") -dofile(path.."/nodes.lua") +local flowers = { + {"dandelion", "mcl_flowers:dandelion", S("Dandelion Flower Pot")}, + {"poppy", "mcl_flowers:poppy", S("Poppy Flower Pot")}, + {"blue_orchid", "mcl_flowers:blue_orchid", S("Blue Orchid Flower Pot")}, + {"allium", "mcl_flowers:allium", S("Allium Flower Pot")}, + {"azure_bluet", "mcl_flowers:azure_bluet", S("Azure Bluet Flower Pot")}, + {"tulip_red", "mcl_flowers:tulip_red", S("Red Tulip Flower Pot")}, + {"tulip_pink", "mcl_flowers:tulip_pink", S("Pink Tulip Flower Pot")}, + {"tulip_white", "mcl_flowers:tulip_white", S("White Tulip Flower Pot")}, + {"tulip_orange", "mcl_flowers:tulip_orange", S("Orange Tulip Flower Pot")}, + {"oxeye_daisy", "mcl_flowers:oxeye_daisy", S("Oxeye Daisy Flower Pot")}, + {"mushroom_brown", "mcl_mushrooms:mushroom_brown", S("Brown Mushroom Flower Pot")}, + {"mushroom_red", "mcl_mushrooms:mushroom_red", S("Red Mushroom Flower Pot")}, + {"sapling", "mcl_core:sapling", S("Oak Sapling Flower Pot")}, + {"acaciasapling", "mcl_core:acaciasapling", S("Acacia Sapling Flower Pot")}, + {"junglesapling", "mcl_core:junglesapling", S("Jungle Sapling Flower Pot")}, + {"darksapling", "mcl_core:darksapling", S("Dark Oak Sapling Flower Pot")}, + {"sprucesapling", "mcl_core:sprucesapling", S("Spruce Sapling Flower Pot")}, + {"birchsapling", "mcl_core:birchsapling", S("Birch Sapling Flower Pot")}, + {"deadbush", "mcl_core:deadbush", S("Dead Bush Flower Pot")}, + {"fern", "mcl_flowers:fern", S("Fern Flower Pot"), {"mcl_flowers_fern_inv.png"}}, +} + +local cubes = { + {"cactus", "mcl_core:cactus", S("Cactus Flower Pot")}, +} + +minetest.register_node("mcl_flowerpots:flower_pot", { + description = S("Flower Pot"), + _tt_help = S("Can hold a small flower or plant"), + _doc_items_longdesc = S("Flower pots are decorative blocks in which flowers and other small plants can be placed."), + _doc_items_usagehelp = S("Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant."), + drawtype = "mesh", + mesh = "flowerpot.obj", + tiles = { + "mcl_flowerpots_flowerpot.png", + }, + visual_scale = 0.5, + wield_image = "mcl_flowerpots_flowerpot_inventory.png", + wield_scale = {x=1.0, y=1.0, z=1.0}, + paramtype = "light", + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} + }, + collision_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} + }, + is_ground_content = false, + inventory_image = "mcl_flowerpots_flowerpot_inventory.png", + groups = {dig_immediate=3, deco_block=1, attached_node=1, dig_by_piston=1, flower_pot=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + on_rightclick = function(pos, node, clicker, itemstack) + local name = clicker:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + local item = clicker:get_wielded_item():get_name() + for _, row in ipairs(flowers) do + local flower = row[1] + local flower_node = row[2] + if item == flower_node then + minetest.swap_node(pos, {name="mcl_flowerpots:flower_pot_"..flower}) + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + end + end + for _, row in ipairs(cubes) do + local flower = row[1] + local flower_node = row[2] + if item == flower_node then + minetest.swap_node(pos, {name="mcl_flowerpots:flower_pot_"..flower}) + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + end + end + end, +}) + +minetest.register_craft({ + output = 'mcl_flowerpots:flower_pot', + recipe = { + {'mcl_core:brick', '', 'mcl_core:brick'}, + {'', 'mcl_core:brick', ''}, + {'', '', ''}, + } +}) + +for _, row in ipairs(flowers) do +local flower = row[1] +local flower_node = row[2] +local desc = row[3] +local texture +if row[4] then + texture = row[4] +else + texture = minetest.registered_nodes[flower_node]["tiles"] +end +minetest.register_node("mcl_flowerpots:flower_pot_"..flower, { + description = desc, + _doc_items_create_entry = false, + drawtype = "mesh", + mesh = "flowerpot.obj", + tiles = { + "[combine:32x32:0,0=mcl_flowerpots_flowerpot.png:0,0="..texture[1], + }, + visual_scale = 0.5, + wield_scale = {x=1.0, y=1.0, z=1.0}, + paramtype = "light", + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} + }, + collision_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} + }, + is_ground_content = false, + groups = {dig_immediate=3, attached_node=1, dig_by_piston=1, not_in_creative_inventory=1, flower_pot=2}, + sounds = mcl_sounds.node_sound_stone_defaults(), + on_rightclick = function(pos, item, clicker) + local name = clicker:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + minetest.add_item({x=pos.x, y=pos.y+0.5, z=pos.z}, flower_node) + minetest.set_node(pos, {name="mcl_flowerpots:flower_pot"}) + end, + drop = { + items = { + { items = { "mcl_flowerpots:flower_pot", flower_node } } + } + }, +}) +-- Add entry alias for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_flowerpots:flower_pot", "nodes", "mcl_flowerpots:flower_pot_"..flower) +end +end + +for _, row in ipairs(cubes) do +local flower = row[1] +local flower_node = row[2] +local desc = row[3] +minetest.register_node("mcl_flowerpots:flower_pot_"..flower, { + description = desc, + _doc_items_create_entry = false, + drawtype = "mesh", + mesh = "flowerpot_with_long_cube.obj", + tiles = { + "mcl_flowerpots_"..flower..".png", + }, + visual_scale = 0.5, + wield_scale = {x=1.0, y=1.0, z=1.0}, + paramtype = "light", + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} + }, + collision_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} + }, + is_ground_content = false, + groups = {dig_immediate=3, attached_node=1, dig_by_piston=1, not_in_creative_inventory=1, flower_pot=2}, + sounds = mcl_sounds.node_sound_stone_defaults(), + on_rightclick = function(pos, item, clicker) + local name = "" + if clicker:is_player() then + name = clicker:get_player_name() + end + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + minetest.add_item({x=pos.x, y=pos.y+0.5, z=pos.z}, flower_node) + minetest.set_node(pos, {name="mcl_flowerpots:flower_pot"}) + end, + drop = { + items = { + { items = { "mcl_flowerpots:flower_pot", flower_node } } + } + }, + + +}) + +-- Add entry alias for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_flowerpots:flower_pot", "nodes", "mcl_flowerpots:flower_pot_"..flower) +end +end diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr new file mode 100644 index 00000000..3031e38d --- /dev/null +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr @@ -0,0 +1,26 @@ +# textdomain: mcl_flowerpots +Dandelion Flower Pot=Blumentopf mit Löwenzahn +Poppy Floer Pot=Blumentopf mit Mohn +Blue Orchid Flower Pot=Blumentopf mit blauer Orchidee +Allium Flower Pot=Blumentopf mit Sternlauch +Azure Bluet Flower Pot=Blumentopf mit Porzellansternchen +Red Tulip Flower Pot=Blumentopf mit roter Tulpe +Pink Tulip Flower Pot=Blumentopf mit rosa Tulpe +White Tulip Flower Pot=Blumentopf mit weißer Tulpe +Orange Tulip Flower Pot=Blumentopf mit orange Tulpe +Oxeye Daisy Flower Pot=Bluemtopf mit Margerite +Brown Mushroom Flower Pot=Blumentopf mit braunem Pilz +Red Mushroom Flower Pot=Blumentopf mit rotem Pilz +Oak Sapling Flower Pot=Blumentopf mit Eichensetzling +Acacia Sapling Flower Pot=Blumentopf mit Akaziensetzling +Jungle Sapling Flower Pot=Blumentopf mit Dschungelsetzling +Dark Oak Sapling Flower Pot=Blumentopf mit Schwarzeichensetzling +Spruce Sapling Flower Pot=Blumentopf mit Fichtensetzling +Birch Sapling Flower Pot=Blumentopf mit Birkensetzling +Dead Bush Flower Pot=Blumentopf mit totem Busch +Fern Flower Pot=Blumentopf mit Farn +Cactus Flower Pot=Blumentopf mit Kaktus +Flower Pot=Blumentopf +Flower pots are decorative blocks in which flowers and other small plants can be placed.=Blumentöpfe sind dekorative Blöcke, in die Blumen und andere kleine Pflanzen platziert werden können. +Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Platzieren Sie einfach eine Pflanze auf den Blumentopf. Blumentöpfe können kleine Blumen (nicht höher als 1 Block), Setzlinge, Farne, tote Büsche, Pilze und Kakteen halten. Rechtsklicken Sie auf eine Topfpflanze, um sie zurück zu erhalten. +Can hold a small flower or plant=Hält eine kleine Blume oder Pflanze diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr new file mode 100644 index 00000000..b303194b --- /dev/null +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_flowerpots +Dandelion Flower Pot=Maceta con diente de león +Poppy Floer Pot=Maceta con amapola +Blue Orchid Flower Pot=Maceta con orquídeas azules +Allium Flower Pot=Maceta con puerro +Azure Bluet Flower Pot=Maceta con flor azul celeste +Red Tulip Flower Pot=Maceta con tulipán rojo +Pink Tulip Flower Pot=Maceta con tulipán rosa +White Tulip Flower Pot=Maceta con tulipán blanco +Orange Tulip Flower Pot=Maceta con tulipán naranja +Oxeye Daisy Flower Pot=Maceta con margarita +Brown Mushroom Flower Pot=Maceta con seta marrón +Red Mushroom Flower Pot=Maceta con seta roja +Oak Sapling Flower Pot=Maceta con roble joven +Acacia Sapling Flower Pot=Maceta con acacia +Jungle Sapling Flower Pot=Maceta con la jungla +Dark Oak Sapling Flower Pot=Maceta con roble oscuro +Spruce Sapling Flower Pot=Maceta con abeto +Birch Sapling Flower Pot=Maceta con abedul +Dead Bush Flower Pot=Maceta con arbusto muerto +Fern Flower Pot=Maceta con helecho +Cactus Flower Pot=Maceta con cactus +Flower Pot=Maceta +Flower pots are decorative blocks in which flowers and other small plants can be placed.=Las macetas son bloques decorativos en los que se pueden colocar flores y otras plantas pequeñas. +Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Simplemente coloque una planta en la maceta. Las macetas pueden contener flores pequeñas (no más de 1 bloque), árboles jóvenes, helechos, arbustos muertos, hongos y cactus. Haga clic derecho en una planta en maceta para recuperar la planta. \ No newline at end of file diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr new file mode 100644 index 00000000..d8049711 --- /dev/null +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr @@ -0,0 +1,26 @@ +# textdomain: mcl_flowerpots +Dandelion Flower Pot=Pissenlit en Pot +Poppy Flower Pot=Coquelicot en Pot +Blue Orchid Flower Pot=Orchidée Bleue en Pot +Allium Flower Pot=Allium en Pot +Azure Bluet Flower Pot=Houstonie Bleue en Pot +Red Tulip Flower Pot=Tulipe Rouge en Pot +Pink Tulip Flower Pot=Tulipe Rose en Pot +White Tulip Flower Pot=Tulipe Blanche en Pot +Orange Tulip Flower Pot=Tulipe Orange en Pot +Oxeye Daisy Flower Pot=Marguerite en Pot +Brown Mushroom Flower Pot=Champignon Marron en Pot +Red Mushroom Flower Pot=Champignon Rouge en Pot +Oak Sapling Flower Pot=Pousse de Chêne en Pot +Acacia Sapling Flower Pot=Pousse d'Acacia en Pot +Jungle Sapling Flower Pot=Pousse d'Acajou en Pot +Dark Oak Sapling Flower Pot=Pousse de Chêne Noir en Pot +Spruce Sapling Flower Pot=Pousse de Sapin en Pot +Birch Sapling Flower Pot=Pousse de Bouleau en Pot +Dead Bush Flower Pot=Arbuste Mort en Pot +Fern Flower Pot=Fougère en Pot +Cactus Flower Pot=Cactus en Pot +Flower Pot=Pot de Fleurs +Flower pots are decorative blocks in which flowers and other small plants can be placed.=Les pots de fleurs sont des blocs décoratifs dans lesquels des fleurs et d'autres petites plantes peuvent être placées. +Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Placez simplement une plante sur le pot de fleurs. Les pots de fleurs peuvent contenir de petites fleurs (pas plus d'un bloc), des pousses, des fougères, des buissons morts, des champignons et des cactus. Cliquez avec le bouton droit sur une plante en pot pour récupérer la plante. +Can hold a small flower or plant=Peut contenir une petite fleur ou plante diff --git a/mods/ITEMS/mcl_flowerpots/locale/template.txt b/mods/ITEMS/mcl_flowerpots/locale/template.txt new file mode 100644 index 00000000..fcdf7d21 --- /dev/null +++ b/mods/ITEMS/mcl_flowerpots/locale/template.txt @@ -0,0 +1,26 @@ +# textdomain: mcl_flowerpots +Dandelion Flower Pot= +Poppy Flower Pot= +Blue Orchid Flower Pot= +Allium Flower Pot= +Azure Bluet Flower Pot= +Red Tulip Flower Pot= +Pink Tulip Flower Pot= +White Tulip Flower Pot= +Orange Tulip Flower Pot= +Oxeye Daisy Flower Pot= +Brown Mushroom Flower Pot= +Red Mushroom Flower Pot= +Oak Sapling Flower Pot= +Acacia Sapling Flower Pot= +Jungle Sapling Flower Pot= +Dark Oak Sapling Flower Pot= +Spruce Sapling Flower Pot= +Birch Sapling Flower Pot= +Dead Bush Flower Pot= +Fern Flower Pot= +Cactus Flower Pot= +Flower Pot= +Flower pots are decorative blocks in which flowers and other small plants can be placed.= +Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.= +Can hold a small flower or plant= diff --git a/mods/ITEMS/mcl_flowerpots/nodes.lua b/mods/ITEMS/mcl_flowerpots/nodes.lua deleted file mode 100644 index 1e47ceb5..00000000 --- a/mods/ITEMS/mcl_flowerpots/nodes.lua +++ /dev/null @@ -1,177 +0,0 @@ - -local flowers = { - {"dandelion", "mcl_flowers:dandelion", "Dandelion Flower Pot"}, - {"poppy", "mcl_flowers:poppy", "Poppy Floer Pot"}, - {"blue_orchid", "mcl_flowers:blue_orchid", "Blue Orchid Flower Pot"}, - {"allium", "mcl_flowers:allium", "Allium Flower Pot"}, - {"azure_bluet", "mcl_flowers:azure_bluet", "Azure Bluet Flower Pot"}, - {"tulip_red", "mcl_flowers:tulip_red", "Red Tulip Flower Pot"}, - {"tulip_pink", "mcl_flowers:tulip_pink", "Pink Tulip Flower Pot"}, - {"tulip_white", "mcl_flowers:tulip_white", "White Tulip Flower Pot"}, - {"tulip_orange", "mcl_flowers:tulip_orange", "Orange Tulip Flower Pot"}, - {"oxeye_daisy", "mcl_flowers:oxeye_daisy", "Oxeye Daisy Flower Pot"}, - {"mushroom_brown", "mcl_mushrooms:mushroom_brown", "Brown Mushroom Flower Pot"}, - {"mushroom_red", "mcl_mushrooms:mushroom_red", "Red Mushroom Flower Pot"}, - {"sapling", "mcl_core:sapling", "Oak Sapling Flower Pot"}, - {"acaciasapling", "mcl_core:acaciasapling", "Acacia Sapling Flower Pot"}, - {"junglesapling", "mcl_core:junglesapling", "Jungle Sapling Flower Pot"}, - {"darksapling", "mcl_core:darksapling", "Dark Oak Sapling Flower Pot"}, - {"sprucesapling", "mcl_core:sprucesapling", "Spruce Sapling Flower Pot"}, - {"birchsapling", "mcl_core:birchsapling", "Birch Sapling Flower Pot"}, - {"deadbush", "mcl_core:deadbush", "Dead Bush Flower Pot"}, - {"fern", "mcl_flowers:fern", "Fern Flower Pot"}, -} - -local cubes = { - {"cactus", "mcl_core:cactus", "Cactus Flower Pot"}, -} - -minetest.register_node("mcl_flowerpots:flower_pot", { - description = "Flower Pot", - _doc_items_longdesc = "Flower pots are decorational blocks in which flowers and other small plants can be placed.", - _doc_items_usagehelp = "Rightclick an empty flower pot while you wield a plant to place the plant. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.", - drawtype = "mesh", - mesh = "flowerpot.obj", - tiles = { - "mcl_flowerpots_flowerpot.png", - }, - visual_scale = 0.5, - wield_image = "mcl_flowerpots_flowerpot_inventory.png", - wield_scale = {x=1.0, y=1.0, z=1.0}, - paramtype = "light", - sunlight_propagates = true, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - collision_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - is_ground_content = false, - inventory_image = "mcl_flowerpots_flowerpot_inventory.png", - groups = {dig_immediate=3, deco_block=1, attached_node=1, dig_by_piston=1, flower_pot=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_rightclick = function(pos, node, clicker, itemstack) - local item = clicker:get_wielded_item():get_name() - for _, row in ipairs(flowers) do - local flower = row[1] - local flower_node = row[2] - if item == flower_node then - minetest.swap_node(pos, {name="mcl_flowerpots:flower_pot_"..flower}) - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end - end - end - for _, row in ipairs(cubes) do - local flower = row[1] - local flower_node = row[2] - if item == flower_node then - minetest.swap_node(pos, {name="mcl_flowerpots:flower_pot_"..flower}) - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end - end - end - end, -}) - -minetest.register_craft({ - output = 'mcl_flowerpots:flower_pot', - recipe = { - {'mcl_core:brick', '', 'mcl_core:brick'}, - {'', 'mcl_core:brick', ''}, - {'', '', ''}, - } -}) - -for _, row in ipairs(flowers) do -local flower = row[1] -local flower_node = row[2] -local desc = row[3] -local texture = minetest.registered_nodes[flower_node]["tiles"] -minetest.register_node("mcl_flowerpots:flower_pot_"..flower, { - description = desc, - _doc_items_create_entry = false, - drawtype = "mesh", - mesh = "flowerpot.obj", - tiles = { - "[combine:32x32:0,0=mcl_flowerpots_flowerpot.png:0,0="..texture[1], - }, - visual_scale = 0.5, - wield_scale = {x=1.0, y=1.0, z=1.0}, - paramtype = "light", - sunlight_propagates = true, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - collision_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - is_ground_content = false, - groups = {dig_immediate=3, attached_node=1, dig_by_piston=1, not_in_creative_inventory=1, flower_pot=2}, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_rightclick = function(pos, item, clicker) - minetest.add_item({x=pos.x, y=pos.y+0.5, z=pos.z}, flower_node) - minetest.set_node(pos, {name="mcl_flowerpots:flower_pot"}) - end, - drop = { - items = { - { items = { "mcl_flowerpots:flower_pot", flower_node } } - } - }, -}) --- Add entry alias for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_flowerpots:flower_pot", "nodes", "mcl_flowerpots:flower_pot_"..flower) -end -end - -for _, row in ipairs(cubes) do -local flower = row[1] -local flower_node = row[2] -local desc = row[3] -minetest.register_node("mcl_flowerpots:flower_pot_"..flower, { - description = desc, - _doc_items_create_entry = false, - drawtype = "mesh", - mesh = "flowerpot_with_long_cube.obj", - tiles = { - "mcl_flowerpots_"..flower..".png", - }, - visual_scale = 0.5, - wield_scale = {x=1.0, y=1.0, z=1.0}, - paramtype = "light", - sunlight_propagates = true, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - collision_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - is_ground_content = false, - groups = {dig_immediate=3, attached_node=1, dig_by_piston=1, not_in_creative_inventory=1, flower_pot=2}, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_rightclick = function(pos, item, clicker) - minetest.add_item({x=pos.x, y=pos.y+0.5, z=pos.z}, flower_node) - minetest.set_node(pos, {name="mcl_flowerpots:flower_pot"}) - end, - drop = { - items = { - { items = { "mcl_flowerpots:flower_pot", flower_node } } - } - }, - - -}) - --- Add entry alias for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_flowerpots:flower_pot", "nodes", "mcl_flowerpots:flower_pot_"..flower) -end -end diff --git a/mods/ITEMS/mcl_flowers/depends.txt b/mods/ITEMS/mcl_flowers/depends.txt index e52e9ac0..a7a7b9cd 100644 --- a/mods/ITEMS/mcl_flowers/depends.txt +++ b/mods/ITEMS/mcl_flowers/depends.txt @@ -1,4 +1,5 @@ mcl_core mcl_util mcl_sounds +screwdriver? doc? diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 42af3537..68ad9538 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -1,19 +1,43 @@ --- Minetest 0.4 mod: default --- See README.txt for licensing and other information. -local init = os.clock() +local S = minetest.get_translator("mcl_flowers") + +local mod_screwdriver = minetest.get_modpath("screwdriver") ~= nil -- Simple flower template -local smallflowerlongdesc = "This is a small flower. Small flowers are mainly used for dye production and can also be potted." -local flowerusagehelp = "It can only be placed on a block on which it would also survive." +local smallflowerlongdesc = S("This is a small flower. Small flowers are mainly used for dye production and can also be potted.") +local plant_usage_help = S("It can only be placed on a block on which it would also survive.") + +local get_palette_color_from_pos = function(pos) + local biome_data = minetest.get_biome_data(pos) + local index = 0 + if biome_data then + local biome = biome_data.biome + local biome_name = minetest.get_biome_name(biome) + local reg_biome = minetest.registered_biomes[biome_name] + if reg_biome then + index = reg_biome._mcl_palette_index + end + end + return index +end -- on_place function for flowers -local on_place_flower = mcl_util.generate_on_place_plant_function(function(pos, node) +local on_place_flower = mcl_util.generate_on_place_plant_function(function(pos, node, itemstack) local below = {x=pos.x, y=pos.y-1, z=pos.z} local soil_node = minetest.get_node_or_nil(below) if not soil_node then return false end + local has_palette = minetest.registered_nodes[itemstack:get_name()].palette ~= nil + local colorize + if has_palette then + colorize = get_palette_color_from_pos(pos) + end + if not colorize then + colorize = 0 + end + --[[ Placement requirements: * Dirt or grass block + * If not flower, also allowed on podzol and coarse dirt * Light level >= 8 at any time or exposed to sunlight at day ]] local light_night = minetest.get_node_light(pos, 0.0) @@ -22,15 +46,18 @@ local on_place_flower = mcl_util.generate_on_place_plant_function(function(pos, if (light_night and light_night >= 8) or (light_day and light_day >= minetest.LIGHT_MAX) then light_ok = true end - return (soil_node.name == "mcl_core:dirt" or soil_node.name == "mcl_core:dirt_with_grass" or soil_node.name == "mcl_core:dirt_with_grass_snow" or soil_node.name == "mcl_core:coarse_dirt" or soil_node.name == "mcl_core:podzol" or soil_node.name == "mcl_core:podzol_snow") and light_ok + local is_flower = minetest.get_item_group(itemstack:get_name(), "flower") == 1 + local ok = (soil_node.name == "mcl_core:dirt" or minetest.get_item_group(soil_node.name, "grass_block") == 1 or (not is_flower and (soil_node.name == "mcl_core:coarse_dirt" or soil_node.name == "mcl_core:podzol" or soil_node.name == "mcl_core:podzol_snow"))) and light_ok + return ok, colorize end) local function add_simple_flower(name, desc, image, simple_selection_box) minetest.register_node("mcl_flowers:"..name, { description = desc, _doc_items_longdesc = smallflowerlongdesc, - _doc_items_usagehelp = flowerusagehelp, + _doc_items_usagehelp = plant_usage_help, drawtype = "plantlike", + waving = 1, tiles = { image..".png" }, inventory_image = image..".png", wield_image = image..".png", @@ -38,7 +65,7 @@ local function add_simple_flower(name, desc, image, simple_selection_box) paramtype = "light", walkable = false, stack_max = 64, - groups = {dig_immediate=3,flammable=2,plant=1,flower=1,place_flowerlike=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1}, + groups = {dig_immediate=3,flammable=2,fire_encouragement=60,fire_flammability=100,plant=1,flower=1,place_flowerlike=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", on_place = on_place_flower, @@ -49,18 +76,16 @@ local function add_simple_flower(name, desc, image, simple_selection_box) }) end -local box_tulip = { -0.15, -0.5, -0.15, 0.15, 5/16, 0.15 } - -add_simple_flower("poppy", "Poppy", "mcl_flowers_poppy", { -0.15, -0.5, -0.15, 0.15, 3/16, 0.15 }) -add_simple_flower("dandelion", "Dandelion", "flowers_dandelion_yellow", { -0.15, -0.5, -0.15, 0.15, 0, 0.15 }) -add_simple_flower("oxeye_daisy", "Oxeye Daisy", "mcl_flowers_oxeye_daisy", { -0.15, -0.5, -0.15, 0.15, 5/16, 0.15 }) -add_simple_flower("tulip_orange", "Orange Tulip", "flowers_tulip", box_tulip) -add_simple_flower("tulip_pink", "Pink Tulip", "mcl_flowers_tulip_pink", box_tulip) -add_simple_flower("tulip_red", "Red Tulip", "mcl_flowers_tulip_red", box_tulip) -add_simple_flower("tulip_white", "White Tulip", "mcl_flowers_tulip_white", box_tulip) -add_simple_flower("allium", "Allium", "mcl_flowers_allium", { -0.2, -0.5, -0.2, 0.2, 6/16, 0.2 }) -add_simple_flower("azure_bluet", "Azure Bluet", "mcl_flowers_azure_bluet", { -3/16, -0.5, -3/16, 3/16, 2/16, 3/16 }) -add_simple_flower("blue_orchid", "Blue Orchid", "mcl_flowers_blue_orchid", { -5/16, -0.5, -5/16, 5/16, 6/16, 5/16 }) +add_simple_flower("poppy", S("Poppy"), "mcl_flowers_poppy", { -5/16, -0.5, -5/16, 5/16, 5/16, 5/16 }) +add_simple_flower("dandelion", S("Dandelion"), "flowers_dandelion_yellow", { -4/16, -0.5, -4/16, 4/16, 3/16, 4/16 }) +add_simple_flower("oxeye_daisy", S("Oxeye Daisy"), "mcl_flowers_oxeye_daisy", { -4/16, -0.5, -4/16, 4/16, 4/16, 4/16 }) +add_simple_flower("tulip_orange", S("Orange Tulip"), "flowers_tulip", { -3/16, -0.5, -3/16, 3/16, 5/16, 3/16 }) +add_simple_flower("tulip_pink", S("Pink Tulip"), "mcl_flowers_tulip_pink", { -3/16, -0.5, -3/16, 3/16, 5/16, 3/16 }) +add_simple_flower("tulip_red", S("Red Tulip"), "mcl_flowers_tulip_red", { -3/16, -0.5, -3/16, 3/16, 6/16, 3/16 }) +add_simple_flower("tulip_white", S("White Tulip"), "mcl_flowers_tulip_white", { -3/16, -0.5, -3/16, 3/16, 4/16, 3/16 }) +add_simple_flower("allium", S("Allium"), "mcl_flowers_allium", { -3/16, -0.5, -3/16, 3/16, 6/16, 3/16 }) +add_simple_flower("azure_bluet", S("Azure Bluet"), "mcl_flowers_azure_bluet", { -5/16, -0.5, -5/16, 5/16, 3/16, 5/16 }) +add_simple_flower("blue_orchid", S("Blue Orchid"), "mcl_flowers_blue_orchid", { -5/16, -0.5, -5/16, 5/16, 7/16, 5/16 }) local wheat_seed_drop = { @@ -73,26 +98,31 @@ local wheat_seed_drop = { } } --- Tall Grass -minetest.register_node("mcl_flowers:tallgrass", { - description = "Tall Grass", - _doc_items_longdesc = "Tall grass is a small plant which often occours on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.", - _doc_items_hidden = false, +-- CHECKME: How does tall grass behave when pushed by a piston? + +--- Tall Grass --- +local def_tallgrass = { + description = S("Tall Grass"), drawtype = "plantlike", + _doc_items_longdesc = S("Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high."), + _doc_items_usagehelp = plant_usage_help, + _doc_items_hidden = false, + waving = 1, tiles = {"mcl_flowers_tallgrass.png"}, - inventory_image = "mcl_flowers_tallgrass.png", - wield_image = "mcl_flowers_tallgrass.png", + inventory_image = "mcl_flowers_tallgrass_inv.png", + wield_image = "mcl_flowers_tallgrass_inv.png", selection_box = { type = "fixed", - fixed = {{ -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 }}, + fixed = {{ -6/16, -8/16, -6/16, 6/16, 4/16, 6/16 }}, }, paramtype = "light", + paramtype2 = "color", + palette = "mcl_core_palette_grass.png", sunlight_propagates = true, walkable = false, buildable_to = true, is_ground_content = true, - -- CHECKME: How does tall grass behave when pushed by a piston? - groups = {dig_immediate=3, flammable=3,attached_node=1,plant=1,place_flowerlike=1,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1}, + groups = {handy=1,shearsy=1, flammable=3,fire_encouragement=60,fire_flammability=100,attached_node=1,plant=1,place_flowerlike=2,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = wheat_seed_drop, _mcl_shears_drop = true, @@ -100,45 +130,50 @@ minetest.register_node("mcl_flowers:tallgrass", { on_place = on_place_flower, _mcl_blast_resistance = 0, _mcl_hardness = 0, -}) +} +minetest.register_node("mcl_flowers:tallgrass", def_tallgrass) --- Fern --- -minetest.register_node("mcl_flowers:fern", { - description = "Fern", - _doc_items_longdesc = "Ferns are small plants which occour naturally in grasslands. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.", - drawtype = "plantlike", - tiles = { "mcl_flowers_fern.png" }, - inventory_image = "mcl_flowers_fern.png", - wield_image = "mcl_flowers_fern.png", - sunlight_propagates = true, - paramtype = "light", - walkable = false, - stack_max = 64, - -- CHECKME: How does a fern behave when pushed by a piston? - groups = {dig_immediate=3,flammable=2,attached_node=1,plant=1,place_flowerlike=1,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1}, - buildable_to = true, - sounds = mcl_sounds.node_sound_leaves_defaults(), - node_placement_prediction = "", - on_place = on_place_flower, - drop = wheat_seed_drop, - _mcl_shears_drop = true, - selection_box = { - type = "fixed", - fixed = { -4/16, -0.5, -4/16, 4/16, 7/16, 4/16 }, - }, -}) +-- The fern is very similar to tall grass, so we can copy a lot from it. +local def_fern = table.copy(def_tallgrass) +def_fern.description = S("Fern") +def_fern._doc_items_longdesc = S("Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.") +def_fern.tiles = { "mcl_flowers_fern.png" } +def_fern.inventory_image = "mcl_flowers_fern_inv.png" +def_fern.wield_image = "mcl_flowers_fern_inv.png" +def_fern.selection_box = { + type = "fixed", + fixed = { -6/16, -0.5, -6/16, 6/16, 5/16, 6/16 }, +} -local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_img, selbox_radius, selbox_top_height, drop, shears_drop, is_flower) +minetest.register_node("mcl_flowers:fern", def_fern) + +local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_img, selbox_radius, selbox_top_height, drop, shears_drop, is_flower, grass_color) if not inv_img then inv_img = top_img end - local flowergroup, usagehelp + local usagehelp, noncreative, create_entry, paramtype2, palette if is_flower == nil then is_flower = true end + + local bottom_groups = {flammable=2,fire_encouragement=60,fire_flammability=100, non_mycelium_plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1, plant=1,double_plant=1,deco_block=1,not_in_creative_inventory=noncreative} if is_flower then - flowergroup = 1 - usagehelp = flowerusagehelp + bottom_groups.flower = 1 + bottom_groups.place_flowerlike = 1 + bottom_groups.dig_immediate = 3 + else + bottom_groups.place_flowerlike = 2 + bottom_groups.handy = 1 + bottom_groups.shearsy = 1 + end + if grass_color then + paramtype2 = "color" + palette = "mcl_core_palette_grass.png" + end + if longdesc == nil then + noncreative = 1 + create_entry = false end -- Drop itself by default local drop_bottom, drop_top @@ -150,14 +185,17 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im end minetest.register_node("mcl_flowers:"..name, { description = desc, + _doc_items_create_entry = create_entry, _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, + _doc_items_usagehelp = plant_usage_help, drawtype = "plantlike", tiles = { bottom_img }, inventory_image = inv_img, wield_image = inv_img, sunlight_propagates = true, paramtype = "light", + paramtype2 = paramtype2, + palette = palette, walkable = false, buildable_to = true, drop = drop_bottom, @@ -170,9 +208,11 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im on_place = function(itemstack, placer, pointed_thing) -- We can only place on nodes if pointed_thing.type ~= "node" then - --return + return end + local itemstring = "mcl_flowers:"..name + -- Call on_rightclick if the pointed node defines it local node = minetest.get_node(pointed_thing.under) if placer and not placer:get_player_control().sneak then @@ -198,8 +238,8 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } local bottom_buildable = minetest.registered_nodes[minetest.get_node(bottom).name].buildable_to local top_buildable = minetest.registered_nodes[minetest.get_node(top).name].buildable_to - local floorname = minetest.get_node({x=bottom.x, y=bottom.y-1, z=bottom.z}).name - if not minetest.registered_nodes[floorname] then + local floor = minetest.get_node({x=bottom.x, y=bottom.y-1, z=bottom.z}) + if not minetest.registered_nodes[floor.name] then return itemstack end @@ -212,13 +252,18 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im -- Placement rules: -- * Allowed on dirt or grass block + -- * If not a flower, also allowed on podzol and coarse dirt -- * Only with light level >= 8 -- * Only if two enough space - if (floorname == "mcl_core:dirt" or floorname == "mcl_core:dirt_with_grass" or floorname == "mcl_core:dirt_with_grass_snow" or floorname == "mcl_core:coarse_dirt" or floorname == "mcl_core:podzol" or floorname == "mcl_core:podzol_snow") and bottom_buildable and top_buildable and light_ok then + if (floor.name == "mcl_core:dirt" or minetest.get_item_group(floor.name, "grass_block") == 1 or (not is_flower and (floor.name == "mcl_core:coarse_dirt" or floor.name == "mcl_core:podzol" or floor.name == "mcl_core:podzol_snow"))) and bottom_buildable and top_buildable and light_ok then + local param2 + if grass_color then + param2 = get_palette_color_from_pos(bottom) + end -- Success! We can now place the flower - minetest.sound_play(minetest.registered_nodes["mcl_flowers:"..name].sounds.place, {pos = bottom, gain=1}) - minetest.set_node(bottom, {name="mcl_flowers:"..name}) - minetest.set_node(top, {name="mcl_flowers:"..name.."_top"}) + minetest.sound_play(minetest.registered_nodes[itemstring].sounds.place, {pos = bottom, gain=1}, true) + minetest.set_node(bottom, {name=itemstring, param2=param2}) + minetest.set_node(top, {name=itemstring.."_top", param2=param2}) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end @@ -233,18 +278,25 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im minetest.remove_node(top) end end, - groups = {dig_immediate=3,flammable=2,flower=flowergroup,place_flowerlike=1,non_mycelium_plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1, plant=1,double_plant=1,deco_block=1}, + groups = bottom_groups, sounds = mcl_sounds.node_sound_leaves_defaults(), }) + local top_groups = table.copy(bottom_groups) + top_groups.not_in_creative_inventory=1 + top_groups.double_plant=2 + top_groups.attached_node=nil + -- Top minetest.register_node("mcl_flowers:"..name.."_top", { - description = desc.." (Top Part)", + description = desc.." " .. S("(Top Part)"), _doc_items_create_entry = false, drawtype = "plantlike", tiles = { top_img }, sunlight_propagates = true, paramtype = "light", + paramtype2 = paramtype2, + palette = palette, walkable = false, buildable_to = true, selection_box = { @@ -261,25 +313,29 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im minetest.remove_node(bottom) end end, - groups = {dig_immediate=3,flammable=2,flower=flowergroup,place_flowerlike=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1, not_in_creative_inventory = 1, plant=1,double_plant=2}, + groups = top_groups, sounds = mcl_sounds.node_sound_leaves_defaults(), }) - if minetest.get_modpath("doc") then + if minetest.get_modpath("doc") and longdesc then doc.add_entry_alias("nodes", "mcl_flowers:"..name, "nodes", "mcl_flowers:"..name.."_top") + -- If no longdesc, help alias must be added manually end end -add_large_plant("peony", "Peony", "A peony is a large plant which occupies two blocks. It is mainly used in dye protection.", "mcl_flowers_double_plant_paeonia_bottom.png", "mcl_flowers_double_plant_paeonia_top.png", nil, 5/16, 4/16) -add_large_plant("rose_bush", "Rose Bush", "A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection.", "mcl_flowers_double_plant_rose_bottom.png", "mcl_flowers_double_plant_rose_top.png", nil, 6/16, 7/16) -add_large_plant("lilac", "Lilac", "A lilac is a large plant which occupies two blocks. It is mainly used in dye production.", "mcl_flowers_double_plant_syringa_bottom.png", "mcl_flowers_double_plant_syringa_top.png", nil, 6/16, 7/16) +add_large_plant("peony", S("Peony"), S("A peony is a large plant which occupies two blocks. It is mainly used in dye protection."), "mcl_flowers_double_plant_paeonia_bottom.png", "mcl_flowers_double_plant_paeonia_top.png", nil, 5/16, 6/16) +add_large_plant("rose_bush", S("Rose Bush"), S("A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection."), "mcl_flowers_double_plant_rose_bottom.png", "mcl_flowers_double_plant_rose_top.png", nil, 5/16, 1/16) +add_large_plant("lilac", S("Lilac"), S("A lilac is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_syringa_bottom.png", "mcl_flowers_double_plant_syringa_top.png", nil, 5/16, 6/16) -- TODO: Make the sunflower face East. Requires a mesh for the top node. -add_large_plant("sunflower", "Sunflower", "A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.", "mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_top.png^mcl_flowers_double_plant_sunflower_front.png", "mcl_flowers_double_plant_sunflower_front.png", 3/16, 4/16) +add_large_plant("sunflower", S("Sunflower"), S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_top.png^mcl_flowers_double_plant_sunflower_front.png", "mcl_flowers_double_plant_sunflower_front.png", 6/16, 6/16) -add_large_plant("double_grass", "Double Tallgrass", "Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.", "mcl_flowers_double_plant_grass_bottom.png", "mcl_flowers_double_plant_grass_top.png", nil, 5/16, 7/16, wheat_seed_drop, {"mcl_flowers:tallgrass 2"}, false) -add_large_plant("double_fern", "Large Fern", "Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.", "mcl_flowers_double_plant_fern_bottom.png", "mcl_flowers_double_plant_fern_top.png", nil, 6/16, 5/16, wheat_seed_drop, {"mcl_flowers:fern 2"}, false) +local longdesc_grass = S("Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.") +local longdesc_fern = S("Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.") + +add_large_plant("double_grass", S("Double Tallgrass"), longdesc_grass, "mcl_flowers_double_plant_grass_bottom.png", "mcl_flowers_double_plant_grass_top.png", "mcl_flowers_double_plant_grass_inv.png", 6/16, 4/16, wheat_seed_drop, {"mcl_flowers:tallgrass 2"}, false, true) +add_large_plant("double_fern", S("Large Fern"), longdesc_fern, "mcl_flowers_double_plant_fern_bottom.png", "mcl_flowers_double_plant_fern_top.png", "mcl_flowers_double_plant_fern_inv.png", 5/16, 5/16, wheat_seed_drop, {"mcl_flowers:fern 2"}, false, true) minetest.register_abm({ label = "Pop out flowers", @@ -296,18 +352,22 @@ minetest.register_abm({ return end -- Pop out flower if not on dirt, grass block or too low brightness - if (below.name ~= "mcl_core:dirt" and below.name ~= "mcl_core:dirt_with_grass" and below.name ~= "mcl_core:dirt_with_grass_snow") or (minetest.get_node_light(pos, 0.5) < 8) then + if (below.name ~= "mcl_core:dirt" and minetest.get_item_group(below.name, "grass_block") ~= 1) or (minetest.get_node_light(pos, 0.5) < 8) then minetest.dig_node(pos) return end end, }) +local on_rotate +if mod_screwdriver then + on_rotate = screwdriver.rotate_simple +end -- Lily Pad minetest.register_node("mcl_flowers:waterlily", { - description = "Lily Pad", - _doc_items_longdesc = "A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.", + description = S("Lily Pad"), + _doc_items_longdesc = S("A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice."), drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -356,26 +416,22 @@ minetest.register_node("mcl_flowers:waterlily", { local idef = itemstack:get_definition() if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=above, gain=1}) + minetest.sound_play(idef.sounds.place, {pos=pointed_thing.above, gain=1}, true) end if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end else - minetest.chat_send_player(player_name, "Node is protected") minetest.record_protection_violation(pos, player_name) end end end return itemstack - end + end, + on_rotate = on_rotate, }) -- Legacy support minetest.register_alias("mcl_core:tallgrass", "mcl_flowers:tallgrass") - --- Show loading time -local time_to_load= os.clock() - init -print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load)) diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr new file mode 100644 index 00000000..cf12fd51 --- /dev/null +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr @@ -0,0 +1,32 @@ +# textdomain: mcl_flowers +This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Dies ist eine kleine Blume. Kleine Blumen werden hauptsächlich in der Farbenproduktion benutzt, können aber auch in Blumentöpfen platziert werden. +It can only be placed on a block on which it would also survive.=Diese Pflanze kann nur auf einem Block platziert werden, auf dem sie auch überleben würde. +Poppy=Mohn +Dandelion=Löwenzahn +Oxeye Daisy=Margerite +Orange Tulip=Orange Tulpe +Pink Tulip=Rosa Tulpe +Red Tulip=Rote Tulpe +White Tulip=Weiße Tulpe +Allium=Sternlauch +Azure Bluet=Porzellansternchen +Blue Orchid=Blaue Orchidee +Tall Grass=Hohes Gras +Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=Hohes Gras ist eine kleine Pflanze, die oft auf Wiesenflächen wächst. Es kann für Weizensamen abgeerntet werden. Mit Knochenmehl wird sich hohes Gras zu doppelhohem Gras verwandeln. +Fern=Farn +Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Farne sind kleine Pflanzen, die oft in Dschungeln und Taigas vorkommen. Sie können für Weizensamen abgeerntet werden. Mit Knochenmehl wird sich ein Farn zu einem großen Farn, der zwei Blöcke hoch ist, verwandeln. +(Top Part)=(Oberseite) +Peony=Pfingstrose +A peony is a large plant which occupies two blocks. It is mainly used in dye protection.=Eine Pfingstrose ist eine große Pflanze, die zwei Blöcke hoch ist. Sie wird hauptsächlich für die Farbenproduktion gebraucht. +Rose Bush=Rosenbusch +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection.=Ein Rosenbusch ist eine große Pflanze, die zwei Blöcke hoch ist. Es ist sicher, durch ihn hindurch zu gehen. Er wird hauptsächlich für die Farbenproduktion gebraucht. +Lilac=Flieder +A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Ein Flieder ist eine große Pflanze, die zwei Blöcke hoch ist. Er wird hauptsächlich für die Farbenproduktion gebraucht. +Sunflower=Sonnenblume +A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Eine Sonnenblume ist eine große Pflanze, die zwei Blöcke hoch ist. Sie wird hauptsächlich für die Farbenproduktion gebraucht. +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=Doppelhohes Gras ist eine Variante von hohem Gras und nimmt zwei Blöcke an Platz ein. Er kann für Weizensamen abgeerntet werden. +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=Ein großer Farn ist eine Variante von Farn und nimmt zwei Blöcke an Platz ein. Er kann für Weizensamen abgeerntet werden. +Double Tallgrass=Doppelhohes Gras +Large Fern=Großer Farn +Lily Pad=Seerosenblatt +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Ein Seerosenblatt ist eine flache Pflanze, die eine stabile begehbare Oberfläche ist. Sie kann auf Wasserquellen, auf Eis und brüchigem Eis platziert werden. diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.es.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.es.tr new file mode 100644 index 00000000..6b9734b0 --- /dev/null +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.es.tr @@ -0,0 +1,32 @@ +# textdomain: mcl_flowers +This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Esta es una pequeña flor. Las flores pequeñas se utilizan principalmente para la producción de tinte y también se pueden macetas. +It can only be placed on a block on which it would also survive.=Solo se puede colocar en un bloque en el que también sobreviviría. +Poppy=Amapola +Dandelion=Diente de león +Oxeye Daisy=Margarita +Orange Tulip=Tulipán naranja +Pink Tulip=Tulipán rosa +Red Tulip=Tulipán rojo +White Tulip=Tulipán blanco +Allium=Allium +Azure Bluet=Azul celeste +Blue Orchid=Orquídea azul +Tall Grass=Cesped alto +Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=El cesped alto es una planta pequeña que a menudo se encuentra en la superficie de los pastizales. Se puede cosechar para semillas de trigo. Mediante el uso de harina de hueso, la hierba alta se puede convertir en hierba alta doble que tiene dos bloques de altura. +Fern=Helecho +Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Los helechos son plantas pequeñas que se producen naturalmente en las selvas y taigas. Se pueden cosechar para semillas de trigo. Al usar harina de hueso, un helecho se puede convertir en un helecho grande que tiene dos bloques de altura. +(Top Part)=(Parte superior) +Peony=Peonía +A peony is a large plant which occupies two blocks. It is mainly used in dye protection.=Una peonía es una planta grande que ocupa dos bloques. Se utiliza principalmente en la protección del tinte. +Rose Bush=Rosal +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection.=Un rosal es una planta grande que ocupa dos bloques. Es seguro tocarlo. Los rosales se utilizan principalmente en la protección del tinte. +Lilac=Lila +A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Una lila es una planta grande que ocupa dos bloques. Se utiliza principalmente en la producción de tintes. +Sunflower=Girasol +A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Un girasol es una planta grande que ocupa dos bloques. Se utiliza principalmente en la producción de tintes. +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=Doble hierba alta una variante de hierba alta y ocupa dos bloques. Se puede cosechar para semillas de trigo. +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=El helecho grande es una variante del helecho y ocupa dos bloques. Se puede cosechar para semillas de trigo. +Double Tallgrass=Doble hierba alta +Large Fern=Helecho grande +Lily Pad=Nenúfar +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Un nenúfar es un bloque de planta plano sobre el que se puede caminar. Se pueden colocar en fuentes de agua y hielo. diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr new file mode 100644 index 00000000..e038063c --- /dev/null +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr @@ -0,0 +1,32 @@ +# textdomain: mcl_flowers +This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Ceci est une petite fleur. Les petites fleurs sont principalement utilisées pour la production de teintures et peuvent également être mises en pot. +It can only be placed on a block on which it would also survive.=Elles ne peuvent être placées que sur un bloc sur lequel elles survivraient également. +Poppy=Coquelicot +Dandelion=Pisselit +Oxeye Daisy=Marguerite +Orange Tulip=Tulipe Orange +Pink Tulip=Tulipe Rose +Red Tulip=Tulipe Rouge +White Tulip=Tulipe Blanche +Allium=Allium +Azure Bluet=Houstonie Bleue +Blue Orchid=Orchidée Bleue +Tall Grass=Hautes herbes +Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=L'herbe haute est une petite plante qui se rencontre souvent à la surface des prairies. Il peut être récolté pour les graines de blé. En utilisant de la farine d'os, les hautes herbes peuvent être transformées en herbes hautes doubles de deux blocs de hauteur. +Fern=Fougère +Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Les fougères sont de petites plantes qui se produisent naturellement dans les jungles et les taigas. Ils peuvent être récoltés pour les graines de blé. En utilisant de la farine d'os, une fougère peut être transformée en une grande fougère haute de deux blocs. +(Top Part)=(Partie supérieure) +Peony=Pivoine +A peony is a large plant which occupies two blocks. It is mainly used in dye protection.=Une pivoine est une grande plante qui occupe deux blocs. Il est principalement utilisé dans la protection des colorants. +Rose Bush=Rosier +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection.=Un rosier est une grande plante qui occupe deux blocs. Il n'y a pas de danger à le toucher. Les rosiers sont principalement utilisés dans la protection des colorants. +Lilac=Lilas +A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Un lilas est une grande plante qui occupe deux blocs. Il est principalement utilisé dans la production de colorants. +Sunflower=Tournesol +A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Un tournesol est une grande plante qui occupe deux blocs. Il est principalement utilisé dans la production de colorants. +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=La grande herbe haute une variante de l'herbe haute et occupe deux blocs. Elle peut être récoltée pour les graines de blé. +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=La grande fougère est une variante de la fougère et occupe deux blocs. Elle peut être récoltée pour les graines de blé. +Double Tallgrass=Grande Herbe +Large Fern=Grande Fougère +Lily Pad=Nénuphar +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Un nénuphar est un bloc de plante plat sur lequel on peut marcher. Ils peuvent être placés sur des sources d'eau, de la glace et de la glace givrée. diff --git a/mods/ITEMS/mcl_flowers/locale/template.txt b/mods/ITEMS/mcl_flowers/locale/template.txt new file mode 100644 index 00000000..dcf76279 --- /dev/null +++ b/mods/ITEMS/mcl_flowers/locale/template.txt @@ -0,0 +1,32 @@ +# textdomain: mcl_flowers +This is a small flower. Small flowers are mainly used for dye production and can also be potted.= +It can only be placed on a block on which it would also survive.= +Poppy= +Dandelion= +Oxeye Daisy= +Orange Tulip= +Pink Tulip= +Red Tulip= +White Tulip= +Allium= +Azure Bluet= +Blue Orchid= +Tall Grass= +Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.= +Fern= +Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.= +(Top Part)= +Peony= +A peony is a large plant which occupies two blocks. It is mainly used in dye protection.= +Rose Bush= +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection.= +Lilac= +A lilac is a large plant which occupies two blocks. It is mainly used in dye production.= +Sunflower= +A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.= +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.= +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.= +Double Tallgrass= +Large Fern= +Lily Pad= +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.= diff --git a/mods/ITEMS/mcl_flowers/textures/flowers_waterlily.png b/mods/ITEMS/mcl_flowers/textures/flowers_waterlily.png index 53b13f25..f3ca54b1 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/flowers_waterlily.png and b/mods/ITEMS/mcl_flowers/textures/flowers_waterlily.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_allium.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_allium.png index c3b37fa3..db5f8206 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_allium.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_allium.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_azure_bluet.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_azure_bluet.png index c8086b10..e84d347e 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_azure_bluet.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_azure_bluet.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_blue_orchid.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_blue_orchid.png index c5ddf11c..60f9df1a 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_blue_orchid.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_blue_orchid.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_bottom.png index 448cdeba..2a2be226 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_bottom.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_bottom.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_inv.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_inv.png new file mode 100644 index 00000000..f59bff0b Binary files /dev/null and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_inv.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_top.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_top.png index 9b7d3717..860b4fee 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_top.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_top.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_bottom.png index 5ae10c09..a5f25ef6 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_bottom.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_bottom.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_inv.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_inv.png new file mode 100644 index 00000000..974b21a7 Binary files /dev/null and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_inv.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_top.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_top.png index e9432868..ef60144b 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_top.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_top.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_bottom.png index 13170e66..a8f5df22 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_bottom.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_bottom.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_back.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_back.png index 3bf37177..c1222611 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_back.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_back.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_bottom.png index 4f169a84..e84fc241 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_bottom.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_bottom.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_top.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_top.png index ca478a3f..aaf72811 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_top.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_top.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern.png index 7e6989fc..840d6663 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern_inv.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern_inv.png new file mode 100644 index 00000000..1f5980ee Binary files /dev/null and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern_inv.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass.png index 63394b15..1088bd19 100644 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass.png and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass.png differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass_inv.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass_inv.png new file mode 100644 index 00000000..0e075add Binary files /dev/null and b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass_inv.png differ diff --git a/mods/ITEMS/mcl_furnaces/README.md b/mods/ITEMS/mcl_furnaces/README.md index 7bdcae46..c7282124 100644 --- a/mods/ITEMS/mcl_furnaces/README.md +++ b/mods/ITEMS/mcl_furnaces/README.md @@ -9,4 +9,4 @@ Modified by Wuzzy. License of media ---------------- -MIT License +See the main MineClone 2 README.md file. diff --git a/mods/ITEMS/mcl_furnaces/depends.txt b/mods/ITEMS/mcl_furnaces/depends.txt index ccdc9605..365076c1 100644 --- a/mods/ITEMS/mcl_furnaces/depends.txt +++ b/mods/ITEMS/mcl_furnaces/depends.txt @@ -1,6 +1,8 @@ mcl_init +mcl_formspec mcl_core mcl_sounds mcl_craftguide mcl_achievements doc? +screwdriver? diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index b6481e52..c76b379e 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -1,25 +1,32 @@ +local S = minetest.get_translator("mcl_furnaces") + -- -- Formspecs -- local function active_formspec(fuel_percent, item_percent) return "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_inventory_furnace.png]".. - mcl_vars.inventory_header.. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. "list[current_name;src;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. "list[current_name;fuel;2.75,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. "list[current_name;dst;5.75,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. (100-fuel_percent)..":default_furnace_fire_fg.png]".. "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - "image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - "image_button[8,1;1,1;doc_button_icon_lores.png;doc;]".. - "tooltip[craftguide;Recipe book]".. - "tooltip[doc;Help]".. + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. "listring[current_name;dst]".. "listring[current_player;main]".. "listring[current_name;src]".. @@ -29,19 +36,24 @@ local function active_formspec(fuel_percent, item_percent) end local inactive_formspec = "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_inventory_furnace.png]".. - mcl_vars.inventory_header.. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. "list[current_name;src;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. "list[current_name;fuel;2.75,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. "list[current_name;dst;5.75,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. - "image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - "image_button[8,1;1,1;doc_button_icon_lores.png;doc;]".. - "tooltip[craftguide;Recipe book]".. - "tooltip[doc;Help]".. + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. "listring[current_name;dst]".. "listring[current_player;main]".. "listring[current_name;src]".. @@ -51,9 +63,7 @@ local inactive_formspec = "size[9,8.75]".. local receive_fields = function(pos, formname, fields, sender) if fields.craftguide then - mcl_craftguide.show_craftguide(sender) - elseif fields.doc and minetest.get_modpath("doc") then - doc.show_entry(sender:get_player_name(), "nodes", "mcl_furnaces:furnace", true) + mcl_craftguide.show(sender:get_player_name()) end end @@ -62,7 +72,9 @@ end -- local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) return 0 end local meta = minetest.get_meta(pos) @@ -113,7 +125,9 @@ local function allow_metadata_inventory_move(pos, from_list, from_index, to_list end local function allow_metadata_inventory_take(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) return 0 end return stack:get_count() @@ -193,10 +207,13 @@ local function furnace_node_timer(pos, elapsed) inv:add_item("dst", cooked.item) inv:set_stack("src", 1, aftercooked.items[1]) - -- Unique recipe: Put water into empty bucket after cooking wet sponge successfully - if srclist[1]:get_name() == "mcl_sponges:sponge_wet" then - if inv:get_stack("fuel", 1):get_name() == "mcl_buckets:bucket_empty" then + -- Unique recipe: Pour water into empty bucket after cooking wet sponge successfully + if inv:get_stack("fuel", 1):get_name() == "mcl_buckets:bucket_empty" then + if srclist[1]:get_name() == "mcl_sponges:sponge_wet" then inv:set_stack("fuel", 1, "mcl_buckets:bucket_water") + -- Also for river water + elseif srclist[1]:get_name() == "mcl_sponges:sponge_wet_river_water" then + inv:set_stack("fuel", 1, "mcl_buckets:bucket_river_water") end end @@ -281,10 +298,18 @@ local function furnace_node_timer(pos, elapsed) return result end +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple +end + minetest.register_node("mcl_furnaces:furnace", { - description = "Furnace", - _doc_items_longdesc = "Furnaces cook or smelt several items, using a furnace fuel, into something else.", - _doc_items_usagehelp = "Right-click the furnace to view it. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.", + description = S("Furnace"), + _tt_help = S("Uses fuel to smelt or cook items"), + _doc_items_longdesc = S("Furnaces cook or smelt several items, using a furnace fuel, into something else."), + _doc_items_usagehelp = + S("Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.").."\n".. + S("Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn."), _doc_items_hidden = false, tiles = { "default_furnace_top.png", "default_furnace_bottom.png", @@ -334,12 +359,13 @@ minetest.register_node("mcl_furnaces:furnace", { allow_metadata_inventory_take = allow_metadata_inventory_take, on_metadata_inventory_take = on_metadata_inventory_take, on_receive_fields = receive_fields, - _mcl_blast_resistance = 17.5, + _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, + on_rotate = on_rotate, }) minetest.register_node("mcl_furnaces:furnace_active", { - description = "Burning Furnace", + description = S("Burning Furnace"), _doc_items_create_entry = false, tiles = { "default_furnace_top.png", "default_furnace_bottom.png", @@ -376,8 +402,9 @@ minetest.register_node("mcl_furnaces:furnace_active", { allow_metadata_inventory_take = allow_metadata_inventory_take, on_metadata_inventory_take = on_metadata_inventory_take, on_receive_fields = receive_fields, - _mcl_blast_resistance = 17.5, + _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, + on_rotate = on_rotate, }) minetest.register_craft({ @@ -394,3 +421,15 @@ if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_furnaces:furnace", "nodes", "mcl_furnaces:furnace_active") end +-- Legacy +minetest.register_lbm({ + label = "Update furnace formspecs (0.60.0", + name = "mcl_furnaces:update_formspecs_0_60_0", + -- Only update inactive furnaces because active ones should update themselves + nodenames = { "mcl_furnaces:furnace" }, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + end, +}) diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr new file mode 100644 index 00000000..5e55af7f --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_furnaces +Furnace=Ofen +Furnaces cook or smelt several items, using a furnace fuel, into something else.=Ofen kochen oder schmelzen diverse Gegenstände, unter Zuhilfenahme eines Brennstoffs, zu etwas anderem. +Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Benutzen Sie den Ofen, um das Ofenmenü zu öffnen. Platzieren Sie einen Brennstoff in den unteren Platz und das Quellmaterial in den oberen Platz. Der Ofen wird langsam seinen Brennstoff benutzen, um den Gegenstand zu schmelzen. Das Ergebnis landet im Ausgabeplatz rechts. +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Benutzen Sie das Rezeptbuch, um zu sehen, was Sie schmelzen können und was Sie als Brennstoff benutzen können und wie lange dieser brennt. +Burning Furnace=Aktiver Ofen +Recipe book=Fertigungsbuch +Inventory=Inventar +Uses fuel to smelt or cook items=Benutzt Brennstoff, um Dinge zu schmelzen oder zu kochen diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.es.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.es.tr new file mode 100644 index 00000000..10378c2d --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.es.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_furnaces +Furnace=Horno +Furnaces cook or smelt several items, using a furnace fuel, into something else.=Los hornos cocinan u funden varios elementos, utilizando un combustible de horno, en otra cosa. +Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Use el horno para abrir el menú del horno. Coloque un combustible de horno en la ranura inferior y el material de origen en la ranura superior. El horno usará lentamente su combustible para fundir el artículo. El resultado se colocará en la ranura de salida en el lado derecho. +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Use el libro de recetas para ver qué puede crear, qué puede usar como combustible y durante cuánto tiempo se quemará. +Burning Furnace=Horno ardiente +Recipe book=Libro de recetas +Inventory=Inventario diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr new file mode 100644 index 00000000..deec7981 --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_furnaces +Furnace=Four +Furnaces cook or smelt several items, using a furnace fuel, into something else.=Les fours cuisent ou fondent plusieurs articles, en utilisant un combustible de four, dans quelque chose d'autre. +Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Utilisez le four pour ouvrir le menu du four. Placez un combustible de four dans la fente inférieure et le matériau source dans la fente supérieure. Le four utilisera lentement son combustible pour fondre l'article. Le résultat sera placé dans la fente de sortie du côté droit. +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Utilisez le livre de recettes pour voir ce que vous pouvez cuire, ce que vous pouvez utiliser comme carburant et combien de temps il brûlera. +Burning Furnace=Four Allumé +Recipe book=Livre de Recette +Inventory=Inventaire +Uses fuel to smelt or cook items=Utilise du carburant pour fondre ou cuire des articles diff --git a/mods/ITEMS/mcl_furnaces/locale/template.txt b/mods/ITEMS/mcl_furnaces/locale/template.txt new file mode 100644 index 00000000..4f88824b --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: mcl_furnaces +Furnace= +Furnaces cook or smelt several items, using a furnace fuel, into something else.= +Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.= +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.= +Burning Furnace= +Recipe book= +Inventory= +Uses fuel to smelt or cook items= diff --git a/mods/ITEMS/mcl_furnaces/textures/crafting_inventory_furnace.png b/mods/ITEMS/mcl_furnaces/textures/crafting_inventory_furnace.png deleted file mode 100644 index f8191ffd..00000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/crafting_inventory_furnace.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_bottom.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_bottom.png index 7844072d..c8efce2f 100644 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_bottom.png and b/mods/ITEMS/mcl_furnaces/textures/default_furnace_bottom.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_front_active.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_front_active.png index c425604d..3b6e1056 100644 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_front_active.png and b/mods/ITEMS/mcl_furnaces/textures/default_furnace_front_active.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_side.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_side.png index c154414b..2c364db5 100644 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_side.png and b/mods/ITEMS/mcl_furnaces/textures/default_furnace_side.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_top.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_top.png index 7844072d..c8efce2f 100644 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_top.png and b/mods/ITEMS/mcl_furnaces/textures/default_furnace_top.png differ diff --git a/mods/ITEMS/mcl_heads/README.txt b/mods/ITEMS/mcl_heads/README.txt deleted file mode 100644 index 96eb30d8..00000000 --- a/mods/ITEMS/mcl_heads/README.txt +++ /dev/null @@ -1,4 +0,0 @@ -All textures from Faithful Vanilla texture pack. - -The mcl_heads_* texture were created by kingoscargames, -based on aforementioned texture pack. diff --git a/mods/ITEMS/mcl_heads/depends.txt b/mods/ITEMS/mcl_heads/depends.txt index 3d96266d..01846722 100644 --- a/mods/ITEMS/mcl_heads/depends.txt +++ b/mods/ITEMS/mcl_heads/depends.txt @@ -1 +1,4 @@ mcl_sounds +mcl_armor? +screwdriver? +doc? diff --git a/mods/ITEMS/mcl_heads/description.txt b/mods/ITEMS/mcl_heads/description.txt index c3a38bb7..b169ba79 100644 --- a/mods/ITEMS/mcl_heads/description.txt +++ b/mods/ITEMS/mcl_heads/description.txt @@ -1 +1 @@ -Small decorational head blocks. +Small decorative head blocks. diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index 524526b5..cb83ed1f 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -1,20 +1,49 @@ +local S = minetest.get_translator("mcl_heads") + +local mod_doc = minetest.get_modpath("doc") +local mod_screwdriver = minetest.get_modpath("screwdriver") + +local equip_armor +if minetest.get_modpath("mcl_armor") then + equip_armor = armor.on_armor_use +end + -- Heads system -local function addhead(name, texture, desc, longdesc) +local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) + local on_rotate_floor, on_rotate_wall + if mod_screwdriver then + on_rotate_floor = function(pos, node, user, mode, new_param2) + if mode == screwdriver.ROTATE_AXIS then + node.name = node.name .. "_wall" + node.param2 = minetest.dir_to_wallmounted(minetest.facedir_to_dir(node.param2)) + minetest.set_node(pos, node) + return true + end + end + on_rotate_wall = function(pos, node, user, mode, new_param2) + if mode == screwdriver.ROTATE_AXIS then + node.name = string.sub(node.name, 1, string.len(node.name)-5) + node.param2 = minetest.dir_to_facedir(minetest.wallmounted_to_dir(node.param2)) + minetest.set_node(pos, node) + return true + end + end + end + minetest.register_node("mcl_heads:"..name, { description = desc, _doc_items_longdesc = longdesc, - drawtype = "nodebox", + drawtype = "nodebox", is_ground_content = false, node_box = { type = "fixed", - fixed = { - { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }, + fixed = { + { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }, }, }, groups = {handy=1, armor_head=1,non_combat_armor=1, head=1, deco_block=1, dig_by_piston=1}, -- The head textures are based off the textures of an actual mob. - -- FIXME: This code assumes 16×16 textures for the mob textures! tiles = { -- Note: bottom texture is overlaid over top texture to get rid of possible transparency. -- This is required for skeleton skull and wither skeleton skull. @@ -24,7 +53,7 @@ local function addhead(name, texture, desc, longdesc) "[combine:16x16:4,0="..texture, -- right "[combine:16x16:-20,0="..texture, -- back "[combine:16x16:-4,0="..texture, -- front - }, + }, paramtype = "light", stack_max = 64, paramtype2 = "facedir", @@ -37,15 +66,99 @@ local function addhead(name, texture, desc, longdesc) sounds = mcl_sounds.node_sound_defaults({ footstep = {name="default_hard_footstep", gain=0.3} }), - _mcl_blast_resistance = 5, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + -- no interaction possible with entities, for now. + return itemstack + end + + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + if not def then return itemstack end + + -- Call on_rightclick if the pointed node defines it + if placer and not placer: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(under, node, placer, itemstack) or itemstack + end + end + + local above = pointed_thing.above + local diff = {x = under.x - above.x, y = under.y - above.y, z = under.z - above.z} + local wdir = minetest.dir_to_wallmounted(diff) + + local itemstring = itemstack:get_name() + local fakestack = ItemStack(itemstack) + local idef = fakestack:get_definition() + local retval + if wdir == 0 or wdir == 1 then + return minetest.item_place(itemstack, placer, pointed_thing) + else + retval = fakestack:set_name("mcl_heads:"..name.."_wall") + end + if not retval then + return itemstack + end + + local success + itemstack, success = minetest.item_place(fakestack, placer, pointed_thing, wdir) + itemstack:set_name(itemstring) + return itemstack + end, + on_secondary_use = equip_armor, + + on_rotate = on_rotate_floor, + + _mcl_armor_mob_range_mob = rangemob, + _mcl_armor_mob_range_factor = rangefactor, + _mcl_blast_resistance = 1, _mcl_hardness = 1, }) + + minetest.register_node("mcl_heads:"..name.."_wall", { + _doc_items_create_entry = false, + drawtype = "nodebox", + is_ground_content = false, + node_box = { + type = "wallmounted", + wall_bottom = { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }, + wall_top = { -0.25, 0.0, -0.25, 0.25, 0.5, 0.25, }, + wall_side = { -0.5, -0.25, -0.25, 0.0, 0.25, 0.25, }, + }, + groups = {handy=1, head=1, deco_block=1, dig_by_piston=1, not_in_creative_inventory=1}, + -- The head textures are based off the textures of an actual mob. + tiles = { + { name = "[combine:16x16:-4,-4="..texture, align_style = "world" }, -- front + { name = "[combine:16x16:-20,-4="..texture, align_style = "world" }, -- back + { name = "[combine:16x16:-8,-4="..texture, align_style = "world" }, -- left + { name = "[combine:16x16:0,-4="..texture, align_style = "world" }, -- right + { name = "([combine:16x16:-4,0="..texture..")^[transformR180", align_style = "node" }, -- top + { name = "([combine:16x16:-4,8="..texture..")^([combine:16x16:-12,8="..texture..")", align_style = "node" }, -- bottom + }, + paramtype = "light", + stack_max = 64, + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = true, + sounds = mcl_sounds.node_sound_defaults({ + footstep = {name="default_hard_footstep", gain=0.3} + }), + drop = "mcl_heads:"..name, + on_rotate = on_rotate_wall, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + }) + + if mod_doc then + doc.add_entry_alias("nodes", "mcl_heads:" .. name, "nodes", "mcl_heads:" .. name .. "_wall") + end end -- Add heads -addhead("zombie", "mobs_mc_zombie.png", "Zombie Head", "A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.") -addhead("creeper", "mobs_mc_creeper.png", "Creeper Head", "A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.") +addhead("zombie", "mcl_heads_zombie_node.png", S("Zombie Head"), S("A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%."), "mobs_mc:zombie", 0.5) +addhead("creeper", "mcl_heads_creeper_node.png", S("Creeper Head"), S("A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%."), "mobs_mc:creeper", 0.5) -- Original Minecraft name: “Head” -addhead("steve", "character.png", "Human Head", "A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.") -addhead("skeleton", "mobs_mc_skeleton.png", "Skeleton Skull", "A skeleton skull is a small decorative block which resembles the head of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.") -addhead("wither_skeleton", "mobs_mc_wither_skeleton.png", "Wither Skeleton Skull", "A wither skeleton skull is a small decorative block which resembles the head of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.") +addhead("steve", "mcl_heads_steve_node.png", S("Human Head"), S("A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.")) +addhead("skeleton", "mcl_heads_skeleton_node.png", S("Skeleton Skull"), S("A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%."), "mobs_mc:skeleton", 0.5) +addhead("wither_skeleton", "mcl_heads_wither_skeleton_node.png", S("Wither Skeleton Skull"), S("A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.")) diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr new file mode 100644 index 00000000..75e92aef --- /dev/null +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_heads +Zombie Head=Zombiekopf +A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Ein Zombiekopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Zombies aussieht. Er kann auch als Helm getragen werden, was den Erkennungsradius von Zombies um 50% verringert. +Creeper Head=Creeper-Kopf +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Ein Creeperkopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Creepers aussieht. Er kann auch als Helm getragen werden, was den Erkennungsradius von Creepern um 50% verringert. +Human Head=Menschenkopf +A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Ein Menschenkopf ist ein kleiner dekorativer Block, der so wie der Kopf eines Menschen (das heißt, einer Spielerfigur) aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. +Skeleton Skull=Skelettschädel +A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%.=Ein Skelettschädel ist ein kleiner dekorativer Block, der so wie ein Schädel eines Skeletts aussieht. Er kann auch als Helm getragen werden, was den Erkennungsradius von Skeletten um 50% verringert. +Wither Skeleton Skull=Witherskelettschädel +A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Ein Witherskelettschädel ist ein kleiner dekorativer Block, der so wie ein Schädel eines Witherskeletts aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.es.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.es.tr new file mode 100644 index 00000000..308dd8b2 --- /dev/null +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.es.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_heads +Zombie Head=Cabeza de zombie +A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza de zombie es un pequeño bloque decorativo que se asemeja a la cabeza de un zombie. También se puede usar como casco por diversión, pero no ofrece ninguna protección. +Creeper Head=Cabeza de creeper +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza de creeper es un pequeño bloque decorativo que se asemeja a la cabeza de un creeper. También se puede usar como casco por diversión, pero no ofrece ninguna protección. +Human Head=Cabeza humana +A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza humana es un pequeño bloque decorativo que se asemeja a la cabeza de un humano (es decir, un personaje jugador). También se puede usar como casco por diversión, pero no ofrece ninguna protección. +Skeleton Skull=Calavera de esqueleto +A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza de esqueleto es un pequeño bloque decorativo que se asemeja al cráneo de un esqueleto. También se puede usar como casco por diversión, pero no ofrece ninguna protección. +Wither Skeleton Skull=Calavera de esqueleto Wither +A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza de esqueleto marchito es un pequeño bloque decorativo que se asemeja al cráneo de un esqueleto marchito. También se puede usar como casco por diversión, pero no ofrece ninguna protección. diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.fr.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.fr.tr new file mode 100644 index 00000000..56436f51 --- /dev/null +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.fr.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_heads +Zombie Head=Tête de Zombie +A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Une tête de zombie est un petit bloc décoratif qui ressemble à la tête d'un zombie. Il peut également être porté comme un casque, ce qui réduit la plage de détection des zombies de 50%. +Creeper Head=Tête de Creeper +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Une tête de creepers est un petit bloc décoratif qui ressemble à la tête d'un creeper. Il peut également être porté comme un casque, ce qui réduit la plage de détection des creepers de 50%. +Human Head=Tête de Joueur +A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Une tête de joueur est un petit bloc décoratif qui ressemble à la tête d'un humain (c'est-à-dire un personnage de joueur). Il peut également être porté comme un casque pour le plaisir, mais n'offre aucune protection. +Skeleton Skull=Crâne de Squelette +A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%.=Un crâne squelette est un petit bloc décoratif qui ressemble au crâne d'un squelette. Il peut également être porté comme un casque, ce qui réduit la plage de détection des squelettes de 50%. +Wither Skeleton Skull=Crâne de Squelette Wither +A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Un crâne squelette wither est un petit bloc décoratif qui ressemble au crâne d'un squelette wither. Il peut également être porté comme un casque pour le plaisir, mais n'offre aucune protection. diff --git a/mods/ITEMS/mcl_heads/locale/template.txt b/mods/ITEMS/mcl_heads/locale/template.txt new file mode 100644 index 00000000..27a4513a --- /dev/null +++ b/mods/ITEMS/mcl_heads/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: mcl_heads +Zombie Head= +A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%. +Creeper Head= +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%. +Human Head= +A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.= +Skeleton Skull= +A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%. +Wither Skeleton Skull= +A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.= diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_creeper_node.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_creeper_node.png new file mode 100644 index 00000000..99b432ac Binary files /dev/null and b/mods/ITEMS/mcl_heads/textures/mcl_heads_creeper_node.png differ diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_skeleton_node.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_skeleton_node.png new file mode 100644 index 00000000..0af86cd6 Binary files /dev/null and b/mods/ITEMS/mcl_heads/textures/mcl_heads_skeleton_node.png differ diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_steve_node.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_steve_node.png new file mode 100644 index 00000000..8bf839e7 Binary files /dev/null and b/mods/ITEMS/mcl_heads/textures/mcl_heads_steve_node.png differ diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton.png index 15c33350..2e02a81a 100644 Binary files a/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton.png and b/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton.png differ diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_node.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_node.png new file mode 100644 index 00000000..671f4054 Binary files /dev/null and b/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_node.png differ diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_preview.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_preview.png index e6ed59b9..dbc9b362 100644 Binary files a/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_preview.png and b/mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_preview.png differ diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_zombie_node.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_zombie_node.png new file mode 100644 index 00000000..ef85701e Binary files /dev/null and b/mods/ITEMS/mcl_heads/textures/mcl_heads_zombie_node.png differ diff --git a/mods/ITEMS/mcl_hoppers/depends.txt b/mods/ITEMS/mcl_hoppers/depends.txt index 22e30070..67a60d4d 100644 --- a/mods/ITEMS/mcl_hoppers/depends.txt +++ b/mods/ITEMS/mcl_hoppers/depends.txt @@ -1,4 +1,6 @@ mcl_core +mcl_formspec mcl_sounds mcl_util doc? +screwdriver? diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 5a3188b6..52cb6087 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -1,37 +1,33 @@ +local S = minetest.get_translator("mcl_hoppers") - -local chest = minetest.get_content_id("mcl_chests:chest") +--[[ BEGIN OF NODE DEFINITIONS ]] local mcl_hoppers_formspec = "size[9,7]".. - "background[-0.19,-0.25;9.41,10.48;mcl_hoppers_inventory.png]".. - mcl_vars.inventory_header.. + "label[2,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Hopper"))).."]".. "list[current_name;main;2,0.5;5,1;]".. + mcl_formspec.get_itemslot_bg(2,0.5,5,1).. + "label[0,2;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,2.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,2.5,9,3).. "list[current_player;main;0,5.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,5.74,9,1).. "listring[current_name;main]".. "listring[current_player;main]" -minetest.register_node("mcl_hoppers:hopper", { - description = "Hopper", - inventory_image = "mcl_hoppers_item.png", - _doc_items_longdesc = [[Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempts to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers. +-- Downwards hopper (base definition) -Hoppers interact with containers the following way: -• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers put items into the fuel slot -• Ender chests: Hoppers don't interact with ender chests -• Other containers: Hoppers interact with them normally]], - _doc_items_usagehelp = "To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Remember you can place at usable blocks (such as chests) with sneak + right-click. The hopper will keep its orientation when the blocks around it are changed. To access the hopper's inventory, rightclick it.", +local def_hopper = { + inventory_image = "mcl_hoppers_item.png", wield_image = "mcl_hoppers_item.png", - groups = {pickaxey=1, container=2,deco_block=1,}, + groups = {pickaxey=1, container=2,deco_block=1,hopper=1}, drawtype = "nodebox", paramtype = "light", - sunlight_propagates = true, - tiles = {"mcl_hoppers_hopper_inside.png^mcl_hoppers_hopper_top.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_inside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png"}, - selection_box = {type="regular"}, + -- FIXME: mcl_hoppers_hopper_inside.png is unused by hoppers. + tiles = {"mcl_hoppers_hopper_inside.png^mcl_hoppers_hopper_top.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png"}, node_box = { - type = "fixed", - fixed = { + type = "fixed", + fixed = { --funnel walls {-0.5, 0.0, 0.4, 0.5, 0.5, 0.5}, {0.4, 0.0, -0.5, 0.5, 0.5, 0.5}, @@ -42,8 +38,18 @@ Hoppers interact with containers the following way: --spout {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, {-0.1, -0.3, -0.1, 0.1, -0.5, 0.1}, - }, }, + }, + selection_box = { + type = "fixed", + fixed = { + --funnel + {-0.5, 0.0, -0.5, 0.5, 0.5, 0.5}, + --spout + {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, + {-0.1, -0.3, -0.1, 0.1, -0.5, 0.1}, + }, + }, is_ground_content = false, on_construct = function(pos) @@ -53,56 +59,6 @@ Hoppers interact with containers the following way: inv:set_size("main", 5) end, - on_place = function(itemstack, placer, pointed_thing) - local upos = pointed_thing.under - local apos = pointed_thing.above - - local uposnode = minetest.get_node(upos) - local uposnodedef = minetest.registered_nodes[uposnode.name] - if not uposnodedef then return itemstack end - -- Use pointed node's on_rightclick function first, if present - if placer and not placer:get_player_control().sneak then - if uposnodedef and uposnodedef.on_rightclick then - return uposnodedef.on_rightclick(pointed_thing.under, uposnode, placer, itemstack) or itemstack - end - end - - local bpos - if uposnodedef.buildable_to then - bpos = upos - else - local aposnodedef = minetest.registered_nodes[minetest.get_node(apos).name] - if not aposnodedef then return itemstack end - if aposnodedef.buildable_to then - bpos = apos - end - end - - if bpos == nil then - return itemstack - end - - local x = upos.x - apos.x - local y = upos.y - apos.y - local z = upos.z - apos.z - - if x == -1 then - minetest.set_node(bpos, {name="mcl_hoppers:hopper_side", param2=0}) - elseif x == 1 then - minetest.set_node(bpos, {name="mcl_hoppers:hopper_side", param2=2}) - elseif z == -1 then - minetest.set_node(bpos, {name="mcl_hoppers:hopper_side", param2=3}) - elseif z == 1 then - minetest.set_node(bpos, {name="mcl_hoppers:hopper_side", param2=1}) - else - minetest.set_node(bpos, {name="mcl_hoppers:hopper", param2=0}) - end - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end - return itemstack - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) local meta2 = meta @@ -117,37 +73,149 @@ Hoppers interact with containers the following way: end meta:from_table(meta2:to_table()) end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in mcl_hoppers at "..minetest.pos_to_string(pos)) end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) + on_metadata_inventory_put = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name().. " moves stuff to mcl_hoppers at "..minetest.pos_to_string(pos)) end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) + on_metadata_inventory_take = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name().. " takes stuff from mcl_hoppers at "..minetest.pos_to_string(pos)) end, sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 24, - _mcl_hardness = 3, -}) -minetest.register_node("mcl_hoppers:hopper_side", { - description = "Hopper (Side)", + _mcl_blast_resistance = 4.8, + _mcl_hardness = 3, +} + +-- Redstone variants (on/off) of downwards hopper. +-- Note a hopper is enabled when it is *not* supplied with redstone power and disabled when it is supplied with redstone power. + +-- Enabled downwards hopper +local def_hopper_enabled = table.copy(def_hopper) +def_hopper_enabled.description = S("Hopper") +def_hopper_enabled._tt_help = S("5 inventory slots").."\n"..S("Collects items from above, moves items to container below").."\n"..S("Can be disabled with redstone power") +def_hopper_enabled._doc_items_longdesc = S("Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.").."\n\n".. + +S("Hoppers interact with containers the following way:").."\n".. +S("• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot").."\n".. +S("• Ender chests: No interaction.").."\n".. +S("• Other containers: Normal interaction.").."\n\n".. + +S("Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.") +def_hopper_enabled._doc_items_usagehelp = S("To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.") +def_hopper_enabled.on_place = function(itemstack, placer, pointed_thing) + local upos = pointed_thing.under + local apos = pointed_thing.above + + local uposnode = minetest.get_node(upos) + local uposnodedef = minetest.registered_nodes[uposnode.name] + if not uposnodedef then return itemstack end + -- Use pointed node's on_rightclick function first, if present + if placer and not placer:get_player_control().sneak then + if uposnodedef and uposnodedef.on_rightclick then + return uposnodedef.on_rightclick(pointed_thing.under, uposnode, placer, itemstack) or itemstack + end + end + + local x = upos.x - apos.x + local z = upos.z - apos.z + + local fake_itemstack = ItemStack(itemstack) + local newnode, param2 + if x == -1 then + fake_itemstack:set_name("mcl_hoppers:hopper_side") + param2 = 0 + elseif x == 1 then + fake_itemstack:set_name("mcl_hoppers:hopper_side") + param2 = 2 + elseif z == -1 then + fake_itemstack:set_name("mcl_hoppers:hopper_side") + param2 = 3 + elseif z == 1 then + fake_itemstack:set_name("mcl_hoppers:hopper_side") + param2 = 1 + end + local itemstack, success = minetest.item_place_node(fake_itemstack, placer, pointed_thing, param2) + itemstack:set_name("mcl_hoppers:hopper") + return itemstack +end +def_hopper_enabled.mesecons = { + effector = { + action_on = function(pos, node) + minetest.swap_node(pos, {name="mcl_hoppers:hopper_disabled", param2=node.param2}) + end, + }, +} + +minetest.register_node("mcl_hoppers:hopper", def_hopper_enabled) + +-- Disabled downwards hopper +local def_hopper_disabled = table.copy(def_hopper) +def_hopper_disabled.description = S("Disabled Hopper") +def_hopper_disabled.inventory_image = nil +def_hopper_disabled._doc_items_create_entry = false +def_hopper_disabled.groups.not_in_creative_inventory = 1 +def_hopper_disabled.drop = "mcl_hoppers:hopper" +def_hopper_disabled.mesecons = { + effector = { + action_off = function(pos, node) + minetest.swap_node(pos, {name="mcl_hoppers:hopper", param2=node.param2}) + end, + }, +} + +minetest.register_node("mcl_hoppers:hopper_disabled", def_hopper_disabled) + + + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple +end + +-- Sidewars hopper (base definition) +local def_hopper_side = { _doc_items_create_entry = false, drop = "mcl_hoppers:hopper", - groups = {pickaxey=1, container=2,not_in_creative_inventory=1}, + groups = {pickaxey=1, container=2,not_in_creative_inventory=1,hopper=2}, drawtype = "nodebox", paramtype = "light", - sunlight_propagates = true, paramtype2 = "facedir", - tiles = {"mcl_hoppers_hopper_inside.png^mcl_hoppers_hopper_top.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_inside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png"}, - selection_box = {type="regular"}, + tiles = {"mcl_hoppers_hopper_inside.png^mcl_hoppers_hopper_top.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png"}, node_box = { - type = "fixed", - fixed = { + type = "fixed", + fixed = { --funnel walls {-0.5, 0.0, 0.4, 0.5, 0.5, 0.5}, {0.4, 0.0, -0.5, 0.5, 0.5, 0.5}, @@ -158,8 +226,18 @@ minetest.register_node("mcl_hoppers:hopper_side", { --spout {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, {-0.5, -0.3, -0.1, 0.1, -0.1, 0.1}, - }, }, + }, + selection_box = { + type = "fixed", + fixed = { + --funnel + {-0.5, 0.0, -0.5, 0.5, 0.5, 0.5}, + --spout + {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, + {-0.5, -0.3, -0.1, 0.1, -0.1, 0.1}, + }, + }, is_ground_content = false, on_construct = function(pos) @@ -183,22 +261,77 @@ minetest.register_node("mcl_hoppers:hopper_side", { end meta:from_table(meta2:to_table()) end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in mcl_hoppers at "..minetest.pos_to_string(pos)) end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) + on_metadata_inventory_put = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name().. " moves stuff to mcl_hoppers at "..minetest.pos_to_string(pos)) end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) + on_metadata_inventory_take = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name().. " takes stuff from mcl_hoppers at "..minetest.pos_to_string(pos)) end, + on_rotate = on_rotate, sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 24, + + _mcl_blast_resistance = 4.8, _mcl_hardness = 3, -}) +} + +local def_hopper_side_enabled = table.copy(def_hopper_side) +def_hopper_side_enabled.description = S("Side Hopper") +def_hopper_side_enabled.mesecons = { + effector = { + action_on = function(pos, node) + minetest.swap_node(pos, {name="mcl_hoppers:hopper_side_disabled", param2=node.param2}) + end, + }, +} +minetest.register_node("mcl_hoppers:hopper_side", def_hopper_side_enabled) + +local def_hopper_side_disabled = table.copy(def_hopper_side) +def_hopper_side_disabled.description = S("Disabled Side Hopper") +def_hopper_side_disabled.mesecons = { + effector = { + action_off = function(pos, node) + minetest.swap_node(pos, {name="mcl_hoppers:hopper_side", param2=node.param2}) + end, + }, +} +minetest.register_node("mcl_hoppers:hopper_side_disabled", def_hopper_side_disabled) + +--[[ END OF NODE DEFINITIONS ]] + +--[[ BEGIN OF ABM DEFINITONS ]] -- Make hoppers suck in dropped items minetest.register_abm({ @@ -222,7 +355,7 @@ minetest.register_abm({ -- Item must get sucked in when the item just TOUCHES the block above the hopper -- This is the reason for the Y calculation. -- Test: Items on farmland and slabs get sucked, but items on full blocks don't - local posob = object:getpos() + local posob = object:get_pos() local posob_miny = posob.y + object:get_properties().collisionbox[2] if math.abs(posob.x-pos.x) <= 0.5 and (posob_miny-pos.y < 1.5 and posob.y-pos.y >= 0.3) then inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) @@ -311,7 +444,15 @@ minetest.register_abm({ local abovenode = minetest.get_node(above) if not minetest.registered_nodes[abovenode.name] then return end local g = minetest.registered_nodes[abovenode.name].groups.container - mcl_util.move_item_container(above, pos) + local sucked = mcl_util.move_item_container(above, pos) + + -- Also suck in non-fuel items from furnace fuel slot + if not sucked and g == 4 then + local finv = minetest.get_inventory({type="node", pos=above}) + if finv and not mcl_util.is_fuel(finv:get_stack("fuel", 1)) then + mcl_util.move_item_container(above, pos, "fuel") + end + end -- Move an item from the hopper into the container to which the hopper points to local g = minetest.registered_nodes[frontnode.name].groups.container @@ -345,3 +486,14 @@ end -- Legacy minetest.register_alias("mcl_hoppers:hopper_item", "mcl_hoppers:hopper") + +minetest.register_lbm({ + label = "Update hopper formspecs (0.60.0", + name = "mcl_hoppers:update_formspec_0_60_0", + nodenames = { "group:hopper" }, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", mcl_hoppers_formspec) + end, +}) diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr new file mode 100644 index 00000000..f0cc90d2 --- /dev/null +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_hoppers +Hopper=Trichter +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Trichter sind Behälter mit 5 Inventarplätzen. Sie sammeln fallengelassene Gegenstände oberhalb auf, nehmen sich Gegenstände von einem Behälter oberhalb auf und versuchen, ihren Inhalt in einen benachbarten Behälter zu befördern. Trichter können entweder nach unten oder zur Seite zeigen. Trichter interagieren mit Truhen, Spendern, Werfern, Schulkerkisten, Öfen und Trichtern. +Hoppers interact with containers the following way:=Trichter interagieren mit Behältern auf diese Weise: +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Öfen: Trichter von oberhalb werden Gegenstände in den Quellplatz befördern. Trichter von unterhalb werden Gegenstände aus dem Ausgabeplatz nehmen. Sie werden Gegenstände auch aus dem Brennstoffplatz nehmen, wenn sie als Brennstoff ungeeignet sind. Seitwärtstrichter, die zum Ofen zeigen, befördern Gegenstände in den Brennstoffplatz. +• Ender chests: No interaction.=• Endertruhen: Keine Interaktion. +• Other containers: Normal interaction.=• Andere Behälter: Normale Interaktion. +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Trichter können deaktiviert werden, wenn sie mit Redstone-Energie versorgt werden. Deaktivierte Trichter bewegen keine Gegenstände. +To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=Um einen Trichter vertikal zu platzieren, platzieren Sie ihn auf den Boden oder an die Decke. Um ihn seitwärts zu platzieren, platzieren Sie in an die Seite eines Blocks. Der Trichter wird seine Ausrichtung behalten. Benutzen Sie den Trichter, um auf sein Inventar zuzugreifen. +Disabled Hopper=Deaktivierter Trichter +Side Hopper=Seitwärtstrichter +Disabled Side Hopper=Deaktivierter Seitwärtstrichter +Inventory=Inventar +5 inventory slots=5 Inventarplätze +Collects items from above, moves items to container below=Sammelt Gegenstände von oben, legt Gegenstände in Behälter unterhalb ab +Can be disabled with redstone power=Kann mit Redstoneenergie deaktiviert werden diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.es.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.es.tr new file mode 100644 index 00000000..3f819ca9 --- /dev/null +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.es.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_hoppers +Hopper=Tolva +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Las tolvas son contenedores con 5 ranuras de inventario. Recogen los artículos que se cayeron desde arriba, toman los artículos de un contenedor de arriba e intentan colocarlos en un contenedor adyacente. Las tolvas pueden ir hacia abajo o hacia los lados. Las tolvas interactúan con cofres, goteros, dispensadores, cajas de shulker, hornos y tolvas. +Hoppers interact with containers the following way:=Las tolvas interactúan con los contenedores de la siguiente manera: +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Hornos: las tolvas de arriba colocarán elementos en la ranura de origen. Las tolvas de abajo toman artículos de la ranura de salida. También toman artículos de la ranura de combustible cuando no se pueden usar como combustible. Las tolvas laterales que apuntan al horno colocan elementos en la ranura de combustible +• Ender chests: No interaction.=• Cofres Ender: Sin interacción. +• Other containers: Normal interaction.=• Otros contenedores: interacción normal. +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Las tolvas se pueden desactivar cuando se les suministra energía de redstone. Las tolvas deshabilitadas no mueven artículos. +To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=Para colocar una tolva verticalmente, colóquela en el suelo o en el techo. Para colocarlo de lado, colóquelo al lado de un bloque. Use la tolva para acceder a su inventario. +Disabled Hopper=Tolva desactivada +Side Hopper=Tolva lateral +Disabled Side Hopper=Tolva lateral desactivada +Inventory=Inventario diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr new file mode 100644 index 00000000..40795d09 --- /dev/null +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_hoppers +Hopper=Entonnoir +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Les entonoirs sont des conteneurs avec 5 emplacements d'inventaire. Ils récupèrent les objets déposés par le haut, prennent les objets d'un conteneur au-dessus et tentent de les placer dans un conteneur adjacent. Les entonnoirs peuvent aller vers le bas ou sur le côté. Les entonnoirs interagissent avec les coffres, les compte-gouttes, les distributeurs, les boites de shulker, les fours et les entonnoirs. +Hoppers interact with containers the following way:=Les entonnoirs interagissent avec les conteneurs de la manière suivante: +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Fours: les entonoires d'en haut placent les objets dans l'emplacement source. Les entonoires d'en bas prennent les éléments de la fente de sortie. Ils prennent également des objets de la fente de carburant lorsqu'ils ne peuvent pas être utilisés comme carburant. Des entonaires latérales qui pointent vers le four mettent des objets dans la fente de combustible +• Ender chests: No interaction.=• Coffres Ender: Aucune interaction. +• Other containers: Normal interaction.=• Autres conteneurs: interaction normale. +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Les entonoires peuvent être désactivées lorsqu'elles sont alimentées en redstone. Les trémies désactivées ne déplacent pas les objets. +To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=Pour placer un entonoire verticalement, placez-la au sol ou au plafond. Pour le placer sur le côté, placez-le sur le côté d'un bloc. Utilisez l'entonoire pour accéder à son inventaire. +Disabled Hopper=Entonoir Désactivé +Side Hopper=Entonoir Latéral +Disabled Side Hopper=Entonoir Latéral Désactivé +Inventory=Inventaire +5 inventory slots=5 emplacements d'inventaire +Collects items from above, moves items to container below=Collecte les éléments d'en haut, déplace les éléments vers le conteneur ci-dessous +Can be disabled with redstone power=Peut être désactivé par la puissance Redstone diff --git a/mods/ITEMS/mcl_hoppers/locale/template.txt b/mods/ITEMS/mcl_hoppers/locale/template.txt new file mode 100644 index 00000000..bc614d47 --- /dev/null +++ b/mods/ITEMS/mcl_hoppers/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: mcl_hoppers +Hopper= +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.= +Hoppers interact with containers the following way:= +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot= +• Ender chests: No interaction.= +• Other containers: Normal interaction.= +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.= +To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.= +Disabled Hopper= +Side Hopper= +Disabled Side Hopper= +Inventory= +5 inventory slots= +Collects items from above, moves items to container below= +Can be disabled with redstone power= diff --git a/mods/ITEMS/mcl_hoppers/textures/mcl_hoppers_hopper_top.png b/mods/ITEMS/mcl_hoppers/textures/mcl_hoppers_hopper_top.png index 918e58f5..dbef0750 100644 Binary files a/mods/ITEMS/mcl_hoppers/textures/mcl_hoppers_hopper_top.png and b/mods/ITEMS/mcl_hoppers/textures/mcl_hoppers_hopper_top.png differ diff --git a/mods/ITEMS/mcl_hoppers/textures/mcl_hoppers_inventory.png b/mods/ITEMS/mcl_hoppers/textures/mcl_hoppers_inventory.png deleted file mode 100644 index f4451046..00000000 Binary files a/mods/ITEMS/mcl_hoppers/textures/mcl_hoppers_inventory.png and /dev/null differ diff --git a/mods/ITEMS/itemframes/README.txt b/mods/ITEMS/mcl_itemframes/README.txt similarity index 100% rename from mods/ITEMS/itemframes/README.txt rename to mods/ITEMS/mcl_itemframes/README.txt diff --git a/mods/ITEMS/itemframes/depends.txt b/mods/ITEMS/mcl_itemframes/depends.txt similarity index 60% rename from mods/ITEMS/itemframes/depends.txt rename to mods/ITEMS/mcl_itemframes/depends.txt index 97bf5106..0b5088e3 100644 --- a/mods/ITEMS/itemframes/depends.txt +++ b/mods/ITEMS/mcl_itemframes/depends.txt @@ -1,2 +1,3 @@ mcl_core mcl_sounds +screwdriver? diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua new file mode 100644 index 00000000..b9fa7048 --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -0,0 +1,260 @@ +local S = minetest.get_translator("mcl_itemframes") + +minetest.register_entity("mcl_itemframes:item",{ + hp_max = 1, + visual = "wielditem", + visual_size = {x=0.3,y=0.3}, + physical = false, + pointable = false, + textures = { "empty.png" }, + _texture = "empty.png", + + on_activate = function(self, staticdata) + if staticdata ~= nil and staticdata ~= "" then + local data = staticdata:split(';') + if data and data[1] and data[2] then + self._nodename = data[1] + self._texture = data[2] + end + end + if self._texture ~= nil then + self.object:set_properties({textures={self._texture}}) + end + end, + get_staticdata = function(self) + if self._nodename ~= nil and self._texture ~= nil then + return self._nodename .. ';' .. self._texture + end + return "" + end, + + _update_texture = function(self) + if self._texture ~= nil then + self.object:set_properties({textures={self._texture}}) + end + end, +}) + + +local facedir = {} +facedir[0] = {x=0,y=0,z=1} +facedir[1] = {x=1,y=0,z=0} +facedir[2] = {x=0,y=0,z=-1} +facedir[3] = {x=-1,y=0,z=0} + +local remove_item_entity = function(pos, node) + local objs = nil + if node.name == "mcl_itemframes:item_frame" then + objs = minetest.get_objects_inside_radius(pos, .5) + end + if objs then + for _, obj in ipairs(objs) do + if obj and obj:get_luaentity() and obj:get_luaentity().name == "mcl_itemframes:item" then + obj:remove() + end + end + end +end + +local update_item_entity = function(pos, node, param2) + remove_item_entity(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local item = inv:get_stack("main", 1) + if not item:is_empty() then + if not param2 then + param2 = node.param2 + end + if node.name == "mcl_itemframes:item_frame" then + local posad = facedir[param2] + pos.x = pos.x + posad.x*6.5/16 + pos.y = pos.y + posad.y*6.5/16 + pos.z = pos.z + posad.z*6.5/16 + end + local e = minetest.add_entity(pos, "mcl_itemframes:item") + local lua = e:get_luaentity() + lua._nodename = node.name + if item:get_name() == "" then + lua._texture = "blank.png" + else + lua._texture = item:get_name() + end + lua:_update_texture() + if node.name == "mcl_itemframes:item_frame" then + local yaw = math.pi*2 - param2 * math.pi/2 + e:set_yaw(yaw) + end + end +end + +local drop_item = function(pos, node, meta) + if node.name == "mcl_itemframes:item_frame" and not minetest.settings:get_bool("creative_mode") then + local inv = meta:get_inventory() + local item = inv:get_stack("main", 1) + if not item:is_empty() then + minetest.add_item(pos, item) + end + end + meta:set_string("infotext", "") + remove_item_entity(pos, node) +end + +minetest.register_node("mcl_itemframes:item_frame",{ + description = S("Item Frame"), + _tt_help = S("Can hold an item"), + _doc_items_longdesc = S("Item frames are decorative blocks in which items can be placed."), + _doc_items_usagehelp = S("Just place any item on the item frame. Use the item frame again to retrieve the item."), + drawtype = "mesh", + is_ground_content = false, + mesh = "mcl_itemframes_itemframe1facedir.obj", + selection_box = { type = "fixed", fixed = {-6/16, -6/16, 7/16, 6/16, 6/16, 0.5} }, + collision_box = { type = "fixed", fixed = {-6/16, -6/16, 7/16, 6/16, 6/16, 0.5} }, + tiles = {"mcl_itemframes_itemframe_background.png", "mcl_itemframes_itemframe_background.png", "mcl_itemframes_itemframe_background.png", "mcl_itemframes_itemframe_background.png", "default_wood.png", "mcl_itemframes_itemframe_background.png"}, + inventory_image = "mcl_itemframes_item_frame.png", + wield_image = "mcl_itemframes_item_frame.png", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + groups = { dig_immediate=3,deco_block=1,dig_by_piston=1,container=7 }, + sounds = mcl_sounds.node_sound_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 1) + end, + on_rightclick = function(pos, node, clicker, itemstack) + if not itemstack then + return + end + local pname = clicker:get_player_name() + if minetest.is_protected(pos, pname) then + minetest.record_protection_violation(pos, pname) + return + end + local meta = minetest.get_meta(pos) + drop_item(pos, node, meta) + local inv = meta:get_inventory() + if itemstack:is_empty() then + remove_item_entity(pos, node) + meta:set_string("infotext", "") + inv:set_stack("main", 1, "") + return itemstack + end + local put_itemstack = ItemStack(itemstack) + put_itemstack:set_count(1) + inv:set_stack("main", 1, put_itemstack) + update_item_entity(pos, node) + -- Add node infotext when item has been named + local imeta = itemstack:get_meta() + local iname = imeta:get_string("name") + if iname then + meta:set_string("infotext", iname) + end + + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + return itemstack + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + drop_item(pos, node, meta) + end, + on_rotate = function(pos, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + -- Rotate face + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + + local objs = nil + if node.name == "mcl_itemframes:item_frame" then + objs = minetest.get_objects_inside_radius(pos, .5) + end + if objs then + for _, obj in ipairs(objs) do + if obj and obj:get_luaentity() and obj:get_luaentity().name == "mcl_itemframes:item" then + update_item_entity(pos, node, (node.param2+1) % 4) + break + end + end + end + return + elseif mode == screwdriver.ROTATE_AXIS then + -- Place screwdriver into itemframe + minetest.registered_nodes["mcl_itemframes:item_frame"].on_rightclick(pos, node, user, ItemStack("screwdriver:screwdriver")) + return false + end + end, +}) + +minetest.register_craft({ + output = 'mcl_itemframes:item_frame', + recipe = { + {'mcl_core:stick', 'mcl_core:stick', 'mcl_core:stick'}, + {'mcl_core:stick', 'mcl_mobitems:leather', 'mcl_core:stick'}, + {'mcl_core:stick', 'mcl_core:stick', 'mcl_core:stick'}, + } +}) + +minetest.register_lbm({ + label = "Update legacy item frames", + name = "mcl_itemframes:update_legacy_item_frames", + nodenames = {"itemframes:frame"}, + action = function(pos, node) + -- Swap legacy node, then respawn entity + node.name = "mcl_itemframes:item_frame" + local meta = minetest.get_meta(pos) + local item = meta:get_string("item") + minetest.swap_node(pos, node) + if item ~= "" then + local itemstack = ItemStack(minetest.deserialize(meta:get_string("itemdata"))) + local inv = meta:get_inventory() + inv:set_size("main", 1) + if not itemstack:is_empty() then + inv:set_stack("main", 1, itemstack) + end + end + update_item_entity(pos, node) + end, +}) + +-- FIXME: Item entities can get destroyed by /clearobjects +minetest.register_lbm({ + label = "Respawn item frame item entities", + name = "mcl_itemframes:respawn_entities", + nodenames = {"mcl_itemframes:item_frame"}, + run_at_every_load = true, + action = function(pos, node) + update_item_entity(pos, node) + end, +}) + +minetest.register_alias("itemframes:frame", "mcl_itemframes:item_frame") diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr new file mode 100644 index 00000000..07d7812f --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_itemframes +Item Frame=Rahmen +Item frames are decorative blocks in which items can be placed.=Rahmen sind dekorative Blöcke, in denen man Gegenstände platzieren kann. +Just place any item on the item frame. Use the item frame again to retrieve the item.=Platzieren Sie einfach einen beliebigen Gegenstand in den Rahmen. Benutzen Sie den Rahmen erneut, um den Gegenstand zurück zu erhalten. +Can hold an item=Kann einen Gegenstand halten diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.es.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.es.tr new file mode 100644 index 00000000..0803234b --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.es.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_itemframes +Item Frame=Marco +Item frames are decorative blocks in which items can be placed.=Los marcos de elementos son bloques decorativos en los que se pueden colocar elementos. +Just place any item on the item frame. Use the item frame again to retrieve the item.=Simplemente coloque cualquier artículo en el marco del artículo. Use el marco del artículo nuevamente para recuperar el artículo. + diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr new file mode 100644 index 00000000..180c5555 --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_itemframes +Item Frame=Cadre +Item frames are decorative blocks in which items can be placed.=Les cadres sont des blocs décoratifs dans lesquels les objets peuvent être placés. +Just place any item on the item frame. Use the item frame again to retrieve the item.=Placez simplement n'importe quel objet sur le cadre. Utilisez à nouveau le cadre décoré pour récupérer l'élément. +Can hold an item=Peut contenir un objet diff --git a/mods/ITEMS/mcl_itemframes/locale/template.txt b/mods/ITEMS/mcl_itemframes/locale/template.txt new file mode 100644 index 00000000..bacbfaa6 --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_itemframes +Item Frame= +Item frames are decorative blocks in which items can be placed.= +Just place any item on the item frame. Use the item frame again to retrieve the item.= +Can hold an item= diff --git a/mods/ITEMS/itemframes/models/itemframes_itemframe1facedir.obj b/mods/ITEMS/mcl_itemframes/models/mcl_itemframes_itemframe1facedir.obj similarity index 100% rename from mods/ITEMS/itemframes/models/itemframes_itemframe1facedir.obj rename to mods/ITEMS/mcl_itemframes/models/mcl_itemframes_itemframe1facedir.obj diff --git a/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_item_frame.png b/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_item_frame.png new file mode 100644 index 00000000..b5ed97ee Binary files /dev/null and b/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_item_frame.png differ diff --git a/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_itemframe_background.png b/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_itemframe_background.png new file mode 100644 index 00000000..236f3630 Binary files /dev/null and b/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_itemframe_background.png differ diff --git a/mods/ITEMS/mcl_jukebox/README.md b/mods/ITEMS/mcl_jukebox/README.md index 7703e4d9..bc261270 100644 --- a/mods/ITEMS/mcl_jukebox/README.md +++ b/mods/ITEMS/mcl_jukebox/README.md @@ -1,22 +1,34 @@ -Jukebox mod for MineClone 2. +# Jukebox mod for MineClone 2. ---- +Based on the `jdukebox` mod by Jordach. This adds a jukebox block and +music disc. Just place a music disc in a jukebox and music starts +to play. And that's it! -Licenced as GPLv3. +## Track list -Based on the jdukebox mod by Jordach. -Music by Jordach, HeroOfTheWinds and Junichi Masuda -(see in-game item tooltip for details). +`mcl_jukebox_track_1.ogg`: “The Evil Sister (Jordach's Mix)” by SoundHelix (CC0) +`mcl_jukebox_track_2.ogg`: “The Energetic Rat (Jordach's Mix)” by SoundHelix (CC0) +`mcl_jukebox_track_3.ogg`: “Eastern Feeling” by Jordach (CC0) +`mcl_jukebox_track_4.ogg`: “Minetest” by Jordach (CC0) +`mcl_jukebox_track_5.ogg`: “Credit Roll (Jordach's HD Mix)” by Junichi Masuda (CC0) +`mcl_jukebox_track_6.ogg`: “Winter Feeling" by Tom Peter (CC BY-SA 3.0) +`mcl_jukebox_track_7.ogg`: “Synthgroove (Jordach's Mix)” by HeroOfTheWinds (CC0) +`mcl_jukebox_track_8.ogg`: “The Clueless Frog (Jordach's Mix)” by SoundHelix (CC0) -`mcl_jukebox_track_6.ogg` -“Winter Feeling”, by Tom Peter -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -Source: +Note: 9 tracks are included. 3 music disc textures are currently unused. +### Sources ---- +* “Winter Feeling”: +* Other tracks: -Textures from Faithful texture pack. +### License -9 tracks are included. -3 music disc textures are currently unused. +Code licenced as GPLv3. Music under individual licenses (see abbreviations +above). Texture license: See main MineClone 2 README.md file. + +See here for the full license texts: + +* CC0: +* CC BY-SA 3.0: +* GPLv3: diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index 7fe4a621..bace6dd2 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_jukebox") + -- Player name-indexed table containing the currently heard track local active_tracks = {} @@ -27,14 +29,14 @@ for r=1, records do local entryname, longdesc, usagehelp if r == 1 then doc = true - entryname = "Music Disc" - longdesc = "A music disc holds a single music track which can be used in a jukebox to play music." - usagehelp = "Rightclick an empty jukebox with the music disc in your hand to play the music. Rightclick the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players." + entryname = S("Music Disc") + longdesc = S("A music disc holds a single music track which can be used in a jukebox to play music.") + usagehelp = S("Place a music dict into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.") end minetest.register_craftitem("mcl_jukebox:record_"..r, { description = - core.colorize("#55FFFF", "Music Disc") .. "\n" .. - core.colorize("#989898", recorddata[r][2] .. "—" .. recorddata[r][1]), + core.colorize("#55FFFF", S("Music Disc")) .. "\n" .. + core.colorize("#989898", S("@1—@2", recorddata[r][2], recorddata[r][1])), _doc_items_create_entry = doc, _doc_items_entry_name = entryname, _doc_items_longdesc = longdesc, @@ -48,7 +50,7 @@ end local function now_playing(player, track_id) local playername = player:get_player_name() local hud = active_huds[playername] - local text = "Now playing: " .. recorddata[track_id][2] .. "—" .. recorddata[track_id][1] + local text = S("Now playing: @1—@2", recorddata[track_id][2], recorddata[track_id][1]) if not hud_sequence_numbers[playername] then hud_sequence_numbers[playername] = 1 @@ -68,12 +70,13 @@ local function now_playing(player, track_id) size = { x=100, y=100}, number = 0x55FFFF, text = text, + z_index = 100, }) active_huds[playername] = id end minetest.after(5, function(tab) - local player = tab[1] - local playername = player:get_player_name() + local playername = tab[1] + local player = minetest.get_player_by_name(playername) local id = tab[2] local seq = tab[3] if not player or not player:is_player() or not active_huds[playername] or not hud_sequence_numbers[playername] or seq ~= hud_sequence_numbers[playername] then @@ -83,7 +86,7 @@ local function now_playing(player, track_id) player:hud_remove(active_huds[playername]) active_huds[playername] = nil end - end, {player, id, hud_sequence_numbers[playername]}) + end, {playername, id, hud_sequence_numbers[playername]}) end @@ -103,15 +106,33 @@ minetest.register_craft({ } }) +local play_record = function(pos, itemstack, player) + local record_id = minetest.get_item_group(itemstack:get_name(), "music_record") + if record_id ~= 0 then + local cname = player:get_player_name() + if active_tracks[cname] ~= nil then + minetest.sound_stop(active_tracks[cname]) + active_tracks[cname] = nil + end + active_tracks[cname] = minetest.sound_play("mcl_jukebox_track_"..record_id, { + to_player = cname, + gain = 1, + }) + now_playing(player, record_id) + return true + end + return false +end -- Jukebox minetest.register_node("mcl_jukebox:jukebox", { - description = "Jukebox", - _doc_items_longdesc = "Jukeboxes play music when they're supplied with a music disc.", - _doc_items_usagehelp = "Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.", + description = S("Jukebox"), + _tt_help = S("Uses music discs to play music"), + _doc_items_longdesc = S("Jukeboxes play music when they're supplied with a music disc."), + _doc_items_usagehelp = S("Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players."), tiles = {"mcl_jukebox_top.png", "mcl_jukebox_side.png", "mcl_jukebox_side.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {handy=1,axey=1, deco_block=1, material_wood=1}, + groups = {handy=1,axey=1, container=7, deco_block=1, material_wood=1, flammable=-1}, is_ground_content = false, on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -121,7 +142,10 @@ minetest.register_node("mcl_jukebox:jukebox", { on_rightclick= function(pos, node, clicker, itemstack, pointed_thing) if not clicker then return end local cname = clicker:get_player_name() - + if minetest.is_protected(pos, cname) then + minetest.record_protection_violation(pos, cname) + return + end local meta = minetest.get_meta(pos) local inv = meta:get_inventory() if not inv:is_empty("main") then @@ -133,7 +157,9 @@ minetest.register_node("mcl_jukebox:jukebox", { local ly = pos.y+1 local lz = pos.z local record = inv:get_stack("main", 1) - minetest.add_item({x=lx, y=ly, z=lz}, record:get_name()) + local dropped_item = minetest.add_item({x=lx, y=ly, z=lz}, record) + -- Rotate record to match with “slot” texture + dropped_item:set_yaw(math.pi/2) inv:set_stack("main", 1, "") if active_tracks[cname] ~= nil then minetest.sound_stop(active_tracks[cname]) @@ -143,23 +169,42 @@ minetest.register_node("mcl_jukebox:jukebox", { end else -- Jukebox is empty: Play track if player holds music record - local record_id = minetest.get_item_group(itemstack:get_name(), "music_record") - if record_id ~= 0 then - if active_tracks[cname] ~= nil then - minetest.sound_stop(active_tracks[cname]) - active_tracks[cname] = nil - end - active_tracks[cname] = minetest.sound_play("mcl_jukebox_track_"..record_id, { - to_player = cname, - --max_hear_distance = 16, - gain = 1, - }) - now_playing(clicker, record_id) - inv:set_stack("main", 1, itemstack:get_name()) + local playing = play_record(pos, itemstack, clicker) + if playing then + local put_itemstack = ItemStack(itemstack) + put_itemstack:set_count(1) + inv:set_stack("main", 1, put_itemstack) itemstack:take_item() - return itemstack end end + return itemstack + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end end, after_dig_node = function(pos, oldnode, oldmetadata, digger) local name = digger:get_player_name() @@ -170,7 +215,9 @@ minetest.register_node("mcl_jukebox:jukebox", { local stack = inv:get_stack("main", 1) if not stack:is_empty() then local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) + local dropped_item = minetest.add_item(p, stack) + -- Rotate record to match with “slot” texture + dropped_item:set_yaw(math.pi/2) if active_tracks[name] ~= nil then minetest.sound_stop(active_tracks[name]) digger:hud_remove(active_huds[name]) @@ -180,7 +227,7 @@ minetest.register_node("mcl_jukebox:jukebox", { end meta:from_table(meta2:to_table()) end, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr new file mode 100644 index 00000000..5f5aea19 --- /dev/null +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_jukebox +Music Disc=Musikplatte +A music disc holds a single music track which can be used in a jukebox to play music.=Eine Musikplatte enthält eine einzelnes Musikstück, die in einer Musikbox benutzt werden kann, um Musik zu spielen. +Place a music dict into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=Platzieren Sie eine Musikplatte in eine leere Musikbox, um die Musik abzuspielen. Benutzen Sie die Musikbox erneut, um die Musikplatte zu erhalten. Die Musik kann nur von Ihnen gehört werden, nicht von anderen Spielern. +Music Disc=Musikplatte +@1—@2=@1 – @2 +Jukebox=Musikbox +Jukeboxes play music when they're supplied with a music disc.=Musikboxen spielen Musik, wenn man ihnen eine Musikplatte gibt. +Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=Platzieren Sie eine Musikplatte in eine leere Musikbox, um die Musikplatte einzulegen und Musik zu spielen. Wenn die Musikbox schon eine Musikplatte hat, werden Sie zuerst diese Musikplatte erhalten. Die Musik kann nur von Ihnen gehört werden, aber nicht von anderen Spielern. +Now playing: @1—@2=Sie hören: @1 – @2 +Uses music discs to play music=Benutzt Musikplatten, um Musik zu spielen diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.es.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.es.tr new file mode 100644 index 00000000..d1a63976 --- /dev/null +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.es.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_jukebox +Music Disc=Disco de música +A music disc holds a single music track which can be used in a jukebox to play music.=Un disco de música contiene una sola pista que se puede usar en una máquina de discos para reproducirla. +Place a music dict into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=Coloque un disco de música en una máquina de discos vacía para reproducir la música. Use la máquina de discos nuevamente para recuperar el disco de música. La música solo puede ser escuchada por ti, no por otros jugadores. +Music Disc=Disco de música +@1—@2=@1 – @2 +Jukebox=Tocadiscos +Jukeboxes play music when they're supplied with a music disc.=Los tocadiscos reproducen música cuando se les inserta un disco de música. +Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=Coloque un disco de música en una máquina de discos vacía para insertar el disco de música y reproducir música. Si el jukebox ya tiene un disco de música, primero recuperará este disco de música. La música solo puede ser escuchada por ti, no por otros jugadores. +Now playing: @1—@2=Reproduciendo actualmente: @1 – @2 diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.fr.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.fr.tr new file mode 100644 index 00000000..d843acc5 --- /dev/null +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.fr.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_jukebox +Music Disc=Disque de musique +A music disc holds a single music track which can be used in a jukebox to play music.=Un disque de musique contient une seule piste musicale qui peut être utilisée dans un juke-box pour lire de la musique. +Place a music dict into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=Placez un disque de musique dans un juke-box vide pour lire la musique. Utilisez à nouveau le juke-box pour récupérer le disque de musique. La musique ne peut être entendue que par vous, pas par les autres joueurs. +Music Disc=Disque de musique +@1—@2=@1—@2 +Jukebox=Juke-box +Jukeboxes play music when they're supplied with a music disc.=Les juke-box diffusent de la musique lorsqu'ils sont fournis avec un disque de musique. +Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=Placez un disque de musique dans un juke-box vide pour insérer le disque de musique et lire de la musique. Si le juke-box possède déjà un disque de musique, vous allez d'abord récupérer ce disque de musique. La musique ne peut être entendue que par vous, pas par les autres joueurs. +Now playing: @1—@2=En cours de lecture: @1—@2 +Uses music discs to play music=Utilise des disques de musique pour lire de la musique diff --git a/mods/ITEMS/mcl_jukebox/locale/template.txt b/mods/ITEMS/mcl_jukebox/locale/template.txt new file mode 100644 index 00000000..7189ba0e --- /dev/null +++ b/mods/ITEMS/mcl_jukebox/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: mcl_jukebox +Music Disc= +A music disc holds a single music track which can be used in a jukebox to play music.= +Place a music dict into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.= +Music Disc= +@1—@2= +Jukebox= +Jukeboxes play music when they're supplied with a music disc.= +Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.= +Now playing: @1—@2= +Uses music discs to play music= diff --git a/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_3.ogg b/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_3.ogg index d691313d..f23b01eb 100644 Binary files a/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_3.ogg and b/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_3.ogg differ diff --git a/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_4.ogg b/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_4.ogg index da842630..e6965024 100644 Binary files a/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_4.ogg and b/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_4.ogg differ diff --git a/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_6.ogg b/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_6.ogg index 2fe89d41..9982d296 100644 Binary files a/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_6.ogg and b/mods/ITEMS/mcl_jukebox/sounds/mcl_jukebox_track_6.ogg differ diff --git a/mods/ITEMS/mcl_jukebox/textures/mcl_jukebox_top.png b/mods/ITEMS/mcl_jukebox/textures/mcl_jukebox_top.png index ea271cb4..2294972d 100644 Binary files a/mods/ITEMS/mcl_jukebox/textures/mcl_jukebox_top.png and b/mods/ITEMS/mcl_jukebox/textures/mcl_jukebox_top.png differ diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index 9edbc971..4c919c34 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_maps") + -- Turn empty map into filled map by rightclick local make_filled_map = function(itemstack, placer, pointed_thing) local new_map = ItemStack("mcl_maps:filled_map") @@ -9,16 +11,16 @@ local make_filled_map = function(itemstack, placer, pointed_thing) if inv:room_for_item("main", new_map) then inv:add_item("main", new_map) else - minetest.add_item(placer:getpos(), new_map) + minetest.add_item(placer:get_pos(), new_map) end return itemstack end end minetest.register_craftitem("mcl_maps:empty_map", { - description = "Empty Map", - _doc_items_longdesc = "Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.", - _doc_items_usagehelp = "Rightclick to start using the map (which can't be stacked anymore).", + description = S("Empty Map"), + _doc_items_longdesc = S("Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used."), + _doc_items_usagehelp = S("Rightclick to start using the map (which can't be stacked anymore)."), inventory_image = "mcl_maps_map_empty.png", groups = { not_in_creative_inventory = 1 }, on_place = make_filled_map, @@ -26,27 +28,6 @@ minetest.register_craftitem("mcl_maps:empty_map", { stack_max = 64, }) --- Enables minimap if carried in hotbar. --- If this item is NOT in the hotbar, the minimap is unavailable --- Note: This is not at all like Minecraft right now. Minetest's minimap is pretty overpowered, it --- has a very greatly zoomed-out version and even a radar mode -minetest.register_craftitem("mcl_maps:filled_map", { - description = "Map", - _doc_items_longdesc = "Maps show your surroundings as you explore the world. They can even show you the world like a radar. MAGIC!\nNote: Maps are incomplete and subject to change in future versions of MineClone 2.", - _doc_items_usagehelp = "Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key ([F9] by default).", - inventory_image = "mcl_maps_map_filled.png^(mcl_maps_map_filled_markings.png^[colorize:#000000)", - stack_max = 1, -}) - -minetest.register_craft({ - output = "mcl_maps:filled_map", - recipe = { - { "mcl_core:paper", "mcl_core:paper", "mcl_core:paper" }, - { "mcl_core:paper", "group:compass", "mcl_core:paper" }, - { "mcl_core:paper", "mcl_core:paper", "mcl_core:paper" }, - } -}) - local function has_item_in_hotbar(player, item) -- Requirement: player carries the tool in the hotbar local inv = player:get_inventory() @@ -61,25 +42,67 @@ end -- Checks if player is still allowed to display the minimap local function update_minimap(player) - if has_item_in_hotbar(player, "mcl_maps:filled_map") then - player:hud_set_flags({minimap = true}) + local creative = minetest.settings:get_bool("creative_mode") + if creative then + player:hud_set_flags({minimap=true, minimap_radar = true}) else - player:hud_set_flags({minimap = false}) + if has_item_in_hotbar(player, "mcl_maps:filled_map") then + player:hud_set_flags({minimap = true, minimap_radar = false}) + else + player:hud_set_flags({minimap = false, minimap_radar = false}) + end end end +-- Remind player how to use the minimap correctly +local function use_minimap(itemstack, player, pointed_thing) + if player and player:is_player() then + update_minimap(player) + minetest.chat_send_player(player:get_player_name(), S("Use the minimap key to show the map.")) + end +end + +-- Enables minimap if carried in hotbar. +-- If this item is NOT in the hotbar, the minimap is unavailable +-- Note: This is not at all like Minecraft right now. Minetest's minimap is pretty overpowered, it +-- has a very greatly zoomed-out version and even a radar mode +minetest.register_craftitem("mcl_maps:filled_map", { + description = S("Map"), + _tt_help = S("Enables minimap"), + _doc_items_longdesc = S("Maps show your surroundings as you explore the world."), + _doc_items_usagehelp = S("Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).").."\n".. + S("In Creative Mode, you don't need this item; the minimap is always available."), + groups = { tool = 1 }, + inventory_image = "mcl_maps_map_filled.png^(mcl_maps_map_filled_markings.png^[colorize:#000000)", + stack_max = 1, + + on_use = use_minimap, + on_secondary_use = use_minimap, +}) + +minetest.register_craft({ + output = "mcl_maps:filled_map", + recipe = { + { "mcl_core:paper", "mcl_core:paper", "mcl_core:paper" }, + { "mcl_core:paper", "group:compass", "mcl_core:paper" }, + { "mcl_core:paper", "mcl_core:paper", "mcl_core:paper" }, + } +}) + minetest.register_on_joinplayer(function(player) update_minimap(player) end) local updatetimer = 0 -minetest.register_globalstep(function(dtime) - updatetimer = updatetimer + dtime - if updatetimer > 0.1 then - local players = minetest.get_connected_players() - for i=1, #players do - update_minimap(players[i]) +if not minetest.settings:get_bool("creative_mode") then + minetest.register_globalstep(function(dtime) + updatetimer = updatetimer + dtime + if updatetimer > 0.1 then + local players = minetest.get_connected_players() + for i=1, #players do + update_minimap(players[i]) + end + updatetimer = updatetimer - dtime end - updatetimer = updatetimer - dtime - end -end) + end) +end diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr new file mode 100644 index 00000000..6d1836b4 --- /dev/null +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_maps +Empty Map=Leere Karte +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Leere Karten sind als Karten nicht nützlich, aber sie können gestapelt werden und zu benutzbaren Karten umgewandelt werden. +Rightclick to start using the map (which can't be stacked anymore).=Rechtsklick, um zu beginnen, die Karte zu benutzen. Sie kann dann nicht mehr gestapelt werden. +Map=Karte +Maps show your surroundings as you explore the world.=Karten zeigen Ihre Umgebung, während Sie die Welt erkunden. +Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).=Halten Sie die Karte in einen beliebigen Platz in der Schnellleiste. Damit können Sie jetzt die Übersichtskarte aktivieren, indem Sie die Taste zum Umschalten der Karte drücken (siehe Tastenbelegung). +In Creative Mode, you don't need this item; the minimap is always available.=Im Kreativmodus brauchen Sie diesen Gegenstand nicht; die Übersichtskarte ist immer verfügbar. +Enables minimap=Aktiviert Übersichtskarte +Use the minimap key to show the map.=Taste „Karte an/aus“ benutzen, um die Karte zu betrachten. diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.es.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.es.tr new file mode 100644 index 00000000..513eab13 --- /dev/null +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.es.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_maps +Empty Map=Mapa vacio +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Los mapas vacíos no son útiles como mapas, pero se pueden apilar y convertir en mapas que se pueden usar. +Rightclick to start using the map (which can't be stacked anymore).=Haga clic derecho para comenzar a usar el mapa (que ya no se puede apilar). +Map=Mapa +Maps show your surroundings as you explore the world.=Los mapas muestran tu entorno mientras exploras el mundo. +Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).=Mantenga el mapa en cualquiera de las ranuras de la barra de acceso directo. Esto le permite acceder al minimapa presionando la tecla del minimapa (consulte la configuración de los controles). +In Creative Mode, you don't need this item; the minimap is always available.=En el modo creativo, no necesita este elemento; El minimapa siempre está disponible. diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr new file mode 100644 index 00000000..6feb253a --- /dev/null +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_maps +Empty Map=Carte Vierge +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Les cartes vierges ne sont pas utiles en tant que cartes, mais elles peuvent être empilées et transformées en cartes utilisables. +Rightclick to start using the map (which can't be stacked anymore).=Clic droit pour commencer à utiliser la carte (qui ne peut plus être empilée). +Map=Carte +Maps show your surroundings as you explore the world.=Les cartes montrent votre environnement lorsque vous explorez le monde. +Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).=Tenez la carte dans l'un des emplacements de la barre de raccourci. Cela vous permet d'accéder à la mini-carte en appuyant sur la touche de la mini-carte (voir les paramètres des commandes). +In Creative Mode, you don't need this item; the minimap is always available.=En mode créatif, vous n'avez pas besoin de cet élément; la minicarte est toujours disponible. +Enables minimap=Active la minicarte +Use the minimap key to show the map.=Utilisez la touche mini-carte pour afficher la carte. diff --git a/mods/ITEMS/mcl_maps/locale/template.txt b/mods/ITEMS/mcl_maps/locale/template.txt new file mode 100644 index 00000000..061ed45e --- /dev/null +++ b/mods/ITEMS/mcl_maps/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: mcl_maps +Empty Map= +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.= +Rightclick to start using the map (which can't be stacked anymore).= +Map= +Maps show your surroundings as you explore the world.= +Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).= +In Creative Mode, you don't need this item; the minimap is always available.= +Enables minimap= +Use the minimap key to show the map.= diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index b127be4b..3e6aef48 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -1,8 +1,11 @@ -- TODO: Add special status effects for raw flesh +local S = minetest.get_translator("mcl_mobitems") + minetest.register_craftitem("mcl_mobitems:rotten_flesh", { - description = "Rotten Flesh", - _doc_items_longdesc = "Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.", + description = S("Rotten Flesh"), + _tt_help = minetest.colorize("#FFFF00", S("80% chance of food poisoning")), + _doc_items_longdesc = S("Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while."), inventory_image = "mcl_mobitems_rotten_flesh.png", wield_image = "mcl_mobitems_rotten_flesh.png", on_place = minetest.item_eat(4), @@ -13,8 +16,8 @@ minetest.register_craftitem("mcl_mobitems:rotten_flesh", { }) minetest.register_craftitem("mcl_mobitems:mutton", { - description = "Raw Mutton", - _doc_items_longdesc = "Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.", + description = S("Raw Mutton"), + _doc_items_longdesc = S("Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value."), inventory_image = "mcl_mobitems_mutton_raw.png", wield_image = "mcl_mobitems_mutton_raw.png", on_place = minetest.item_eat(2), @@ -25,8 +28,8 @@ minetest.register_craftitem("mcl_mobitems:mutton", { }) minetest.register_craftitem("mcl_mobitems:cooked_mutton", { - description = "Cooked Mutton", - _doc_items_longdesc = "Cooked mutton is the cooked flesh from a sheep and is used as food.", + description = S("Cooked Mutton"), + _doc_items_longdesc = S("Cooked mutton is the cooked flesh from a sheep and is used as food."), inventory_image = "mcl_mobitems_mutton_cooked.png", wield_image = "mcl_mobitems_mutton_cooked.png", on_place = minetest.item_eat(6), @@ -37,8 +40,8 @@ minetest.register_craftitem("mcl_mobitems:cooked_mutton", { }) minetest.register_craftitem("mcl_mobitems:beef", { - description = "Raw Beef", - _doc_items_longdesc = "Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.", + description = S("Raw Beef"), + _doc_items_longdesc = S("Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value."), inventory_image = "mcl_mobitems_beef_raw.png", wield_image = "mcl_mobitems_beef_raw.png", on_place = minetest.item_eat(3), @@ -49,8 +52,8 @@ minetest.register_craftitem("mcl_mobitems:beef", { }) minetest.register_craftitem("mcl_mobitems:cooked_beef", { - description = "Steak", - _doc_items_longdesc = "Steak is cooked beef from cows and can be eaten.", + description = S("Steak"), + _doc_items_longdesc = S("Steak is cooked beef from cows and can be eaten."), inventory_image = "mcl_mobitems_beef_cooked.png", wield_image = "mcl_mobitems_beef_cooked.png", on_place = minetest.item_eat(8), @@ -61,8 +64,9 @@ minetest.register_craftitem("mcl_mobitems:cooked_beef", { }) minetest.register_craftitem("mcl_mobitems:chicken", { - description = "Raw Chicken", - _doc_items_longdesc = "Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.", + description = S("Raw Chicken"), + _tt_help = minetest.colorize("#FFFF00", S("30% chance of food poisoning")), + _doc_items_longdesc = S("Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value."), inventory_image = "mcl_mobitems_chicken_raw.png", wield_image = "mcl_mobitems_chicken_raw.png", on_place = minetest.item_eat(2), @@ -73,8 +77,8 @@ minetest.register_craftitem("mcl_mobitems:chicken", { }) minetest.register_craftitem("mcl_mobitems:cooked_chicken", { - description = "Cooked Chicken", - _doc_items_longdesc = "A cooked chicken is a healthy food item which can be eaten.", + description = S("Cooked Chicken"), + _doc_items_longdesc = S("A cooked chicken is a healthy food item which can be eaten."), inventory_image = "mcl_mobitems_chicken_cooked.png", wield_image = "mcl_mobitems_chicken_cooked.png", on_place = minetest.item_eat(6), @@ -85,8 +89,8 @@ minetest.register_craftitem("mcl_mobitems:cooked_chicken", { }) minetest.register_craftitem("mcl_mobitems:porkchop", { - description = "Raw Porkchop", - _doc_items_longdesc = "A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.", + description = S("Raw Porkchop"), + _doc_items_longdesc = S("A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value."), inventory_image = "mcl_mobitems_porkchop_raw.png", wield_image = "mcl_mobitems_porkchop_raw.png", on_place = minetest.item_eat(3), @@ -97,8 +101,8 @@ minetest.register_craftitem("mcl_mobitems:porkchop", { }) minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { - description = "Cooked Porkchop", - _doc_items_longdesc = "Cooked porkchop is the cooked flesh of a pig and is used as food.", + description = S("Cooked Porkchop"), + _doc_items_longdesc = S("Cooked porkchop is the cooked flesh of a pig and is used as food."), inventory_image = "mcl_mobitems_porkchop_cooked.png", wield_image = "mcl_mobitems_porkchop_cooked.png", on_place = minetest.item_eat(8), @@ -109,8 +113,8 @@ minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { }) minetest.register_craftitem("mcl_mobitems:rabbit", { - description = "Raw Rabbit", - _doc_items_longdesc = "Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.", + description = S("Raw Rabbit"), + _doc_items_longdesc = S("Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value."), inventory_image = "mcl_mobitems_rabbit_raw.png", wield_image = "mcl_mobitems_rabbit_raw.png", on_place = minetest.item_eat(3), @@ -121,8 +125,8 @@ minetest.register_craftitem("mcl_mobitems:rabbit", { }) minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { - description = "Cooked Rabbit", - _doc_items_longdesc = "This is a food item which can be eaten.", + description = S("Cooked Rabbit"), + _doc_items_longdesc = S("This is a food item which can be eaten."), inventory_image = "mcl_mobitems_rabbit_cooked.png", wield_image = "mcl_mobitems_rabbit_cooked.png", on_place = minetest.item_eat(5), @@ -135,7 +139,7 @@ minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { local drink_milk = function(itemstack, player, pointed_thing) local bucket = minetest.do_item_eat(0, "mcl_buckets:bucket_empty", itemstack, player, pointed_thing) -- Check if we were allowed to drink this (eat delay check) - if bucket:get_name() ~= "mcl_mobitems:milk_bucket" then + if mcl_hunger.active and (bucket:get_name() ~= "mcl_mobitems:milk_bucket" or minetest.settings:get_bool("creative_mode") == true) then mcl_hunger.stop_poison(player) end return bucket @@ -143,8 +147,9 @@ end -- TODO: Clear *all* status effects minetest.register_craftitem("mcl_mobitems:milk_bucket", { - description = "Milk", - _doc_items_longdesc = "Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning (in later versions: all status effects), but restores no hunger points.", + description = S("Milk"), + _tt_help = minetest.colorize("#00FF00", S("Cures poison")), + _doc_items_longdesc = S("Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points."), _doc_items_usagehelp = "Rightclick to drink the milk.", inventory_image = "mcl_mobitems_bucket_milk.png", wield_image = "mcl_mobitems_bucket_milk.png", @@ -156,8 +161,9 @@ minetest.register_craftitem("mcl_mobitems:milk_bucket", { }) minetest.register_craftitem("mcl_mobitems:spider_eye", { - description = "Spider Eye", - _doc_items_longdesc = "Spider eyes are used mainly in crafting and brewing. If you're really desperate, you can eat a spider eye, but it will poison you briefly.", + description = S("Spider Eye"), + _tt_help = minetest.colorize("#FFFF00", S("Poisonous")), + _doc_items_longdesc = S("Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly."), inventory_image = "mcl_mobitems_spider_eye.png", wield_image = "mcl_mobitems_spider_eye.png", on_place = minetest.item_eat(2), @@ -168,25 +174,25 @@ minetest.register_craftitem("mcl_mobitems:spider_eye", { }) minetest.register_craftitem("mcl_mobitems:bone", { - description = "Bone", - _doc_items_longdesc = "Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.", - _doc_items_usagehelp = "Hold the bone in your hand near wolves to attract them. Rightclick the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by rightclicking it.", + description = S("Bone"), + _doc_items_longdesc = S("Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient."), + _doc_items_usagehelp = S("Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it."), inventory_image = "mcl_mobitems_bone.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_mobitems:string",{ - description = "String", - _doc_items_longdesc = "Strings are used in crafting.", + description = S("String"), + _doc_items_longdesc = S("Strings are used in crafting."), inventory_image = "mcl_mobitems_string.png", stack_max = 64, groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_mobitems:blaze_rod", { - description = "Blaze Rod", - _doc_items_longdesc = "This is a crafting component dropped from dead blazes.", + description = S("Blaze Rod"), + _doc_items_longdesc = S("This is a crafting component dropped from dead blazes."), wield_image = "mcl_mobitems_blaze_rod.png", inventory_image = "mcl_mobitems_blaze_rod.png", groups = { craftitem = 1 }, @@ -194,44 +200,46 @@ minetest.register_craftitem("mcl_mobitems:blaze_rod", { }) minetest.register_craftitem("mcl_mobitems:blaze_powder", { - description = "Blaze Powder", - _doc_items_longdesc = "This item is mainly used for brewing potions and crafting.", + description = S("Blaze Powder"), + _doc_items_longdesc = S("This item is mainly used for crafting."), wield_image = "mcl_mobitems_blaze_powder.png", inventory_image = "mcl_mobitems_blaze_powder.png", - groups = { brewitem = 1 }, + groups = { craftitem = 1, brewitem = 1 }, stack_max = 64, }) minetest.register_craftitem("mcl_mobitems:magma_cream", { - description = "Magma Cream", - _doc_items_longdesc = "Magma cream is a crafting component.", + description = S("Magma Cream"), + _doc_items_longdesc = S("Magma cream is a crafting component."), wield_image = "mcl_mobitems_magma_cream.png", inventory_image = "mcl_mobitems_magma_cream.png", - groups = { brewitem = 1 }, + groups = { craftitem = 1, brewitem = 1 }, stack_max = 64, }) minetest.register_craftitem("mcl_mobitems:ghast_tear", { - description = "Ghast Tear", - _doc_items_longdesc = "A ghast tear is an item used in potion brewing. It is dropped from dead ghasts.", + description = S("Ghast Tear"), + _doc_items_longdesc = S("Place this item in an item frame as decoration."), wield_image = "mcl_mobitems_ghast_tear.png", inventory_image = "mcl_mobitems_ghast_tear.png", - groups = { brewitem = 1 }, + -- TODO: Reveal item when it's useful + groups = { brewitem = 1, not_in_creative_inventory = 1 }, stack_max = 64, }) minetest.register_craftitem("mcl_mobitems:nether_star", { - description = "Nether Star", - _doc_items_longdesc = "A nether star is a crafting component. It is dropped from the Wither.", + description = S("Nether Star"), + _doc_items_longdesc = S("A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration."), wield_image = "mcl_mobitems_nether_star.png", inventory_image = "mcl_mobitems_nether_star.png", - groups = { craftitem = 1 }, + -- TODO: Reveal item when it's useful + groups = { craftitem = 1, not_in_creative_inventory = 1 }, stack_max = 64, }) minetest.register_craftitem("mcl_mobitems:leather", { - description = "Leather", - _doc_items_longdesc = "Leather is a versatile crafting component.", + description = S("Leather"), + _doc_items_longdesc = S("Leather is a versatile crafting component."), wield_image = "mcl_mobitems_leather.png", inventory_image = "mcl_mobitems_leather.png", groups = { craftitem = 1 }, @@ -239,8 +247,8 @@ minetest.register_craftitem("mcl_mobitems:leather", { }) minetest.register_craftitem("mcl_mobitems:feather", { - description = "Feather", - _doc_items_longdesc = "Feathers are used in crafting and are dropped from chickens.", + description = S("Feather"), + _doc_items_longdesc = S("Feathers are used in crafting and are dropped from chickens."), wield_image = "mcl_mobitems_feather.png", inventory_image = "mcl_mobitems_feather.png", groups = { craftitem = 1 }, @@ -248,8 +256,8 @@ minetest.register_craftitem("mcl_mobitems:feather", { }) minetest.register_craftitem("mcl_mobitems:rabbit_hide", { - description = "Rabbit Hide", - _doc_items_longdesc = "Rabbit hide is used to create leather.", + description = S("Rabbit Hide"), + _doc_items_longdesc = S("Rabbit hide is used to create leather."), wield_image = "mcl_mobitems_rabbit_hide.png", inventory_image = "mcl_mobitems_rabbit_hide.png", groups = { craftitem = 1 }, @@ -257,26 +265,29 @@ minetest.register_craftitem("mcl_mobitems:rabbit_hide", { }) minetest.register_craftitem("mcl_mobitems:rabbit_foot", { - description = "Rabbit's Foot", - _doc_items_longdesc = "This item is used in brewing.", + description = S("Rabbit's Foot"), + _doc_items_longdesc = S("Must be your lucky day! Place this item in an item frame for decoration."), wield_image = "mcl_mobitems_rabbit_foot.png", inventory_image = "mcl_mobitems_rabbit_foot.png", - groups = { brewitem = 1 }, + -- TODO: Reveal item when it's useful + groups = { brewitem = 1, not_in_creative_inventory = 1 }, stack_max = 64, }) minetest.register_craftitem("mcl_mobitems:saddle", { - description = "Saddle", - _doc_items_longdesc = "Saddles can be put on horses and pigs in order to mount them.", - _doc_items_usagehelp = "Rightclick a horse or pig with a saddle to put on the saddle. You can now mount the animal by rightclicking it again.", + description = S("Saddle"), + _tt_help = S("Can be placed on animals to ride them"), + _doc_items_longdesc = S("Saddles can be put on some animals in order to mount them."), + _doc_items_usagehelp = "Rightclick an animal (with the saddle in your hand) to try put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by rightclicking them again.", wield_image = "mcl_mobitems_saddle.png", inventory_image = "mcl_mobitems_saddle.png", + groups = { transport = 1 }, stack_max = 1, }) minetest.register_craftitem("mcl_mobitems:rabbit_stew", { - description = "Rabbit Stew", - _doc_items_longdesc = "Rabbit stew is a very nutricious food item.", + description = S("Rabbit Stew"), + _doc_items_longdesc = S("Rabbit stew is a very nutricious food item."), wield_image = "mcl_mobitems_rabbit_stew.png", inventory_image = "mcl_mobitems_rabbit_stew.png", stack_max = 1, @@ -287,21 +298,21 @@ minetest.register_craftitem("mcl_mobitems:rabbit_stew", { }) minetest.register_craftitem("mcl_mobitems:shulker_shell", { - description = "Shulker Shell", - _doc_items_longdesc = "Shulker shells are used in crafting. They are dropped from dead shulkers.", + description = S("Shulker Shell"), + _doc_items_longdesc = S("Shulker shells are used in crafting. They are dropped from dead shulkers."), inventory_image = "mcl_mobitems_shulker_shell.png", groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_mobitems:slimeball", { - description = "Slimeball", - _doc_items_longdesc = "Slimeballs are used in crafting. They are dropped from slimes.", + description = S("Slimeball"), + _doc_items_longdesc = S("Slimeballs are used in crafting. They are dropped from slimes."), inventory_image = "mcl_mobitems_slimeball.png", groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_mobitems:gunpowder", { - description = "Gunpowder", + description = S("Gunpowder"), _doc_items_longdesc = doc.sub.items.temp.craftitem, inventory_image = "default_gunpowder.png", stack_max = 64, @@ -309,9 +320,10 @@ minetest.register_craftitem("mcl_mobitems:gunpowder", { }) minetest.register_tool("mcl_mobitems:carrot_on_a_stick", { - description = "Carrot on a Stick", - _doc_items_longdesc = "A carrot on a stick can be used on saddled pigs to ride them.", - _doc_items_usagehelp = "Rightclick a saddled pig with the carrot on a stick to mount it. You can now ride it like a horse (TODO). Pigs will also walk towards you when you just wield the carrot on a stick.", + description = S("Carrot on a Stick"), + _tt_help = S("Lets you ride a saddled pig"), + _doc_items_longdesc = S("A carrot on a stick can be used on saddled pigs to ride them."), + _doc_items_usagehelp = S("Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick."), wield_image = "mcl_mobitems_carrot_on_a_stick.png", inventory_image = "mcl_mobitems_carrot_on_a_stick.png", groups = { transport = 1 }, diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr new file mode 100644 index 00000000..dcb605d2 --- /dev/null +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr @@ -0,0 +1,68 @@ +# textdomain: mcl_mobitems +Rotten Flesh=Gammelfleisch +Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=Igitt! Dieses Stück Fleisch hat wohl bessere Tage gesehen. Wenn Sie es essen, werden Sie sofort vergiftet und erleiden einen Schaden von 4 Trefferpunkten. Aber gezähmte Wölfe können es problemlos fressen. +Raw Mutton=Rohes Hammelfleisch +Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=Rohes Hammelfleisch ist das Fleisch eines Schafes und ein Lebensmittel, welches bedenkenlos verzehrt werden kann. Es kann gebraten werden, um seinen Nährwert deutlich zu erhöhen. +Cooked Mutton=Gebratenes Hammelfleisch +Cooked mutton is the cooked flesh from a sheep and is used as food.=Gebratenes Hammelfleisch ist das gebratene Fleisch eines Schafs und dient als Lebensmittel. +Raw Beef=Rohes Rindfleisch +Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=Rohes Rindfleisch ist das Fleisch von Kühen und kann problemlos gegessen werden. Es kann gegart werden, um den Nährwert deutlich zu erhöhen. +Steak=Steak +Steak is cooked beef from cows and can be eaten.=Steak ist gebratenes Rindfleisch und kann gegessen werden. +Raw Chicken=Rohes Hühnchen +Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Rohes Hühnchen ist ein Lebensmittel, das nicht sicher für den Verzehr ist. Sie können es essen, um ein paar Hungerpunkte zu erhalten, aber mit einer Wahrscheinlichkeit von 30% erleiden Sie eine Lebensmittelvergiftung, die Ihre Hungerrate für eine Weile erhöht. Braten Sie ein rohes Hühnchen, um es sicher zuzubereiten und den Nährwert zu erhöhen. +Cooked Chicken=Gebratenes Hühnchen +A cooked chicken is a healthy food item which can be eaten.=Ein gebratenes Hühnchen ist ein gesundes essbares Lebensmittel. +Raw Porkchop=Rohes Schweinefleisch +A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Ein rohes Stück Schweinefleisch kann bedenkenlos gegessen werden. Man kann es braten, um seinen Nährwert stark zu erhöhen. +Cooked Porkchop=Gebratenes Schweinefleisch +Cooked porkchop is the cooked flesh of a pig and is used as food.=Ein gebratenes Stück Schweinefleisch ist ein gutes Lebensmittel. +Raw Rabbit=Rohes Kaninchen +Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=Rohes Kaninchenfleisch ist ein Lebensmittel, welches bedenkenlos verzehrt werden kann. Es kann gebraten werden, um seinen Nährwert zu erhöhen. +Cooked Rabbit=Gebratenes Kaninchen +This is a food item which can be eaten.=Dies ist ein essbares Lebensmittel. +Milk=Milch +Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=Milch ist sehr erfrischend und wird erhalten, wenn ein Eimer an einer Kuh benutzt wird. Wenn es getrunken wird, werden alle Vergiftungserscheinungen kuriert, aber es werden keine Hungerpunkte wiederhergestellt. +Spider Eye=Spinnenauge +Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Spinnenaugen werden hauptsächlich in der Fertigung benutzt. Wenn Sie wirklich verzweifelt sind, können sie es essen, aber das wird Sie kurz vergiften. +Bone=Knochen +Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Knochen können benutzt werden, um Wölfe zu zähmen, damit sie einen beschützen. Sie außerdem nützlich in der Fertigung. +String=Faden +Strings are used in crafting.=Fäden sind nützlich in der Fertigung. +Blaze Rod=Lohenrute +This is a crafting component dropped from dead blazes.=Dies ist eine Fertigungskomponente, die von toten Lohen abgeworfen wird. +Blaze Powder=Lohenstaub +This item is mainly used for crafting.=Dieser Gegenstand wird hauptsächlich in der Fertigung benutzt. +Magma Cream=Magmacreme +Magma cream is a crafting component.=Magmacreme ist eine Fertigungskomponente. +Ghast Tear=Ghast-Träne +Place this item in an item frame as decoration.=Platzieren Sie diesen Gegenstand in einem Rahmel als Deko. +Nether Star=Nether-Stern +A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Ein Netherstern wird abgeworfen, wenn der Wither stirbt. Platzieren Sie ihn in einen Rahmen, um der Welt zu zeigen, wie großartig Sie sind! +Leather=Leder +Leather is a versatile crafting component.=Leder ist eine vielseitige Fertigungskomponente. +Feather=Feder +Feathers are used in crafting and are dropped from chickens.=Federn werden in der Fertigung benutzt und werden von Hühnern abgeworfen. +Rabbit Hide=Kaninchenfell +Rabbit hide is used to create leather.=Kaninchenfell wird zur Herstellung von Leder benutzt. +Rabbit's Foot=Hasenpfote +Must be your lucky day! Place this item in an item frame for decoration.=Muss wohl Ihr Glückstag sein! Platzieren Sie diesen Gegenstand in einen Rahmen zur Dekoration. +Saddle=Sattel +Saddles can be put on some animals in order to mount them.=Sattel können auf einigen Tieren platziert werden, um sich aufzusatteln. +Rabbit Stew=Kaninchenragout +Rabbit stew is a very nutricious food item.=Kaninchenragout ist ein sehr nahrhaftes Lebensmittel. +Shulker Shell=Schulkerschale +Shulker shells are used in crafting. They are dropped from dead shulkers.=Schulkerschalen werden für die Fertigung verwendet. Sie werden von toten Schulkern fallen gelassen. +Slimeball=Schleimkugel +Slimeballs are used in crafting. They are dropped from slimes.=Schleimkugeln werden in der Fertigung verwendet. Sie werden von Schleimen fallen gelassen. +Gunpowder=Schießpulver +Carrot on a Stick=Karottenrute +A carrot on a stick can be used on saddled pigs to ride them.=Eine Karottenrute kann auf gesattelten Schweinen angewendet werden, um sie zu reiten. +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Platzieren Sie sie auf einem Schwein mit Sattel, um sich aufzusatteln. Sie können nun das Schwein wie ein Pferd reiten. Schweine werden auch auf Sie zugehen, wenn Sie einfach nur die Karottenrute halten. +Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Halten Sie den Knochen in der Nähe von Wölfen, um sie anzulocken. Benutzen Sie die „Platzieren“-Taste auf dem Wolf, um ihm den Knochen zu geben und ihn zu zähmen. Sie können dem gezähmten Wolf Befehle erteilen, indem Sie die „Platzieren“-Taste auf ihm benutzen. +Lets you ride a saddled pig=Um auf gesattelten Schweinen zu reiten +30% chance of food poisoning=30% Wahrscheinlichkeit von Lebensmittelvergiftung +80% chance of food poisoning=80% Wahrscheinlichkeit von Lebensmittelvergiftung +Cures poison=Kuriert Vergiftung +Can be placed on animals to ride them=Kann auf Tieren platziert werden, um sie zu reiten +Poisonous=Giftig diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.es.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.es.tr new file mode 100644 index 00000000..e56ef9ee --- /dev/null +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.es.tr @@ -0,0 +1,62 @@ +# textdomain: mcl_mobitems +Rotten Flesh=Carne podrida +Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=¡Qué asco! Este pedazo de carne claramente ha tenido días mejores. Si está realmente estas desesperado, puedes comerlo para restablecer algunos puntos de hambre, pero hay un 80% de posibilidades de que cause intoxicación alimentaria, lo que aumenta su hambre por un tiempo. +Raw Mutton=Cordero crudo +Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=El cordero crudo es la carne de una oveja y se puede comer de manera segura. Cocinarlo aumentará en gran medida su valor nutricional. +Cooked Mutton=Cordero cocinado +Cooked mutton is the cooked flesh from a sheep and is used as food.=El cordero cocinado es la carne cocinada de oveja y se usa como alimento. +Raw Beef=Filete crudo +Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=La carne cruda es la carne de las vacas y se puede comer de manera segura. Cocinarlo aumentará en gran medida su valor nutricional. +Steak=Filete cocinado +Steak is cooked beef from cows and can be eaten.=El filete cocinado se cocina con filetes crudos de vaca y se puede comer. +Raw Chicken=Pollo crudo +Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=El pollo crudo es un alimento que no es seguro consumir. Puedes comerlo para restaurar algunos puntos de hambre, pero hay un 30% de posibilidades de sufrir intoxicación alimentaria, lo que aumenta su tasa de hambre por un tiempo. Cocinar pollo crudo hará que sea seguro comerlo y aumentará su valor nutricional. +Cooked Chicken=Pollo cocinado +A cooked chicken is a healthy food item which can be eaten.=Un pollo cocinado es un alimento saludable que se puede comer. +Raw Porkchop=Chuleta de cerdo cruda +A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Una chuleta de cerdo cruda es la carne de un cerdo y se puede comer de manera segura. Cocinarlo aumentará en gran medida su valor nutricional. +Cooked Porkchop=Chuleta de cerdo cocinada +Cooked porkchop is the cooked flesh of a pig and is used as food.=La chuleta de cerdo cocinada es la carne cocida de un cerdo y se usa como alimento. +Raw Rabbit=Conejo crudo +Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=El conejo crudo es un alimento de un conejo muerto. Se puede comer de forma segura. Cocinar aumentará su valor nutricional. +Cooked Rabbit=Conejo cocinado +This is a food item which can be eaten.=Este es un alimento que se puede comer. +Milk=Leche +Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=La leche es muy refrescante y se puede obtener usando un cubo en una vaca. Beberlo curará todas las formas de envenenamiento, pero no restaura los puntos de hambre. +Spider Eye=Ojo de araña +Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Los ojos de araña se utilizan principalmente en la elaboración. Si estás realmente desesperado, puedes comerte un ojo de araña, pero te envenenará brevemente. +Bone=Hueso +Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Los huesos se pueden usar para domar a los lobos para que te protejan. También son útiles como ingrediente de elaboración. +String=Cuerda +Strings are used in crafting.=Las cuerdas se usan en la elaboración. +Blaze Rod=Vara de blaze +This is a crafting component dropped from dead blazes.=Este es un componente de artesanía caído de llamas muertas. +Blaze Powder=Polvo de blaze +This item is mainly used for crafting.=Este artículo se usa principalmente para la elaboración. +Magma Cream=Crema de magma +Magma cream is a crafting component.=La crema de magma es un componente de elaboración. +Ghast Tear=Lágrima espectral +Place this item in an item frame as decoration.=Coloque este artículo en un marco de artículo como decoración. +Nether Star=Estrella del Nether +A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Se cae una estrella cuando muere un Wither. ¡Colócalo en el marco de un objeto para mostrarle al mundo lo duro que eres! O simplemente como decoración. +Leather=Cuero +Leather is a versatile crafting component.=El cuero es un componente de elaboración versátil. +Feather=Pluma +Feathers are used in crafting and are dropped from chickens.=Las plumas se usan en la elaboración y se sueltan de los pollos. +Rabbit Hide=Piel de conejo +Rabbit hide is used to create leather.=La piel de conejo se usa para crear cuero. +Rabbit's Foot=Pata de conejo +Must be your lucky day! Place this item in an item frame for decoration.=¡Debe ser tu día de suerte! Coloque este artículo en un marco de artículos para la decoración. +Saddle=Montura +Saddles can be put on some animals in order to mount them.=Se pueden poner monturas en algunos animales para montarlos. +Rabbit Stew=Estofado de conejo +Rabbit stew is a very nutricious food item.=El estofado de conejo es un alimento muy nutritivo. +Shulker Shell=Caparazón de shulker +Shulker shells are used in crafting. They are dropped from dead shulkers.=Los caparazones de shulker se usan en la fabricación. Son obtenidos de shulkers muertos. +Slimeball=Bola de slime +Slimeballs are used in crafting. They are dropped from slimes.=Las bolas de slime se usan en la elaboración. Se obtienen de slimes. +Gunpowder=Pólvora +Carrot on a Stick=Caña con zanahoria +A carrot on a stick can be used on saddled pigs to ride them.=La caña con zanahoria se puede usar en cerdos ensillados para montarlos. +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Colóquelo sobre un cerdo ensillado para montarlo. Ahora puedes montar el cerdo como un caballo. Los cerdos también caminarán hacia ti cuando solo manejes la zanahoria en un palo. +Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Empuña el hueso cerca de los lobos para atraerlos. Usa la tecla "Colocar" en el lobo para darle un hueso y domesticarlo. Luego puede dar órdenes al lobo domesticado utilizando la tecla "Colocar". diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr new file mode 100644 index 00000000..b7c92d83 --- /dev/null +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr @@ -0,0 +1,68 @@ +# textdomain: mcl_mobitems +Rotten Flesh=Chair Putréfiée +Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=Beurk! Ce morceau de chair a clairement connu des jours meilleurs. Si vous êtes vraiment désespéré, vous pouvez le manger pour restaurer quelques points de faim, mais il y a 80% de chances qu'il provoque une intoxication alimentaire, ce qui augmente votre faim pendant un certain temps. +Raw Mutton=Mouton Cru +Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=Le mouton cru est la chair d'un mouton et peut être mangé en toute sécurité. La cuisson augmentera considérablement sa valeur nutritive. +Cooked Mutton=Mouton Cuit +Cooked mutton is the cooked flesh from a sheep and is used as food.=Le mouton cuit est la chair cuite d'un mouton et est utilisé comme nourriture. +Raw Beef=Boeuf Cru +Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=Le boeuf cru est la chair des vaches et peut être mangé en toute sécurité. La cuisson augmentera considérablement sa valeur nutritive. +Steak=Steak +Steak is cooked beef from cows and can be eaten.=Le steak est du boeuf cuit et peut être mangé. +Raw Chicken=Poulet Cru +Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Le poulet cru est un aliment qui n'est pas sûr à consommer. Vous pouvez le manger pour restaurer quelques points de faim, mais il y a 30% de chances de souffrir d'intoxication alimentaire, ce qui augmente votre taux de faim pendant un certain temps. La cuisson du poulet cru le rendra sûr à manger et augmentera sa valeur nutritive. +Cooked Chicken=Poulet Cuit +A cooked chicken is a healthy food item which can be eaten.=Un poulet cuit est un aliment sain qui peut être mangé. +Raw Porkchop=Porc Cru +A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Un porc cru est la chair d'un porc et peut être mangée en toute sécurité. La cuisson augmentera considérablement sa valeur nutritive. +Cooked Porkchop=Parc Cuit +Cooked porkchop is the cooked flesh of a pig and is used as food.=Le porc cuit est la chair cuite d'un porc et est utilisé comme aliment. +Raw Rabbit=Lapin Cru +Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=Le lapin cru est un aliment provenant d'un lapin mort. Il peut être mangé en toute sécurité. La cuisson augmentera sa valeur nutritive. +Cooked Rabbit=Lapin Cuit +This is a food item which can be eaten.=Il s'agit d'un aliment qui peut être mangé. +Milk=Lait +Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=Le lait est très rafraîchissant et peut être obtenu en utilisant un seau sur une vache. Le boire guérira toutes les formes d'empoisonnement, mais ne restaure pas de points de faim. +Spider Eye=Oeil d'Araignée +Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Les yeux d'araignée sont utilisés principalement dans l'artisanat. Si vous êtes vraiment désespéré, vous pouvez manger un œil d'araignée, mais cela vous empoisonnera brièvement. +Bone=Os +Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Les os peuvent être utilisés pour apprivoiser les loups afin de vous protéger. Ils sont également utiles comme ingrédient d'artisanat. +String=Ficelle +Strings are used in crafting.=Les ficelles sont utilisées dans l'artisanat. +Blaze Rod=Bâton de Blaze +This is a crafting component dropped from dead blazes.=Il s'agit d'un composant d'artisanat tombé des Blazes morts. +Blaze Powder=Poudre de Blaze +This item is mainly used for crafting.=Cet objet est principalement utilisé pour l'artisanat. +Magma Cream=Crème de Magma +Magma cream is a crafting component.=La crème de magma est un composant artisanal. +Ghast Tear=Larme de Ghast +Place this item in an item frame as decoration.=Placez cet article dans un cadre d'article comme décoration. +Nether Star=Étoile du Nether +A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Une étoile du Nether est lâchée lorsque le Wither meurt. Placez-le dans un cadre d'objet pour montrer au monde à quel point vous êtes génial! Ou tout simplement comme décoration. +Leather=Cuir +Leather is a versatile crafting component.=Le cuir est un élément d'artisanat polyvalent. +Feather=Plume +Feathers are used in crafting and are dropped from chickens.=Les plumes sont utilisées dans l'artisanat et tombent des poulets. +Rabbit Hide=Peau de Lapin +Rabbit hide is used to create leather.=La peau de lapin est utilisée pour créer du cuir. +Rabbit's Foot=Patte de Lapin +Must be your lucky day! Place this item in an item frame for decoration.=Ce doit être votre jour de chance! Placez cet article dans un cadre d'article pour la décoration. +Saddle=Selle +Saddles can be put on some animals in order to mount them.=Des selles peuvent être posées sur certains animaux afin de les monter. +Rabbit Stew=Ragout de Lapin +Rabbit stew is a very nutricious food item.=Le ragoût de lapin est un aliment très nutritif. +Shulker Shell=Carapace de Shulker +Shulker shells are used in crafting. They are dropped from dead shulkers.=Les carapaces Shulker sont utilisés dans l'artisanat. Ils sont lâchés de shulkers morts. +Slimeball=Boule de Slime +Slimeballs are used in crafting. They are dropped from slimes.=Les boules de slime sont utilisées dans l'artisanat. Ils sont lâchés par les Slimes. +Gunpowder=Poudre à canon +Carrot on a Stick=Carotte sur un Batôn +A carrot on a stick can be used on saddled pigs to ride them.=Une carotte sur un bâton peut être utilisée sur les porcs sellés pour les monter. +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Placez-le sur un cochon sellé pour le monter. Vous pouvez maintenant monter le cochon comme un cheval. Les porcs marcheront également vers vous lorsque vous brandirez la carotte sur un bâton. +Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Maniez l'os près des loups pour les attirer. Utilisez la touche «Placer» sur le loup pour lui donner un os et l'apprivoiser. Vous pouvez ensuite donner des commandes au loup apprivoisé en utilisant la touche "Placer" sur celui-ci. +Lets you ride a saddled pig=Vous permet de monter un cochon sellé +30% chance of food poisoning=30% de chances d'intoxication alimentaire +80% chance of food poisoning=80% de chances d'intoxication alimentaire +Cures poison=Guérit le poison +Can be placed on animals to ride them=Peut être placé sur les animaux pour les monter +Poisonous=Toxique diff --git a/mods/ITEMS/mcl_mobitems/locale/template.txt b/mods/ITEMS/mcl_mobitems/locale/template.txt new file mode 100644 index 00000000..e5cf32e4 --- /dev/null +++ b/mods/ITEMS/mcl_mobitems/locale/template.txt @@ -0,0 +1,68 @@ +# textdomain: mcl_mobitems +Rotten Flesh= +Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.= +Raw Mutton= +Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.= +Cooked Mutton= +Cooked mutton is the cooked flesh from a sheep and is used as food.= +Raw Beef= +Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.= +Steak= +Steak is cooked beef from cows and can be eaten.= +Raw Chicken= +Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.= +Cooked Chicken= +A cooked chicken is a healthy food item which can be eaten.= +Raw Porkchop= +A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.= +Cooked Porkchop= +Cooked porkchop is the cooked flesh of a pig and is used as food.= +Raw Rabbit= +Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.= +Cooked Rabbit= +This is a food item which can be eaten.= +Milk= +Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.= +Spider Eye= +Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.= +Bone= +Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.= +String= +Strings are used in crafting.= +Blaze Rod= +This is a crafting component dropped from dead blazes.= +Blaze Powder= +This item is mainly used for crafting.= +Magma Cream= +Magma cream is a crafting component.= +Ghast Tear= +Place this item in an item frame as decoration.= +Nether Star= +A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.= +Leather= +Leather is a versatile crafting component.= +Feather= +Feathers are used in crafting and are dropped from chickens.= +Rabbit Hide= +Rabbit hide is used to create leather.= +Rabbit's Foot= +Must be your lucky day! Place this item in an item frame for decoration.= +Saddle= +Saddles can be put on some animals in order to mount them.= +Rabbit Stew= +Rabbit stew is a very nutricious food item.= +Shulker Shell= +Shulker shells are used in crafting. They are dropped from dead shulkers.= +Slimeball= +Slimeballs are used in crafting. They are dropped from slimes.= +Gunpowder= +Carrot on a Stick= +A carrot on a stick can be used on saddled pigs to ride them.= +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.= +Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.= +Lets you ride a saddled pig= +30% chance of food poisoning= +80% chance of food poisoning= +Cures poison= +Can be placed on animals to ride them= +Poisonous= diff --git a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_bucket_milk.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_bucket_milk.png index 2ba089a5..249fc1a9 100644 Binary files a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_bucket_milk.png and b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_bucket_milk.png differ diff --git a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_carrot_on_a_stick.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_carrot_on_a_stick.png index ff85a30d..8fa01c75 100644 Binary files a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_carrot_on_a_stick.png and b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_carrot_on_a_stick.png differ diff --git a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_rabbit_hide.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_rabbit_hide.png index 39e1f221..e36cad4d 100644 Binary files a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_rabbit_hide.png and b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_rabbit_hide.png differ diff --git a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_slimeball.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_slimeball.png index e984e9b9..1dd8a6cb 100644 Binary files a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_slimeball.png and b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_slimeball.png differ diff --git a/mods/ITEMS/mcl_mobspawners/README.md b/mods/ITEMS/mcl_mobspawners/README.md index 12cc5aee..26ac3938 100644 --- a/mods/ITEMS/mcl_mobspawners/README.md +++ b/mods/ITEMS/mcl_mobspawners/README.md @@ -1,14 +1,14 @@ -This mod adds a monster spawner for MineClone 2. -Monsters will appear around the monster spawner in semi-regular intervals. +This mod adds a mob spawner for MineClone 2. +Monsters will appear around the mob spawner in semi-regular intervals. This mod is originally based on the mob spawner from Mobs Redo by TenPlus1 but has been modified quite a lot to fit the needs of MineClone 2. -Players can get a monster spawner by `giveme` and is initially empty after +Players can get a mob spawner by `giveme` and is initially empty after placing. ## Programmer notes -To set the mob spawned by a monster spawner, first place the monster spawner +To set the mob spawned by a mob spawner, first place the mob spawner (e.g. with `minetest.set_node`), then use the function `mcl_mobspawners.setup_spawner` to set its attributes. See the comment in `init.lua` for more info. diff --git a/mods/ITEMS/mcl_mobspawners/depends.txt b/mods/ITEMS/mcl_mobspawners/depends.txt index 72e19e86..dc1a03b8 100644 --- a/mods/ITEMS/mcl_mobspawners/depends.txt +++ b/mods/ITEMS/mcl_mobspawners/depends.txt @@ -1,2 +1,2 @@ mcl_sounds -mobs +mcl_mobs diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index f6e9fc07..39abd722 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -1,19 +1,23 @@ -local S = mobs.intllib +local S = minetest.get_translator("mcl_mobspawners") mcl_mobspawners = {} local default_mob = "mobs_mc:pig" --- Monster spawner +-- Mob spawner local spawner_default = default_mob.." 0 15 4 15" local function get_mob_textures(mob) - -- FIXME: Ummm … wtf? Why isn't there a textures attribute? - return minetest.registered_entities[mob].texture_list[1] + local list = minetest.registered_entities[mob].texture_list + if type(list[1]) == "table" then + return list[1] + else + return list + end end local function find_doll(pos) - for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do if not obj:is_player() then if obj ~= nil and obj:get_luaentity().name == "mcl_mobspawners:doll" then return obj @@ -27,21 +31,62 @@ local function spawn_doll(pos) return minetest.add_entity({x=pos.x, y=pos.y-0.3, z=pos.z}, "mcl_mobspawners:doll") end +-- Manually set the doll sizes for large mobs +-- TODO: Relocate this code to mobs_mc +local doll_size_overrides = { + ["mobs_mc:guardian"] = { x = 0.6, y = 0.6 }, + ["mobs_mc:guardian_elder"] = { x = 0.72, y = 0.72 }, + ["mobs_mc:enderman"] = { x = 0.8, y = 0.8 }, + ["mobs_mc:iron_golem"] = { x = 0.9, y = 0.9 }, + ["mobs_mc:ghast"] = { x = 1.05, y = 1.05 }, + ["mobs_mc:wither"] = { x = 1.2, y = 1.2 }, + ["mobs_mc:enderdragon"] = { x = 0.16, y = 0.16 }, + ["mobs_mc:witch"] = { x = 0.95, y = 0.95 }, +} +local spawn_count_overrides = { + ["mobs_mc:enderdragon"] = 1, + ["mobs_mc:wither"] = 1, + ["mobs_mc:ghast"] = 1, + ["mobs_mc:guardian_elder"] = 1, + ["mobs_mc:guardian"] = 2, + ["mobs_mc:iron_golem"] = 2, +} + local function set_doll_properties(doll, mob) local mobinfo = minetest.registered_entities[mob] + local xs, ys + if doll_size_overrides[mob] then + xs = doll_size_overrides[mob].x + ys = doll_size_overrides[mob].y + else + xs = mobinfo.visual_size.x * 0.33333 + ys = mobinfo.visual_size.y * 0.33333 + end local prop = { mesh = mobinfo.mesh, textures = get_mob_textures(mob), visual_size = { - x = mobinfo.visual_size.x * 0.33333, - y = mobinfo.visual_size.y * 0.33333, + x = xs, + y = ys, } } doll:set_properties(prop) doll:get_luaentity()._mob = mob end - +local function respawn_doll(pos) + local meta = minetest.get_meta(pos) + local mob = meta:get_string("Mob") + local doll + if mob and mob ~= "" then + doll = find_doll(pos) + if not doll then + doll = spawn_doll(pos) + set_doll_properties(doll, mob) + end + end + return doll +end --[[ Public function: Setup the spawner at pos. This function blindly assumes there's actually a spawner at pos. @@ -57,7 +102,7 @@ All the arguments are optional! ]] function mcl_mobspawners.setup_spawner(pos, Mob, MinLight, MaxLight, MaxMobsInArea, PlayerDistance, YOffset) - -- Activate monster spawner and disable editing functionality + -- Activate mob spawner and disable editing functionality if Mob == nil then Mob = default_mob end if MinLight == nil then MinLight = 0 end if MaxLight == nil then MaxLight = 15 end @@ -72,8 +117,11 @@ function mcl_mobspawners.setup_spawner(pos, Mob, MinLight, MaxLight, MaxMobsInAr meta:set_int("PlayerDistance", PlayerDistance) meta:set_int("YOffset", YOffset) - -- Create doll - local doll = spawn_doll(pos) + -- Create doll or replace existing doll + local doll = find_doll(pos) + if not doll then + doll = spawn_doll(pos) + end set_doll_properties(doll, Mob) @@ -82,9 +130,9 @@ function mcl_mobspawners.setup_spawner(pos, Mob, MinLight, MaxLight, MaxMobsInAr t:start(2) end --- Spawn monsters around pos +-- Spawn mobs around pos -- NOTE: The node is timer-based, rather than ABM-based. -local spawn_monsters = function(pos, elapsed) +local spawn_mobs = function(pos, elapsed) -- get meta local meta = minetest.get_meta(pos) @@ -104,7 +152,7 @@ local spawn_monsters = function(pos, elapsed) -- are we spawning a registered mob? if not mobs.spawning_mobs[mob] then - minetest.log("error", "[mcl_mobspawners] Monster Spawner: Mob doesn't exist: "..mob) + minetest.log("error", "[mcl_mobspawners] Mob Spawner: Mob doesn't exist: "..mob) return end @@ -141,9 +189,9 @@ local spawn_monsters = function(pos, elapsed) end --[[ HACK! - The doll may not stay spawned if the monster spawner is placed far away from + The doll may not stay spawned if the mob spawner is placed far away from players, so we will check for its existance periodically when a player is nearby. - This would happen almost always when the monster spawner is placed by the mapgen. + This would happen almost always when the mob spawner is placed by the mapgen. This is probably caused by a Minetest bug: https://github.com/minetest/minetest/issues/4759 FIXME: Fix this horrible hack. @@ -178,7 +226,11 @@ local spawn_monsters = function(pos, elapsed) -- spawn up to 4 mobs in random air blocks if air then - for a=1, 4 do + local max = 4 + if spawn_count_overrides[mob] then + max = spawn_count_overrides[mob] + end + for a=1, max do if #air <= 0 then -- We're out of space! Stop spawning break @@ -202,7 +254,7 @@ local spawn_monsters = function(pos, elapsed) end --- The monster spawner node. +-- The mob spawner node. -- PLACEMENT INSTRUCTIONS: -- If this node is placed by a player, minetest.item_place, etc. default settings are applied -- automatially. @@ -212,16 +264,35 @@ minetest.register_node("mcl_mobspawners:spawner", { tiles = {"mob_spawner.png"}, drawtype = "glasslike", paramtype = "light", - sunlight_propagates = true, walkable = true, - description = S("Monster Spawner"), - _doc_items_longdesc = S("A monster spawner is a block which regularily causes monsters and animals to appear around it."), - groups = {pickaxey=1, not_in_creative_inventory = 1, material_stone=1}, + description = S("Mob Spawner"), + _tt_help = S("Makes mobs appear"), + _doc_items_longdesc = S("A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light."), + _doc_items_usagehelp = S("If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level."), + groups = {pickaxey=1, material_stone=1, deco_block=1}, is_ground_content = false, drop = "", -- If placed by player, setup spawner with default settings on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if placer and not placer: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, placer, itemstack) or itemstack + end + end + + local name = placer:get_player_name() + local privs = minetest.get_player_privs(name) + if not privs.maphack then + minetest.chat_send_player(name, "Placement denied. You need the “maphack” privilege to place mob spawners.") + return itemstack + end local node_under = minetest.get_node(pointed_thing.under) local new_itemstack, success = minetest.item_place(itemstack, placer, pointed_thing) if success then @@ -237,53 +308,22 @@ minetest.register_node("mcl_mobspawners:spawner", { end, on_destruct = function(pos) - local meta = minetest.get_meta(pos) + -- Remove doll (if any) local obj = find_doll(pos) if obj then obj:remove() end end, - on_timer = spawn_monsters, - - on_receive_fields = function(pos, formname, fields, sender) - - if not fields.text or fields.text == "" then - return - end - - local meta = minetest.get_meta(pos) - local comm = fields.text:split(" ") - local name = sender:get_player_name() - - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return - end - - local mob = comm[1] -- mob to spawn - local mlig = tonumber(comm[2]) -- min light - local xlig = tonumber(comm[3]) -- max light - local num = tonumber(comm[4]) -- total mobs in area - local pla = tonumber(comm[5]) -- player distance (0 to disable) - local yof = tonumber(comm[6]) or 0 -- Y offset to spawn mob - - if mob and mob ~= "" and mobs.spawning_mobs[mob] == true - and num and num >= 0 and num <= 10 - and mlig and mlig >= 0 and mlig <= 15 - and xlig and xlig >= 0 and xlig <= 15 - and pla and pla >=0 and pla <= 20 - and yof and yof > -10 and yof < 10 then - - mcl_mobspawners.setup_spawner(pos, mob, mlig, xlig, num, pla, yof) - else - minetest.chat_send_player(name, S("Mob Spawner settings failed!")) - minetest.chat_send_player(name, - S("Syntax: name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] distance[1-20] y_offset[-10 to 10]")) - end + on_punch = function(pos) + respawn_doll(pos) end, + + on_timer = spawn_mobs, + sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 25, + + _mcl_blast_resistance = 5, _mcl_hardness = 5, }) @@ -291,8 +331,8 @@ minetest.register_node("mcl_mobspawners:spawner", { local doll_def = { hp_max = 1, - physical = true, - collisionbox = {0,0,0,0,0,0}, + physical = false, + pointable = false, visual = "mesh", makes_footstep_sound = false, timer = 0, @@ -311,16 +351,16 @@ doll_def.on_activate = function(self, staticdata, dtime_s) mob = default_mob end set_doll_properties(self.object, mob) - self.object:setvelocity({x=0, y=0, z=0}) - self.object:setacceleration({x=0, y=0, z=0}) + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=0, z=0}) self.object:set_armor_groups({immortal=1}) end doll_def.on_step = function(self, dtime) -- Check if spawner is still present. If not, delete the entity - self.timer = self.timer + 0.01 - local n = minetest.get_node_or_nil(self.object:getpos()) + self.timer = self.timer + dtime + local n = minetest.get_node_or_nil(self.object:get_pos()) if self.timer > 1 then if n and n.name and n.name ~= "mcl_mobspawners:spawner" then self.object:remove() @@ -332,5 +372,14 @@ doll_def.on_punch = function(self, hitter) end minetest.register_entity("mcl_mobspawners:doll", doll_def) - +-- FIXME: Doll can get destroyed by /clearobjects +minetest.register_lbm({ + label = "Respawn mob spawner dolls", + name = "mcl_mobspawners:respawn_entities", + nodenames = { "mcl_mobspawners:spawner" }, + run_at_every_load = true, + action = function(pos, node) + respawn_doll(pos) + end, +}) diff --git a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.de.tr b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.de.tr new file mode 100644 index 00000000..315b432c --- /dev/null +++ b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_mobspawners +Mob Spawner=Mobspawner +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Ein Mobspawner lässt regelmäßig Mobs um ihn herum auftauchen, wenn sich ein Spieler in der Nähe befindet. Einige Mobspawner werden inaktiv, wenn sie sich im Licht befinden. +If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Wenn Sie ein Spawn-Ei haben, können Sie es benutzen, um den Mobtyp, der erzeugt wird, zu ändern. Platzieren Sie den Gegenstand einfach auf dem Mobspawner. Von Spielern manipulierte Mobspawner erzeugen immer Mobs, unabhängig von der Helligkeit. +Makes mobs appear=Lässt Mobs auftauchen diff --git a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.es.tr b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.es.tr new file mode 100644 index 00000000..2b6ff977 --- /dev/null +++ b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.es.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_mobspawners +Mob Spawner=Generador de criaturas +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Un generador de criaturas regularmente hace que aparezcan mobs a su alrededor mientras un jugador está cerca. Algunos reproductores de las criaturas están deshabilitados mientras están a la luz. +If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Si tienes un huevo de desove, puedes usarlo para cambiar las criaturas a desovar. Simplemente coloque el artículo en el generador de criaturas. Los generadores de criaturas establecidos por el jugador siempre generan monstruos independientemente del nivel de luz. diff --git a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.fr.tr b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.fr.tr new file mode 100644 index 00000000..f008ad83 --- /dev/null +++ b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_mobspawners +Mob Spawner=Générateur de Mob +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Un générateur de mob fait régulièrement apparaître des mobs autour de lui tandis qu'un joueur est à proximité. Certains générateurs de mob sont désactivés lorsqu'ils sont en lumière. +If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Si vous avez un oeuf d'apparition, vous pouvez l'utiliser pour changer le mob qui apparait. Placez simplement l'objet sur le générateur de mob. Les générateurs de mobs créés par les joueurs engendrent toujours des mobs quel que soit le niveau de lumière. +Makes mobs appear=Fait apparaître les mobs diff --git a/mods/ITEMS/mcl_mobspawners/locale/template.txt b/mods/ITEMS/mcl_mobspawners/locale/template.txt new file mode 100644 index 00000000..82357e5f --- /dev/null +++ b/mods/ITEMS/mcl_mobspawners/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_mobspawners +Mob Spawner= +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.= +If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.= +Makes mobs appear= diff --git a/mods/ITEMS/mcl_mobspawners/textures/mob_spawner.png b/mods/ITEMS/mcl_mobspawners/textures/mob_spawner.png index 8464193c..069a015e 100644 Binary files a/mods/ITEMS/mcl_mobspawners/textures/mob_spawner.png and b/mods/ITEMS/mcl_mobspawners/textures/mob_spawner.png differ diff --git a/mods/ITEMS/mcl_monster_eggs/depends.txt b/mods/ITEMS/mcl_monster_eggs/depends.txt index fde951c9..d867036e 100644 --- a/mods/ITEMS/mcl_monster_eggs/depends.txt +++ b/mods/ITEMS/mcl_monster_eggs/depends.txt @@ -1,3 +1,2 @@ mcl_sounds mobs_mc -intllib? diff --git a/mods/ITEMS/mcl_monster_eggs/description.txt b/mods/ITEMS/mcl_monster_eggs/description.txt index 23ee58b0..ae7cab25 100644 --- a/mods/ITEMS/mcl_monster_eggs/description.txt +++ b/mods/ITEMS/mcl_monster_eggs/description.txt @@ -1 +1 @@ -Adds “monster eggs”. These are blocks which disguise themselves as stone blocks and spawn a silverfish when broken. +Adds infested blocks: Blocks which which disguise themselves as stone blocks and spawn a silverfish when broken. diff --git a/mods/ITEMS/mcl_monster_eggs/init.lua b/mods/ITEMS/mcl_monster_eggs/init.lua index 417c0130..a4c0144d 100644 --- a/mods/ITEMS/mcl_monster_eggs/init.lua +++ b/mods/ITEMS/mcl_monster_eggs/init.lua @@ -1,9 +1,7 @@ -- Monster eggs! -- Blocks which spawn silverfish when destroyed. --- Intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP .. "/intllib.lua") +local S = minetest.get_translator("mcl_monster_eggs") local spawn_silverfish = function(pos, oldnode, oldmetadata, digger) if not minetest.settings:get_bool("creative_mode") then @@ -20,23 +18,24 @@ local register_block = function(subname, description, tiles, is_ground_content) description = description, tiles = tiles, is_ground_content = is_ground_content, - groups = {handy = 1, spawns_silverfish = 1, deco_block = 1}, + groups = {dig_immediate = 3, spawns_silverfish = 1, deco_block = 1}, drop = '', is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = spawn_silverfish, - _doc_items_longdesc = S("A monster egg is a block from which a silverfish will pop out when it is broken. It looks identical to its “normal” counterpart."), - _mcl_hardness = 0.75, - _mcl_blast_resistance = 3.75, + _tt_help = S("Hides a silverfish"), + _doc_items_longdesc = S("An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart."), + _mcl_hardness = 0, + _mcl_blast_resistance = 0.5, }) end -- Register all the monster egg blocks -register_block("stone", S("Stone Monster Egg"), {"default_stone.png"}, true) -register_block("cobble", S("Cobblestone Monster Egg"), {"default_cobble.png"}) -register_block("stonebrick", S("Stone Bricks Monster Egg"), {"default_stone_brick.png"}) -register_block("stonebrickcracked", S("Cracked Stone Bricks Monster Egg"), {"mcl_core_stonebrick_cracked.png"}) -register_block("stonebrickmossy", S("Mossy Stone Bricks Monster Egg"), {"mcl_core_stonebrick_mossy.png"}) -register_block("stonebrickcarved", S("Chiseled Stone Bricks Monster Egg"), {"mcl_core_stonebrick_carved.png"}) +register_block("stone", S("Infested Stone"), {"default_stone.png"}, true) +register_block("cobble", S("Infested Cobblestone"), {"default_cobble.png"}) +register_block("stonebrick", S("Infested Stone Bricks"), {"default_stone_brick.png"}) +register_block("stonebrickcracked", S("Infested Cracked Stone Bricks"), {"mcl_core_stonebrick_cracked.png"}) +register_block("stonebrickmossy", S("Infested Mossy Stone Bricks"), {"mcl_core_stonebrick_mossy.png"}) +register_block("stonebrickcarved", S("Infested Chiseled Stone Bricks"), {"mcl_core_stonebrick_carved.png"}) diff --git a/mods/ITEMS/mcl_monster_eggs/intllib.lua b/mods/ITEMS/mcl_monster_eggs/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/mods/ITEMS/mcl_monster_eggs/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr new file mode 100644 index 00000000..78c26bf7 --- /dev/null +++ b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_monster_eggs +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Ein verseuchter Block ist ein Block, aus dem ein Silberfischchen hinausfallen wird, wenn er zerbrochen wird. Er sieht identisch zu seinem normalen Pendant aus. +Infested Stone=Verseuchter Stein +Infested Cobblestone=Verseuchtes Kopfsteinpflaster +Infested Stone Bricks=Verseuchte Steinziegel +Infested Cracked Stone Bricks=Verseuchte rissige Steinziegel +Infested Mossy Stone Bricks=Verseuchte moosige Steinziegel +Infested Chiseled Stone Bricks=Verseuchte gemeißelte Steinziegel +Hides a silverfish=Verbirgt ein Silberfischchen diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.es.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.es.tr new file mode 100644 index 00000000..f35b4563 --- /dev/null +++ b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.es.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_monster_eggs +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Un bloque infestado es un bloque del que saldrá un pez plateado cuando se rompa. Se ve idéntico a su contraparte normal. +Infested Stone=Piedra infestada +Infested Cobblestone=Roca infestada +Infested Stone Bricks=Ladrillos de piedra infestados +Infested Cracked Stone Bricks=Ladrillos de piedra agrietados infestados +Infested Mossy Stone Bricks=Ladrillos de piedra musgosos infestados +Infested Chiseled Stone Bricks=Ladrillos de piedra cincelados infestados diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.fr.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.fr.tr new file mode 100644 index 00000000..fa2d204b --- /dev/null +++ b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.fr.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_monster_eggs +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Un bloc infesté est un bloc à partir duquel un Poisson d'Argent sortira lorsqu'il sera brisé. Il semble identique à son homologue normal. +Infested Stone=Roche Infestée +Infested Cobblestone=Pierre Infestée +Infested Stone Bricks=Pierre Taillée Infestée +Infested Cracked Stone Bricks=Pierre Taillée Craquelée Infestée +Infested Mossy Stone Bricks=Pierre Taillée Moussue Infestée +Infested Chiseled Stone Bricks=Pierre sculptée Infestée +Hides a silverfish=Cache un Poisson d'Argent diff --git a/mods/ITEMS/mcl_monster_eggs/locale/template.txt b/mods/ITEMS/mcl_monster_eggs/locale/template.txt new file mode 100644 index 00000000..8f420b61 --- /dev/null +++ b/mods/ITEMS/mcl_monster_eggs/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: mcl_monster_eggs +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.= +Infested Stone= +Infested Cobblestone= +Infested Stone Bricks= +Infested Cracked Stone Bricks= +Infested Mossy Stone Bricks= +Infested Chiseled Stone Bricks= +Hides a silverfish= diff --git a/mods/ITEMS/mcl_mushrooms/README.md b/mods/ITEMS/mcl_mushrooms/README.md index 54e03b7e..eefe3c3f 100644 --- a/mods/ITEMS/mcl_mushrooms/README.md +++ b/mods/ITEMS/mcl_mushrooms/README.md @@ -1,26 +1 @@ This mod adds small and huge mushrooms. Small mushrooms like to spread in darkness. - -## Itemstrings for huge mushrooms -You can obtain the huge mushroom blocks with the `give` or `giveme` commands. - -### Cap -* Huge Red Mushroom Cap Top: `mcl_mushrooms:red_mushroom_block_cap_top` -* Huge Red Mushroom Cap Corner: `mcl_mushrooms:red_mushroom_block_cap_corner` -* Huge Red Mushroom Cap Side: `mcl_mushrooms:red_mushroom_block_cap_side` -* Huge Brown Mushroom Cap Top: `mcl_mushrooms:brown_mushroom_block_cap_top` -* Huge Brown Mushroom Cap Corner: `mcl_mushrooms:brown_mushroom_block_cap_corner` -* Huge Brown Mushroom Cap Side: `mcl_mushrooms:brown_mushroom_block_cap_side` - -### Pores -* Huge Red Mushroom Pores: `mcl_mushrooms:red_mushroom_block_pores_full` -* Huge Brown Mushroom Pores: `mcl_mushrooms:brown_mushroom_block_pores_full` - -### Stem -* Huge Red Mushroom Stem `mcl_mushrooms:red_mushroom_block_stem` -* Huge Brown Mushroom Stem `mcl_mushrooms:brown_mushroom_block_stem` - -## Unnatural -* Huge Red Mushroom All-Faces Cap: `mcl_mushrooms:red_mushroom_block_cap_full` -* Huge Red Mushroom All-Faces Stem: `mcl_mushrooms:red_mushroom_block_stem_full` -* Huge Brown Mushroom All-Faces Cap: `mcl_mushrooms:brown_mushroom_block_cap_full` -* Huge Brown Mushroom All-Faces Stem: `mcl_mushrooms:brown_mushroom_block_stem_full` diff --git a/mods/ITEMS/mcl_mushrooms/huge.lua b/mods/ITEMS/mcl_mushrooms/huge.lua index 41fecfb5..6f962b27 100644 --- a/mods/ITEMS/mcl_mushrooms/huge.lua +++ b/mods/ITEMS/mcl_mushrooms/huge.lua @@ -1,8 +1,10 @@ +local S = minetest.get_translator("mcl_mushrooms") + local template = { - groups = {handy=1,axey=1, huge_mushroom = 1, building_block = 1, not_in_creative_inventory = 1, not_in_craft_guide=1, material_wood = 1 }, + groups = {handy=1,axey=1, building_block = 1, material_wood = 1, flammable = -1 }, sounds = mcl_sounds.node_sound_wood_defaults(), is_ground_content = true, - _mcl_blast_resistance = 1, + _mcl_blast_resistance = 0.2, _mcl_hardness = 0.2, } @@ -22,85 +24,197 @@ brown.drop = { } } -local register_mushroom = function(color, template, d_cap_top, d_cap_side, d_cap_corner, d_stem, d_pores, d_cap_all, d_stem_all, doc_items_entry_name, doc_items_longdesc) +-- Convert a number to a string with 6 binary digits +local function to_binary(num) + local binary = "" + while (num > 0) do + local remainder_binary = (num % 2) > 0 and 1 or 0 + binary = binary .. remainder_binary + num = math.floor(num/2) + end + binary = string.reverse(binary) + while (string.len(binary) < 6) do + binary = "0" .. binary + end + return binary +end - -- DV (Minecraft dava value) 14: Cap texture on all sides - local full = table.copy(template) - full.description = d_cap_all - full._doc_items_entry_name = doc_items_entry_name - full._doc_items_longdesc = doc_items_longdesc - full.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_full", full) +local register_mushroom = function(color, species_id, template, d_cap, d_stem, d_stem_all, longdesc_cap, longdesc_stem) - -- DV 0: Pores on all sides - local pores_full = table.copy(template) - pores_full.description = d_pores - pores_full._doc_items_create_entry = false - pores_full.tiles = { "mcl_mushrooms_mushroom_block_inside.png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_pores_full", pores_full) - - -- DV 15: Stem texture on all sides + -- Stem texture on all sides local stem_full = table.copy(template) stem_full.description = d_stem_all - stem_full._doc_items_create_entry = false + stem_full._doc_items_longdesc = S("This decorative block is like a huge mushroom stem, but with the stem texture on all sides.") stem_full.tiles = { "mcl_mushrooms_mushroom_block_skin_stem.png" } + stem_full.groups.huge_mushroom = species_id + stem_full.groups.huge_mushroom_stem = 2 minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem_full", stem_full) - -- DV 10: Stem + -- Stem local stem = table.copy(template) stem.description = d_stem - stem._doc_items_create_entry = false + stem._doc_items_longdesc = longdesc_stem stem.tiles = { "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_stem.png" } + stem.groups.huge_mushroom = species_id + stem.groups.huge_mushroom_stem = 1 minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem", stem) - -- DV 1, DV 3, DV 7, DV 9: Cap corner. Cap texture on top and two sides in a corner formation - local cap_corner = table.copy(template) - cap_corner.description = d_cap_corner - cap_corner._doc_items_create_entry = false - cap_corner.paramtype2 = "facedir" - cap_corner.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_"..color..".png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_corner", cap_corner) + -- Mushroom block (cap) + -- Each side can either be the cap or the pores texture. + -- Cubes have 6 sides, so there's a total of 2^6 = 64 combinations + for s=0,63 do + local block = table.copy(template) + local bin = to_binary(s) + if s == 63 then + -- All-faces cap. This block is exposed to the player + block.description = d_cap + block._doc_items_longdesc = longdesc_cap + block._doc_items_usagehelp = S("By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.") + block.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png" } - -- DV 5: Cap texture on top - local cap_top = table.copy(template) - cap_top.description = d_cap_top - cap_top._doc_items_create_entry = false - cap_top.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_top", cap_top) + block.on_construct = function(pos) + local sides = { + { { x= 0, y= 1, z= 0 }, 2 }, + { { x= 0, y=-1, z= 0 }, 1 }, + { { x= 1, y= 0, z= 0 }, 4 }, + { { x=-1, y= 0, z= 0 }, 3 }, + { { x= 0, y= 0, z= 1 }, 6 }, + { { x= 0, y= 0, z=-1 }, 5 }, + } - -- DV 2, DV 4, DV 6, DV 8: Cap texture on top and one side - local cap_side = table.copy(template) - cap_side.description = d_cap_side - cap_side._doc_items_create_entry = false - cap_side.paramtype2 = "facedir" - cap_side.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_"..color..".png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_side", cap_side) + -- Replace the side of a mushroom node. Returns the new node. + -- Or nil, if unchanged. + local replace_side = function(pos, node, side) + local bin = string.sub(node.name, -6) + if string.sub(bin, side, side) == "1" then + local new_bin + if side == 1 then + new_bin = "0" .. string.sub(bin, side+1, 6) + elseif side == 6 then + new_bin = string.sub(bin, 1, side-1) .. "0" + else + new_bin = string.sub(bin, 1, side-1) .. "0" .. string.sub(bin, side+1, 6) + end - -- Add entry aliases for the Help - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_pores_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full") - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_stem_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full") - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_stem", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full") - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_corner", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full") - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_top", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full") - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_side", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full") + return { name = string.sub(node.name, 1, -7) .. new_bin } + end + end + + local node = minetest.get_node(pos) + local species_self = minetest.get_item_group(node.name, "huge_mushroom") + local node_update = table.copy(node) + for i=1, #sides do + local neighbor = vector.add(pos, sides[i][1]) + local neighbor_node = minetest.get_node(neighbor) + local node_set = false + if minetest.get_item_group(neighbor_node.name, "huge_mushroom_cap") ~= 0 and minetest.get_item_group(neighbor_node.name, "huge_mushroom") == species_self then + + local i2 = sides[i][2] + local node_return = replace_side(pos, node_update, i) + if node_return then + node_update = node_return + node_set = true + end + local new_neighbor = replace_side(neighbor, neighbor_node, i2) + if new_neighbor then + minetest.set_node(neighbor, new_neighbor) + end + end + if node_set then + minetest.set_node(pos, node_update) + end + end + end + else + -- Cap block with pores on at least 1 side. + -- These blocks are used internally. + block._doc_items_create_entry = false + block.groups.not_in_creative_inventory = 1 + block.groups.not_in_craft_guide = 1 + block.tiles = {} + for t=1, string.len(bin) do + if string.sub(bin, t, t) == "1" then + block.tiles[t] = "mcl_mushrooms_mushroom_block_skin_"..color..".png" + else + block.tiles[t] = "mcl_mushrooms_mushroom_block_inside.png" + end + end + + if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_111111", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_"..bin) + end + end + + block.groups.huge_mushroom = species_id + block.groups.huge_mushroom_cap = s + + -- bin is a binary string with 6 digits. Each digit stands for the + -- texture of one of the sides, in the same order as the tiles parameter. + -- 0 = pores; 1 = cap. + minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_"..bin, block) end end -local longdesc_red = "Huge red mushroom blocks are the plant parts of huge red mushrooms. This includes caps, pores and stems of huge red mushrooms; and these blocks come in some variants." -local entry_name_red = "Huge Red Mushroom Block" -register_mushroom("red", red, "Huge Red Mushroom Cap Top", "Huge Red Mushroom Cap Side", "Huge Red Mushroom Cap Corner", "Huge Red Mushroom Stem", "Huge Red Mushroom Pores", "Huge Red Mushroom All-Faces Cap", "Huge Red Mushroom All-Faces Stem", entry_name_red, longdesc_red) +local longdesc_red = S("Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.") +local longdesc_red_stem = S("The stem part of a huge red mushroom.") +register_mushroom("red", 1, red, S("Huge Red Mushroom Block"), S("Huge Red Mushroom Stem"), S("Huge Red Mushroom All-Faces Stem"), longdesc_red, longdesc_red_stem) -local longdesc_brown = "Huge brown mushroom blocks are the plant parts of huge brown mushrooms. This includes caps, pores and stems of huge brown mushrooms; and these blocks come in some variants." -local entry_name_brown = "Huge Brown Mushroom Block" - -register_mushroom("brown", brown, "Huge Brown Mushroom Cap Top", "Huge Brown Mushroom Cap Side", "Huge Brown Mushroom Cap Corner", "Huge Brown Mushroom Stem", "Huge Brown Mushroom Pores", "Huge Brown Mushroom All-Faces Cap", "Huge Brown Mushroom All-Faces Stem", entry_name_brown, longdesc_brown) +local longdesc_brown = S("Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.") +local longdesc_brown_stem = S("The stem part of a huge brown mushroom.") +register_mushroom("brown", 2, brown, S("Huge Brown Mushroom Block"), S("Huge Brown Mushroom Stem"), S("Huge Brown Mushroom All-Faces Stem"), longdesc_brown, longdesc_brown_stem) minetest.register_craft({ type = "fuel", recipe = "group:huge_mushroom", burntime = 15, }) + +-- Legacy support +local colors = { "red", "brown" } +for c=1, 2 do + local color = colors[c] + minetest.register_alias("mcl_mushrooms:"..color.."_mushroom_block_cap_full", "mcl_mushrooms:"..color.."_mushroom_block_cap_111111") + minetest.register_alias("mcl_mushrooms:"..color.."_mushroom_block_cap_top", "mcl_mushrooms:"..color.."_mushroom_block_cap_100000") + minetest.register_alias("mcl_mushrooms:"..color.."_mushroom_block_pores_full", "mcl_mushrooms:"..color.."_mushroom_block_cap_000000") +end + +minetest.register_lbm({ + label = "Replace legacy mushroom cap blocks", + name = "mcl_mushrooms:replace_legacy_mushroom_caps", + nodenames = { "mcl_mushrooms:brown_mushroom_block_cap_corner", "mcl_mushrooms:brown_mushroom_block_cap_side", "mcl_mushrooms:red_mushroom_block_cap_corner", "mcl_mushrooms:red_mushroom_block_cap_side" }, + action = function(pos, node) + for c=1, 2 do + local color = colors[c] + if node.name == "mcl_mushrooms:"..color.."_mushroom_block_cap_side" then + if node.param2 == 0 then + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_100001"}) + elseif node.param2 == 1 then + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_100100"}) -- OK + elseif node.param2 == 2 then + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_100010"}) + elseif node.param2 == 3 then + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_101000"}) + else + -- Fallback + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_101111"}) + end + elseif node.name == "mcl_mushrooms:"..color.."_mushroom_block_cap_corner" then + if node.param2 == 0 then + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_101001"}) + elseif node.param2 == 1 then + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_100101"}) -- OK + elseif node.param2 == 2 then + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_100110"}) -- OK + elseif node.param2 == 3 then + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_101010"}) + else + -- Fallback + minetest.set_node(pos, {name = "mcl_mushrooms:"..color.."_mushroom_block_cap_101111"}) + end + end + end + end, +}) diff --git a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushroom.fr.tr b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushroom.fr.tr new file mode 100644 index 00000000..647b3644 --- /dev/null +++ b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushroom.fr.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_mushrooms +This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=Ce bloc décoratif ressemble à une tige de champignon géant, mais avec la texture de la tige de tous les côtés. +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Blocs de champignons rouges géants sont les parties du chapeau d'énormes champignons rouges. Il se compose d'une peau rouge et peut avoir des pores sur chacun de ses côtés. +The stem part of a huge red mushroom.=La partie tige d'un énorme champignon rouge. +Huge Red Mushroom Block=Bloc de Champignon Rouge Géant +Huge Red Mushroom Stem=Tige de Champignon Rouge Géant +Huge Red Mushroom All-Faces Stem=Tige de Champignon Rouge Géant avec Pores +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=D'énormes blocs de champignons bruns sont les parties du chapeau d'énormes champignons bruns. Il se compose d'une peau brune et peut avoir des pores sur chacun de ses côtés. +The stem part of a huge brown mushroom.=La partie tige d'un énorme champignon brun. +Huge Brown Mushroom Block=Bloc de Champignon Marron Géant +Huge Brown Mushroom Stem=Tige de Champignon Marron Géant +Huge Brown Mushroom All-Faces Stem=Tige de Champignon Marron Géant avec Pores +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Les champignons bruns sont des champignons qui poussent et se propagent dans l'obscurité, mais sont sensibles à la lumière. Ils sont non comestibles en tant que tels, mais ils peuvent être utilisés pour fabriquer des aliments. +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Les champignons rouges sont des champignons qui poussent et se propagent dans l'obscurité, mais sont sensibles à la lumière. Ils sont non comestibles en tant que tels, mais ils peuvent être utilisés pour fabriquer des aliments. +A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=Un seul champignon de cette espèce se propagera lentement au fil du temps vers un bloc opaque solide aléatoire avec un niveau de lumière de 12 ou moins dans un cube 3×3×3 autour du champignon. Il cesse de se propager lorsqu'il y a 5 champignons ou plus de la même espèce dans une zone de 9×3×9 blocs autour du champignon. +Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=Les champignons finiront par déraciner à un niveau de lumière de 12 ou plus. Sur le mycélium ou le podzol, ils survivent et se propagent à n'importe quel niveau de lumière. +This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=Ce champignon peut être placé sur le mycélium et le podzol à n'importe quel niveau de lumière. Il peut également être placé sur des blocs à la fois solides et opaques, tant que le niveau de lumière pendant la journée n'est pas supérieur à 12. +Brown Mushroom=Champignon Marron +Red Mushroom=Champignon Rouge +Mushroom Stew=Ragoût de Champignon +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Le ragoût de champignons est une soupe saine qui peut être consommée pour restaurer certains points de faim. +By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=En plaçant d'énormes blocs de champignons de la même espèce les uns à côté des autres, les côtés qui se touchent se transformeront en pores de façon permanente. +Grows on podzol, mycelium and other blocks=Pousse sur podzol, mycélium et autres blocs +Spreads in darkness=Se propage dans l'obscurité diff --git a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr new file mode 100644 index 00000000..55996ed4 --- /dev/null +++ b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_mushrooms +This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=Dieser dekorative Block ist wie ein Riesenpilzstängel, aber mit der Stängeltextur auf allen Seiten. +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Rote Riesenpilzblöcke sind die Kappenteile von roten Riesenpilzen. Sie bestehen aus einer roten Haut und können Poren an jede ihrer Seiten haben. +The stem part of a huge red mushroom.=Der Stängelteil eines roten Riesenpilzes. +Huge Red Mushroom Block=Roter Riesenpilzblock +Huge Red Mushroom Stem=Roter Riesenpilzstängel +Huge Red Mushroom All-Faces Stem=Roter allseitiger Riesenpilzstängel +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=Braune Riesenpilzblöcke sind die Kappenteile von braunen Riesenpilzen. Sie bestehen aus einer braunen Haut und können Poren an jede ihrer Seiten haben. +The stem part of a huge brown mushroom.=Der Stängelteil eines braunen Riesenpilzes. +Huge Brown Mushroom Block=Brauner Riesenpilzblock +Huge Brown Mushroom Stem=Brauner Riesenpilzstängel +Huge Brown Mushroom All-Faces Stem=Brauner allseitiger Riesenpilzstängel +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Braune Pilze wachsen und breiten sich in der Dunkelheit aus, aber sie sind lichtempfindlich. Als solche sind sie ungenießbar, aber sie können benutzt werden, um Lebensmittel herzustellen. +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Rote Pilze wachsen und breiten sich in der Dunkelheit aus, aber sie sind lichtempfindlich. Als solche sind sie ungenießbar, aber sie können benutzt werden, um Lebensmittel herzustellen. +A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=Ein einzelner Pilz dieser Art wird sich im Laufe der Zeit zu einem zufälligen festem undurchsichtigem Block mit einer Lichtstärke von 12 oder weniger in einem 3×3×3-Würfel um den Pilz hin ausbreiten. Er wird sich nicht weiter ausbreiten, wenn sich 5 oder mehr Pilze der gleichen Art innerhalb eines Bereichs von 9×3×9 Blöcken um den Pilz befinden. +Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=Pilze werden sich bei einer Lichtstärke von mindestens 12 irgendwann selbst entwurzeln. Auf Myzel oder Podsol überleben sie und breiten sich bei jeder Lichtstärke aus. +This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=Diser Pilz kann auf Myzel und Podsol in jeder Lichtstärke platziert werden. Er kann auch auf Blöcken platziert werden, die sowohl fest als auch undurchsichtig sind, solange die Lichtstärke des Tageslichts nicht höher als 12 ist. +Brown Mushroom=Brauner Pilz +Red Mushroom=Roter Pilz +Mushroom Stew=Pilzsuppe +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Pilzsuppe ist eine gesunde Suppe, die für ein paar Hungerpunkte konsumiert werden kann. +By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=Wenn Riesenpilzblöcke der selben Art nebeneinander platziert werden, werden sich die Seiten, die sich berühren, dauerhaft zu Poren verwandeln. +Grows on podzol, mycelium and other blocks=Wächst auf Podsol, Myzel und anderen Blöcken +Spreads in darkness=Breitet sich in der Dunkelheit aus diff --git a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.es.tr b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.es.tr new file mode 100644 index 00000000..fc81adf9 --- /dev/null +++ b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.es.tr @@ -0,0 +1,22 @@ +# textdomain: mcl_mushrooms +This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=Este bloque decorativo es como un gran tallo de hongo, pero con la textura del tallo en todos los lados. +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Enormes bloques de hongos rojos son las partes de la tapa de enormes hongos rojos. Consiste en una piel roja y puede tener poros en cada uno de sus lados. +The stem part of a huge red mushroom.=La parte del tallo de un champiñón rojo enorme. +Huge Red Mushroom Block=Bloque de champiñón rojo +Huge Red Mushroom Stem=Tallo de champiñón rojo +Huge Red Mushroom All-Faces Stem=Tallo de champiñón rojo (Todas las caras) +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=Braune Riesenpilzblöcke sind die Kappenteile von braunen Riesenpilzen. Sie bestehen aus einer braunen Haut und können Poren an jede ihrer Seiten haben. +The stem part of a huge brown mushroom.=Der Stängelteil eines braunen Riesenpilzes. +Huge Brown Mushroom Block=Bloque de champiñón marrón +Huge Brown Mushroom Stem=Tallo de champiñón marrón +Huge Brown Mushroom All-Faces Stem=Tallo de champiñón marrón (Todas las caras) +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Los hongos marrones son hongos que crecen y se propagan en la oscuridad, pero son sensibles a la luz. No son comestibles como tales, pero pueden usarse para fabricar alimentos. +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Los hongos rojos son hongos que crecen y se propagan en la oscuridad, pero son sensibles a la luz. No son comestibles como tales, pero pueden usarse para fabricar alimentos. +A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=Un solo hongo de esta especie se extenderá lentamente con el tiempo hacia un bloque opaco sólido aleatorio con un nivel de luz de 12 o menos en un cubo de 3 × 3 × 3 alrededor del hongo. Se detiene cuando hay 5 o más hongos de la misma especie dentro de un área de 9 × 3 × 9 bloques alrededor del hongo. +Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=Los hongos eventualmente se desarraigarán a un nivel de luz de 12 o más. En micelio o podzol, sobreviven y se propagan a cualquier nivel de luz. +This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=Este hongo se puede colocar sobre micelio y podzol a cualquier nivel de luz. También se puede colocar en bloques que sean sólidos y opacos, siempre que el nivel de luz durante el día no sea superior a 12. +Brown Mushroom=Champiñón marrón +Red Mushroom=Champiñón rojo +Mushroom Stew=Estofado de champiñones +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=El estofado de champiñones es una sopa saludable que se puede consumir para restaurar algunos puntos de hambre. +By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=Al colocar enormes bloques de hongos de la misma especie uno al lado del otro, los lados que se tocan se convertirán en poros permanentemente. diff --git a/mods/ITEMS/mcl_mushrooms/locale/template.txt b/mods/ITEMS/mcl_mushrooms/locale/template.txt new file mode 100644 index 00000000..41ebdaa8 --- /dev/null +++ b/mods/ITEMS/mcl_mushrooms/locale/template.txt @@ -0,0 +1,24 @@ +# textdomain: mcl_mushrooms +This decorative block is like a huge mushroom stem, but with the stem texture on all sides.= +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.= +The stem part of a huge red mushroom.= +Huge Red Mushroom Block= +Huge Red Mushroom Stem= +Huge Red Mushroom All-Faces Stem= +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.= +The stem part of a huge brown mushroom.= +Huge Brown Mushroom Block= +Huge Brown Mushroom Stem= +Huge Brown Mushroom All-Faces Stem= +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.= +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.= +A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.= +Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.= +This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.= +Brown Mushroom= +Red Mushroom= +Mushroom Stew= +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.= +By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.= +Grows on podzol, mycelium and other blocks= +Spreads in darkness= diff --git a/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_giant_brown.mts b/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_giant_brown.mts new file mode 100644 index 00000000..b74e7268 Binary files /dev/null and b/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_giant_brown.mts differ diff --git a/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_giant_red.mts b/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_giant_red.mts new file mode 100644 index 00000000..84e69810 Binary files /dev/null and b/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_giant_red.mts differ diff --git a/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_huge_brown.mts b/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_huge_brown.mts index 371e3c5a..431cf656 100644 Binary files a/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_huge_brown.mts and b/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_huge_brown.mts differ diff --git a/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_huge_red.mts b/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_huge_red.mts index c0c4a31f..57520bf6 100644 Binary files a/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_huge_red.mts and b/mods/ITEMS/mcl_mushrooms/schematics/mcl_mushrooms_huge_red.mts differ diff --git a/mods/ITEMS/mcl_mushrooms/small.lua b/mods/ITEMS/mcl_mushrooms/small.lua index 54b14d6c..8105386f 100644 --- a/mods/ITEMS/mcl_mushrooms/small.lua +++ b/mods/ITEMS/mcl_mushrooms/small.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_mushrooms") + local on_place = mcl_util.generate_on_place_plant_function(function(place_pos, place_node) local soil_node = minetest.get_node_or_nil({x=place_pos.x, y=place_pos.y-1, z=place_pos.z}) if not soil_node then return false end @@ -15,18 +17,21 @@ local on_place = mcl_util.generate_on_place_plant_function(function(place_pos, p return ((snn == "mcl_core:podzol" or snn == "mcl_core:podzol_snow" or snn == "mcl_core:mycelium" or snn == "mcl_core:mycelium_snow") or (light_ok and minetest.get_item_group(snn, "solid") == 1 and minetest.get_item_group(snn, "opaque") == 1)) end) -local longdesc_intro_brown = [[Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.]] -local longdesc_intro_red = [[Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.]] +local longdesc_intro_brown = S("Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.") +local longdesc_intro_red = S("Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.") -local longdesc_append = [[A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom. -Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.]] +local longdesc_append = S("A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.").."\n".. +S("Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.") -local usagehelp = "This mushroom can be placed on mycelium and podzol at any light level. They can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12." +local tt_help = S("Grows on podzol, mycelium and other blocks").."\n"..S("Spreads in darkness") + +local usagehelp = S("This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.") minetest.register_node("mcl_mushrooms:mushroom_brown", { - description = "Brown Mushroom", + description = S("Brown Mushroom"), _doc_items_longdesc = longdesc_intro_brown .. "\n\n" .. longdesc_append, _doc_items_usagehelp = usagehelp, + _tt_help = tt_help, drawtype = "plantlike", tiles = { "farming_mushroom_brown.png" }, inventory_image = "farming_mushroom_brown.png", @@ -47,9 +52,10 @@ minetest.register_node("mcl_mushrooms:mushroom_brown", { }) minetest.register_node("mcl_mushrooms:mushroom_red", { - description = "Red Mushroom", + description = S("Red Mushroom"), _doc_items_longdesc = longdesc_intro_red .. "\n\n" .. longdesc_append, _doc_items_usagehelp = usagehelp, + _tt_help = tt_help, drawtype = "plantlike", tiles = { "farming_mushroom_red.png" }, inventory_image = "farming_mushroom_red.png", @@ -69,8 +75,8 @@ minetest.register_node("mcl_mushrooms:mushroom_red", { }) minetest.register_craftitem("mcl_mushrooms:mushroom_stew", { - description = "Mushroom Stew", - _doc_items_longdesc = "Mushroom stew is a healthy soup which can be consumed to restore some hunger points.", + description = S("Mushroom Stew"), + _doc_items_longdesc = S("Mushroom stew is a healthy soup which can be consumed to restore some hunger points."), inventory_image = "farming_mushroom_stew.png", on_place = minetest.item_eat(6, "mcl_core:bowl"), on_secondary_use = minetest.item_eat(6, "mcl_core:bowl"), @@ -90,12 +96,15 @@ Code based on information gathered from Minecraft Wiki ]] minetest.register_abm({ - label = "Mushroom spread", + label = "Mushroom spread and death", nodenames = {"mcl_mushrooms:mushroom_brown", "mcl_mushrooms:mushroom_red"}, interval = 11, chance = 50, action = function(pos, node) - if minetest.get_node_light(pos, nil) > 12 then + local node_soil = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + -- Mushrooms uproot in light except on podzol or mycelium + if node_soil ~= "mcl_core:podzol" and node_soil ~= "mcl_core:mycelium" and + node_soil ~= "mcl_core:podzol_snow" and node_soil ~= "mcl_core:mycelium_snow" and minetest.get_node_light(pos, nil) > 12 then minetest.dig_node(pos) return end diff --git a/mods/ITEMS/mcl_mushrooms/textures/farming_mushroom_brown.png b/mods/ITEMS/mcl_mushrooms/textures/farming_mushroom_brown.png index 495eb9e2..15a35d5f 100644 Binary files a/mods/ITEMS/mcl_mushrooms/textures/farming_mushroom_brown.png and b/mods/ITEMS/mcl_mushrooms/textures/farming_mushroom_brown.png differ diff --git a/mods/ITEMS/mcl_mushrooms/textures/farming_mushroom_red.png b/mods/ITEMS/mcl_mushrooms/textures/farming_mushroom_red.png index a513d464..aab88ed2 100644 Binary files a/mods/ITEMS/mcl_mushrooms/textures/farming_mushroom_red.png and b/mods/ITEMS/mcl_mushrooms/textures/farming_mushroom_red.png differ diff --git a/mods/ITEMS/mcl_mushrooms/textures/mcl_mushrooms_mushroom_block_inside.png b/mods/ITEMS/mcl_mushrooms/textures/mcl_mushrooms_mushroom_block_inside.png index 06377fee..ccbad3d1 100644 Binary files a/mods/ITEMS/mcl_mushrooms/textures/mcl_mushrooms_mushroom_block_inside.png and b/mods/ITEMS/mcl_mushrooms/textures/mcl_mushrooms_mushroom_block_inside.png differ diff --git a/mods/ITEMS/mcl_mushrooms/textures/mcl_mushrooms_mushroom_block_skin_brown.png b/mods/ITEMS/mcl_mushrooms/textures/mcl_mushrooms_mushroom_block_skin_brown.png index 65d27c4c..9ce7af38 100644 Binary files a/mods/ITEMS/mcl_mushrooms/textures/mcl_mushrooms_mushroom_block_skin_brown.png and b/mods/ITEMS/mcl_mushrooms/textures/mcl_mushrooms_mushroom_block_skin_brown.png differ diff --git a/mods/ITEMS/mcl_nether/depends.txt b/mods/ITEMS/mcl_nether/depends.txt index 23488aae..96f253aa 100644 --- a/mods/ITEMS/mcl_nether/depends.txt +++ b/mods/ITEMS/mcl_nether/depends.txt @@ -2,6 +2,7 @@ mcl_core mcl_sounds mcl_util walkover -mcl_death_messages +mcl_death_messages? doc_items doc? +screwdriver? diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 2ca9d944..e7612c90 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -1,6 +1,15 @@ +local S = minetest.get_translator("mcl_nether") + +local mod_death_messages = minetest.get_modpath("mcl_death_messages") +local mod_screwdriver = minetest.get_modpath("screwdriver") ~= nil +local on_rotate +if mod_screwdriver then + on_rotate = screwdriver.rotate_3way +end + minetest.register_node("mcl_nether:glowstone", { - description = "Glowstone", - _doc_items_longdesc = "Glowstone is a naturally-glowing block which is home to the Nether.", + description = S("Glowstone"), + _doc_items_longdesc = S("Glowstone is a naturally-glowing block which is home to the Nether."), tiles = {"mcl_nether_glowstone.png"}, is_ground_content = true, stack_max = 64, @@ -14,42 +23,70 @@ minetest.register_node("mcl_nether:glowstone", { } }, paramtype = "light", - sunlight_propagates = true, - -- Real light level: 15 (but Minetest caps at 14) - light_source = 14, + light_source = minetest.LIGHT_MAX, sounds = mcl_sounds.node_sound_glass_defaults(), - _mcl_blast_resistance = 1.5, + _mcl_blast_resistance = 0.3, _mcl_hardness = 0.3, }) minetest.register_node("mcl_nether:quartz_ore", { - description = "Nether Quartz Ore", - _doc_items_longdesc = "Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.", + description = S("Nether Quartz Ore"), + _doc_items_longdesc = S("Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether."), stack_max = 64, tiles = {"mcl_nether_quartz_ore.png"}, is_ground_content = true, groups = {pickaxey=1, building_block=1, material_stone=1}, drop = 'mcl_nether:quartz', sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 15, + _mcl_blast_resistance = 3, _mcl_hardness = 3, }) +-- For eternal fire on top of netherrack and magma blocks +-- (this code does not require a dependency on mcl_fire) +local eternal_after_destruct = function(pos, oldnode) + pos.y = pos.y + 1 + if minetest.get_node(pos).name == "mcl_fire:eternal_fire" then + minetest.remove_node(pos) + end +end +local eternal_on_ignite = function(player, pointed_thing) + local pos = pointed_thing.under + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + local fn = minetest.get_node(flame_pos) + local pname = player:get_player_name() + if minetest.is_protected(flame_pos, pname) then + minetest.record_protection_violation(flame_pos, pname) + return + end + if fn.name == "air" and pointed_thing.under.y < pointed_thing.above.y then + minetest.set_node(flame_pos, {name = "mcl_fire:eternal_fire"}) + return true + else + return false + end +end + minetest.register_node("mcl_nether:netherrack", { - description = "Netherrack", - _doc_items_longdesc = "Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.", + description = S("Netherrack"), + _doc_items_longdesc = S("Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire."), stack_max = 64, tiles = {"mcl_nether_netherrack.png"}, is_ground_content = true, groups = {pickaxey=1, building_block=1, material_stone=1, enderman_takable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 2, + _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, + + -- Eternal fire on top + after_destruct = eternal_after_destruct, + _on_ignite = eternal_on_ignite, }) minetest.register_node("mcl_nether:magma", { - description = "Magma Block", - _doc_items_longdesc = "Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.", + description = S("Magma Block"), + _tt_help = minetest.colorize("#FFFF00", S("Burns your feet")), + _doc_items_longdesc = S("Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire."), stack_max = 64, tiles = {{name="mcl_nether_magma.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=1.5}}}, is_ground_content = true, @@ -61,17 +98,24 @@ minetest.register_node("mcl_nether:magma", { on_walk_over = function(loc, nodeiamon, player) -- Hurt players standing on top of this block if player:get_hp() > 0 then - mcl_death_messages.player_damage(player, string.format("%s stood too long on a magma block.", player:get_player_name())) - player:set_hp(player:get_hp() - 1) + if mod_death_messages then + mcl_death_messages.player_damage(player, S("@1 stood too long on a magma block.", player:get_player_name())) + end + player:set_hp(player:get_hp() - 1, { type = "punch", from = "mod" }) end end, - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, + + -- Eternal fire on top + after_destruct = eternal_after_destruct, + _on_ignite = eternal_on_ignite, }) minetest.register_node("mcl_nether:soul_sand", { - description = "Soul Sand", - _doc_items_longdesc = "Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.", + description = S("Soul Sand"), + _tt_help = S("Reduces walking speed"), + _doc_items_longdesc = S("Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block."), stack_max = 64, tiles = {"mcl_nether_soul_sand.png"}, is_ground_content = true, @@ -81,41 +125,41 @@ minetest.register_node("mcl_nether:soul_sand", { fixed = { -0.5, -0.5, -0.5, 0.5, 0.5 - 2/16, 0.5 }, }, sounds = mcl_sounds.node_sound_sand_defaults(), - _mcl_blast_resistance = 2.5, + _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, -- Movement handling is done in mcl_playerplus mod }) minetest.register_node("mcl_nether:nether_brick", { -- Original name: Nether Brick - description = "Nether Brick Block", + description = S("Nether Brick Block"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, tiles = {"mcl_nether_nether_brick.png"}, is_ground_content = false, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) minetest.register_node("mcl_nether:red_nether_brick", { -- Original name: Red Nether Brick - description = "Red Nether Brick Block", + description = S("Red Nether Brick Block"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, tiles = {"mcl_nether_red_nether_brick.png"}, is_ground_content = false, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) minetest.register_node("mcl_nether:nether_wart_block", { - description = "Nether Wart Block", - _doc_items_longdesc = "A nether wart block is a purely decorational block made from nether wart.", + description = S("Nether Wart Block"), + _doc_items_longdesc = S("A nether wart block is a purely decorative block made from nether wart."), stack_max = 64, tiles = {"mcl_nether_nether_wart_block.png"}, is_ground_content = false, @@ -126,36 +170,36 @@ minetest.register_node("mcl_nether:nether_wart_block", { dug={name="default_dirt_footstep", gain=1.5}, } ), - _mcl_blast_resistance = 5, + _mcl_blast_resistance = 1, _mcl_hardness = 1, }) minetest.register_node("mcl_nether:quartz_block", { - description = "Block of Quartz", + description = S("Block of Quartz"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) minetest.register_node("mcl_nether:quartz_chiseled", { - description = "Chiseled Quartz Block", + description = S("Chiseled Quartz Block"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_side.png"}, groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) minetest.register_node("mcl_nether:quartz_pillar", { - description = "Pillar Quartz Block", + description = S("Pillar Quartz Block"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, paramtype2 = "facedir", @@ -164,31 +208,41 @@ minetest.register_node("mcl_nether:quartz_pillar", { tiles = {"mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_side.png"}, groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4, + on_rotate = on_rotate, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, +}) +minetest.register_node("mcl_nether:quartz_smooth", { + description = S("Smooth Quartz"), + _doc_items_longdesc = doc.sub.items.temp.build, + stack_max = 64, + is_ground_content = false, + tiles = {"mcl_nether_quartz_block_bottom.png"}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) - - minetest.register_craftitem("mcl_nether:glowstone_dust", { - description = "Glowstone Dust", - _doc_items_longdesc = "Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting and brewing.", + description = S("Glowstone Dust"), + _doc_items_longdesc = S("Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting."), inventory_image = "mcl_nether_glowstone_dust.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_nether:quartz", { - description = "Nether Quartz", - _doc_items_longdesc = "Nether quartz is a versatile crafting ingredient.", + description = S("Nether Quartz"), + _doc_items_longdesc = S("Nether quartz is a versatile crafting ingredient."), inventory_image = "mcl_nether_quartz.png", stack_max = 64, groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_nether:netherbrick", { - description = "Nether Brick", - _doc_items_longdesc = "Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.", + description = S("Nether Brick"), + _doc_items_longdesc = S("Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences."), inventory_image = "mcl_nether_netherbrick.png", stack_max = 64, groups = { craftitem = 1 }, diff --git a/mods/ITEMS/mcl_nether/lava.lua b/mods/ITEMS/mcl_nether/lava.lua index f6049f4c..ba76b749 100644 --- a/mods/ITEMS/mcl_nether/lava.lua +++ b/mods/ITEMS/mcl_nether/lava.lua @@ -1,11 +1,12 @@ -- Lava in the Nether +local S = minetest.get_translator("mcl_nether") -- TODO: Increase flow speed. This could be done by reducing viscosity, -- but this would also allow players to swim faster in lava. local lava_src_def = table.copy(minetest.registered_nodes["mcl_core:lava_source"]) -lava_src_def.description = "Still Nether Lava" +lava_src_def.description = S("Nether Lava Source") lava_src_def._doc_items_create_entry = false lava_src_def._doc_items_entry_name = nil lava_src_def._doc_items_longdesc = nil @@ -16,7 +17,7 @@ lava_src_def.liquid_alternative_flowing = "mcl_nether:nether_lava_flowing" minetest.register_node("mcl_nether:nether_lava_source", lava_src_def) local lava_flow_def = table.copy(minetest.registered_nodes["mcl_core:lava_flowing"]) -lava_flow_def.description = "Flowing Nether Lava" +lava_flow_def.description = S("Flowing Nether Lava") lava_flow_def._doc_items_create_entry = false lava_flow_def.liquid_range = 7 lava_flow_def.liquid_alternative_flowing = "mcl_nether:nether_lava_flowing" diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr new file mode 100644 index 00000000..f81f381e --- /dev/null +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr @@ -0,0 +1,40 @@ +# textdomain: mcl_nether +Glowstone=Leuchtstein +Glowstone is a naturally-glowing block which is home to the Nether.=Leuchtstein ist ein Block aus dem Nether. Er leuchtet von Natur aus hell. +Nether Quartz Ore=Nether-Quarzerz +Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=Nether-Quarzerz ist ein Erz, das Nethererz enthält. Es wird oft zwischen Netherrack im Nether gefunden. +Netherrack=Netherrack +Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=Netherrack ist ein gesteinsartiger Block aus dem Nether. Auf diesem Block wird ein Feuer immer ein ewiges Feuer sein. +Magma Block=Magmablock +Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Magmablöcke sind heiße feste Blöcke, die jeden, der auf ihm steht, verletzen, es sei denn, sie sind gegen Feuer immun. Auf diesem Block wird ein Feuer immer ein ewiges Feuer sein. +Soul Sand=Seelensand +Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=Seelensand ist ein Block aus dem Nether. Man kann auf ihm nur langsam gehen. Die Verlangsamung ist verstärkt, wenn sich der Seelensand auf Eis, Packeis oder einem Schleimblock befindet. +Nether Brick Block=Netherziegelblock +Red Nether Brick Block=Roter Netherziegelblock +Nether Wart Block=Netherwurzblock +A nether wart block is a purely decorative block made from nether wart.=Ein Netherwurzblock ist ein rein dekorativer Block aus Netherwurz. +Block of Quartz=Quarzblock +Chiseled Quartz Block=Gemeißelter Quarzblock +Pillar Quartz Block=Quarzsäulenblock +Smooth Quartz=Glatter Quarz +Glowstone Dust=Leuchtsteinstaub +Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=Leuchtsteinstaub ist das Staub aus zerbrochenen Leuchtsteinen. +Nether Quartz=Netherquarz +Nether quartz is a versatile crafting ingredient.=Netherquarz ist eine vielseitige Fertigungskomponente. +Nether Brick=Netherziegel +Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.=Netherziegel werden hauptsächlich zur Fertigung von Netherziegelblöcken und Netherzäunen benutzt. +Nether Lava Source=Netherlavaquelle +Flowing Nether Lava=Fließende Netherlava +@1 stood too long on a magma block.=@1 stand zu lange auf einem Magmablock. +Premature Nether Wart (Stage 1)=Junger Netherwurz (1. Stufe) +A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Ein junger Netherwurz wurde erst kürzlich auf Seelensand gepflanzt. Netherwurz wächst langsam auf Seelensand in 4 Stufen (die 2. und 3. Stufe sehen identisch aus). Obwohl Netherwurz im Nether beheimatet ist, wächst er in jeder Dimension. +Premature Nether Wart (Stage 2)=Junger Netherwurz (2. Stufe) +Premature Nether Wart (Stage 3)=Junger Netherwurz (3. Stufe) +Mature Nether Wart=Ausgewachsener Netherwurz +The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=Der ausgewachsene Netherwurz ist eine Pflanze aus dem Nether. Er hat seine volle Größe erreicht, ist erntereif und wächst nicht weiter. +Nether Wart=Netherwurz +Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Netherwurze sind Pflanzen, die im Nether beheimatet sind. Sie können auf Seelensand gepflanzt werden und wachsen in 4 Stufen. +Place this item on soul sand to plant it and watch it grow.=Platzieren Sie den Gegenstand auf Seelensand, um ihn zu pflanzen und sehen Sie dabei zu, wie es wächst. +Burns your feet=Verbrennt Ihre Füße +Grows on soul sand=Wächst auf Seelensand +Reduces walking speed=Reduziert das Schritttempo diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.es.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.es.tr new file mode 100644 index 00000000..046b95f2 --- /dev/null +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.es.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_nether +Glowstone=Piedra luminosa +Glowstone is a naturally-glowing block which is home to the Nether.=Glowstone es un bloque que brilla de forma natural y que lo alberga el Nether. +Nether Quartz Ore=Mena de cuarzo +Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=La mena de cuarzo es un mineral que contiene cuarzo inferior. Se encuentra comúnmente alrededor del tramo inferior en el Nether. +Netherrack=Netherrack +Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=Netherrack es un bloque de piedra que alberga el Nether. Comenzar un incendio en este bloque creará un fuego eterno. +Magma Block=Bloque de magma +Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Los bloques de magma son bloques sólidos y calientes que lastiman a cualquiera que esté parado sobre él, a menos que tengan resistencia al fuego. Comenzar un incendio en este bloque creará un fuego eterno. +Soul Sand=Arena de almas +Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=La arena del alma está a una cuadra del Nether. Uno solo puede caminar lentamente sobre la arena del alma. El efecto de desaceleración se amplifica cuando la arena del alma está encima del hielo, hielo empaquetado o un bloque de limo. +Nether Brick Block=Ladrillos del Nether +Red Nether Brick Block=Ladrillos del Nether rojos +Nether Wart Block=Bloque de verrugas del Nether +A nether wart block is a purely decorative block made from nether wart.=Un bloque de verruga inferior es un bloque puramente decorativo hecho de verruga inferior. +Block of Quartz=Bloque de cuarzo +Chiseled Quartz Block=Cuarzo cincelado +Pillar Quartz Block=Pilar de cuarzo +Smooth Quartz=Cuarzo liso +Glowstone Dust=Polvo de piedra luminosa +Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=El polvo de piedra luminosa es el polvo que sale de las piedras luminiscentes rotas. Se utiliza principalmente en la elaboración. +Nether Quartz=Infracuarzo +Nether quartz is a versatile crafting ingredient.=El cuarzo abisal es un ingrediente de elaboración versátil. +Nether Brick=Ladrillos del Nether +Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.=Los ladrillos abisales son el ingrediente principal para la elaboración de bloques de ladrillo y cercas inferiores. +Nether Lava Source=Fuente de lava del Nether +Flowing Nether Lava=Fuente de lava fluida del Nether +@1 stood too long on a magma block.=@1 permaneció demasiado tiempo sobre un bloque de magma. +Premature Nether Wart (Stage 1)=Verruga del Nether prematura (Etapa 1) +A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Recientemente se ha plantado una verruga inferior prematura en la arena del alma. La verruga abisal crece lentamente en la arena del alma en 4 etapas (la segunda y la tercera etapa son idénticas). Aunque la verruga inferior es el hogar del Nether, crece en cualquier dimensión. +Premature Nether Wart (Stage 2)=Verruga del Nether prematura (Etapa 2) +Premature Nether Wart (Stage 3)=Verruga del Nether prematura (Etapa 3) +Mature Nether Wart=Verruga del Nether madura +The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=La verruga inferior madura es una planta del Nether y alcanzó su tamaño completo y no crecerá más. Está listo para ser cosechado por sus artículos. +Nether Wart=Verruga del Nether +Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Las verrugas abisales son plantas que albergan al abismo Se pueden plantar en la arena del alma y crecer en 4 etapas. +Place this item on soul sand to plant it and watch it grow.=Coloque este artículo en la arena del alma para plantarlo y verlo crecer. diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr new file mode 100644 index 00000000..048072be --- /dev/null +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr @@ -0,0 +1,40 @@ +# textdomain: mcl_nether +Glowstone=Pierre Lumineuse +Glowstone is a naturally-glowing block which is home to the Nether.=La Pierre Lumineuse est un bloc naturellement brillant qui abrite le Nether. +Nether Quartz Ore=Minerai de quartz du Nether +Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=Le minerai de quartz du Nether est un minerai contenant du quartz du Nether. Il se trouve généralement autour du Néantrack dans le Nether. +Netherrack=Netherrack +Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=Netherrack est un bloc de pierre qui abrite le Nether. Démarrer un feu sur ce bloc créera un feu éternel. +Magma Block=Bloc de Magma +Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Les blocs de magma sont des blocs solides chauds qui blessent quiconque s'y tient, à moins qu'ils n'aient une résistance au feu. Démarrer un feu sur ce bloc créera un feu éternel. +@1 stood too long on a magma block.=@1 s'est tenu trop longtemps sur un bloc de magma. +Soul Sand=Sable des âmes +Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=Le sable de l'âme est un bloc du Nether. On ne peut que marcher lentement sur le sable de l'âme. L'effet de ralentissement est amplifié lorsque le sable de l'âme est au-dessus de la glace, de la glace tassée ou d'un bloc de slime. +Nether Brick Block=Brique du Nether +Red Nether Brick Block=Brique Rouge du Nether +Nether Wart Block=Bloc de Verrues du Nether +A nether wart block is a purely decorative block made from nether wart.=Un bloc de verrue du Nether est un bloc purement décoratif fabriqué à partir de verrue du Nether. +Block of Quartz=Bloc de Quartz +Chiseled Quartz Block=Bloc de Quartz sculpté +Pillar Quartz Block=Bloc de Quartz rayé +Smooth Quartz=Quartz Lisse +Glowstone Dust=Poudre Lumineuse +Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=La poudre lumineuse est la poussière qui sort des pierres incandescentes brisées. Il est principalement utilisé dans l'artisanat. +Nether Quartz=Quartz du Nether +Nether quartz is a versatile crafting ingredient.=Le quartz du Nether est un ingrédient artisanal polyvalent. +Nether Brick=Bric du Nether +Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.=Les briques du Nether sont le principal ingrédient de fabrication pour la fabrication de blocs de briques et de clôtures du Nether. +Nether Lava Source=Source de Lave du Nether +Flowing Nether Lava=Lave du Nether en Mouvement +Premature Nether Wart (Stage 1)=Verrue du Néant prématurée (étape 1) +A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Une verrue du Nether prématurée vient d'être plantée sur du sable d'âme. La verrue du Nether pousse lentement sur le sable de l'âme en 4 étapes (les deuxième et troisième étapes semblent identiques). Bien que la verrue du Nether habite le Nether, elle se développe dans toutes les dimensions. +Premature Nether Wart (Stage 2)=Verrue du Néant prématurée (étape 2) +Premature Nether Wart (Stage 3)=Verrue du Néant prématurée (étape 3) +Mature Nether Wart=Verrue du Néant Mature +The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=La verrue du Nether mature est une plante du Nether qui a atteint sa taille maximale et ne poussera plus. Il est prêt à être récolté pour ses articles. +Nether Wart=Verrues du Nether +Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Les verrues du Nether sont des plantes qui habitent le Nether. Ils peuvent être plantés sur du sable d'âme et se développer en 4 étapes. +Place this item on soul sand to plant it and watch it grow.=Placez cet article sur du sable d'âme pour le planter et regardez-le grandir. +Burns your feet=Vous brûle les pieds +Grows on soul sand=Pousse sur le sable de l'âme +Reduces walking speed=Réduit la vitesse de marche diff --git a/mods/ITEMS/mcl_nether/locale/template.txt b/mods/ITEMS/mcl_nether/locale/template.txt new file mode 100644 index 00000000..0d578faf --- /dev/null +++ b/mods/ITEMS/mcl_nether/locale/template.txt @@ -0,0 +1,40 @@ +# textdomain: mcl_nether +Glowstone= +Glowstone is a naturally-glowing block which is home to the Nether.= +Nether Quartz Ore= +Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.= +Netherrack= +Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.= +Magma Block= +Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.= +@1 stood too long on a magma block.= +Soul Sand= +Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.= +Nether Brick Block= +Red Nether Brick Block= +Nether Wart Block= +A nether wart block is a purely decorative block made from nether wart.= +Block of Quartz= +Chiseled Quartz Block= +Pillar Quartz Block= +Smooth Quartz= +Glowstone Dust= +Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.= +Nether Quartz= +Nether quartz is a versatile crafting ingredient.= +Nether Brick= +Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.= +Nether Lava Source= +Flowing Nether Lava= +Premature Nether Wart (Stage 1)= +A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.= +Premature Nether Wart (Stage 2)= +Premature Nether Wart (Stage 3)= +Mature Nether Wart= +The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.= +Nether Wart= +Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.= +Place this item on soul sand to plant it and watch it grow.= +Burns your feet= +Grows on soul sand= +Reduces walking speed= diff --git a/mods/ITEMS/mcl_nether/nether_wart.lua b/mods/ITEMS/mcl_nether/nether_wart.lua index 705fd059..7744a1fe 100644 --- a/mods/ITEMS/mcl_nether/nether_wart.lua +++ b/mods/ITEMS/mcl_nether/nether_wart.lua @@ -1,6 +1,8 @@ +local S = minetest.get_translator("mcl_nether") + minetest.register_node("mcl_nether:nether_wart_0", { - description = "Premature Nether Wart", - _doc_items_longdesc = "A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.", + description = S("Premature Nether Wart (Stage 1)"), + _doc_items_longdesc = S("A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension."), paramtype = "light", paramtype2 = "meshoptions", place_param2 = 3, @@ -8,6 +10,8 @@ minetest.register_node("mcl_nether:nether_wart_0", { drawtype = "plantlike", drop = "mcl_nether:nether_wart_item", tiles = {"mcl_nether_nether_wart_stage_0.png"}, + wield_image = "mcl_nether_nether_wart_stage_0.png", + inventory_image = "mcl_nether_nether_wart_stage_0.png", selection_box = { type = "fixed", fixed = { @@ -19,7 +23,7 @@ minetest.register_node("mcl_nether:nether_wart_0", { }) minetest.register_node("mcl_nether:nether_wart_1", { - description = "Premature Nether Wart (Stage 2)", + description = S("Premature Nether Wart (Stage 2)"), _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", @@ -28,6 +32,8 @@ minetest.register_node("mcl_nether:nether_wart_1", { drawtype = "plantlike", drop = "mcl_nether:nether_wart_item", tiles = {"mcl_nether_nether_wart_stage_1.png"}, + wield_image = "mcl_nether_nether_wart_stage_1.png", + inventory_image = "mcl_nether_nether_wart_stage_1.png", selection_box = { type = "fixed", fixed = { @@ -39,7 +45,7 @@ minetest.register_node("mcl_nether:nether_wart_1", { }) minetest.register_node("mcl_nether:nether_wart_2", { - description = "Premature Nether Wart (Stage 3)", + description = S("Premature Nether Wart (Stage 3)"), _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", @@ -48,6 +54,8 @@ minetest.register_node("mcl_nether:nether_wart_2", { drawtype = "plantlike", drop = "mcl_nether:nether_wart_item", tiles = {"mcl_nether_nether_wart_stage_1.png"}, + wield_image = "mcl_nether_nether_wart_stage_1.png", + inventory_image = "mcl_nether_nether_wart_stage_1.png", selection_box = { type = "fixed", fixed = { @@ -59,8 +67,8 @@ minetest.register_node("mcl_nether:nether_wart_2", { }) minetest.register_node("mcl_nether:nether_wart", { - description = "Mature Nether Wart", - _doc_items_longdesc = "The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.", + description = S("Mature Nether Wart"), + _doc_items_longdesc = S("The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items."), paramtype = "light", paramtype2 = "meshoptions", place_param2 = 3, @@ -75,6 +83,8 @@ minetest.register_node("mcl_nether:nether_wart", { }, }, tiles = {"mcl_nether_nether_wart_stage_2.png"}, + wield_image = "mcl_nether_nether_wart_stage_2.png", + inventory_image = "mcl_nether_nether_wart_stage_2.png", selection_box = { type = "fixed", fixed = { @@ -86,9 +96,10 @@ minetest.register_node("mcl_nether:nether_wart", { }) minetest.register_craftitem("mcl_nether:nether_wart_item", { - description = "Nether Wart", - _doc_items_longdesc = "Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 3 stages.", - _doc_items_usagehelp = "Place this item on soul sand to plant it and watch it grow.", + description = S("Nether Wart"), + _tt_help = S("Grows on soul sand"), + _doc_items_longdesc = S("Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages."), + _doc_items_usagehelp = S("Place this item on soul sand to plant it and watch it grow."), inventory_image = "mcl_nether_nether_wart.png", wield_image = "mcl_nether_nether_wart.png", on_place = function(itemstack, placer, pointed_thing) @@ -114,7 +125,7 @@ minetest.register_craftitem("mcl_nether:nether_wart_item", { -- Check if node above soil node allows placement if minetest.registered_items[minetest.get_node(placepos).name].buildable_to then -- Place nether wart - minetest.sound_play({name="default_place_node", gain=1.0}, {pos=placepos}) + minetest.sound_play({name="default_place_node", gain=1.0}, {pos=placepos}, true) minetest.set_node(placepos, {name="mcl_nether:nether_wart_0", param2 = 3}) if not minetest.settings:get_bool("creative_mode") then diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_glowstone.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_glowstone.png index d42c9c9c..43b1979e 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_glowstone.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_glowstone.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_nether_brick.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_nether_brick.png index 43a1af1b..66518323 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_nether_brick.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_nether_brick.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_nether_wart_stage_2.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_nether_wart_stage_2.png index 0478c760..75747835 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_nether_wart_stage_2.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_nether_wart_stage_2.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_netherbrick.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_netherbrick.png index 9d8c32d8..ce296092 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_netherbrick.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_netherbrick.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_netherrack.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_netherrack.png index 43b978c4..ead9c8c8 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_netherrack.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_netherrack.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_bottom.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_bottom.png index 2e522f8a..fd2bc570 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_bottom.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_bottom.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_side.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_side.png index 2e522f8a..013c4228 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_side.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_side.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_top.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_top.png index 2e522f8a..013c4228 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_top.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_top.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_chiseled_side.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_chiseled_side.png index 6029dace..e0e86ea8 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_chiseled_side.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_chiseled_side.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_chiseled_top.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_chiseled_top.png index a6bd3295..40117a88 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_chiseled_top.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_chiseled_top.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_ore.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_ore.png index ee9f5977..487316e2 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_ore.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_ore.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_pillar_side.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_pillar_side.png index 32dd3d8c..d46d33e8 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_pillar_side.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_pillar_side.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_pillar_top.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_pillar_top.png index 1b6fe45b..e91e1068 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_pillar_top.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_pillar_top.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_red_nether_brick.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_red_nether_brick.png index cd218288..7248b210 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_red_nether_brick.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_red_nether_brick.png differ diff --git a/mods/ITEMS/mcl_nether/textures/mcl_nether_soul_sand.png b/mods/ITEMS/mcl_nether/textures/mcl_nether_soul_sand.png index dcde3812..1aab3069 100644 Binary files a/mods/ITEMS/mcl_nether/textures/mcl_nether_soul_sand.png and b/mods/ITEMS/mcl_nether/textures/mcl_nether_soul_sand.png differ diff --git a/mods/ITEMS/mcl_ocean/corals.lua b/mods/ITEMS/mcl_ocean/corals.lua new file mode 100644 index 00000000..7b076c3e --- /dev/null +++ b/mods/ITEMS/mcl_ocean/corals.lua @@ -0,0 +1,315 @@ +local S = minetest.get_translator("mcl_ocean") +local mod_doc = minetest.get_modpath("doc") ~= nil + +local corals = { + { "tube", S("Tube Coral Block"), S("Dead Tube Coral Block"), S("Tube Coral"), S("Dead Tube Coral"), S("Tube Coral Fan"), S("Dead Tube Coral Fan") }, + { "brain", S("Brain Coral Block"), S("Dead Brain Coral Block"), S("Brain Coral"), S("Dead Brain Coral"), S("Brain Coral Fan"), S("Dead Brain Coral Fan") }, + { "bubble", S("Bubble Coral Block"), S("Dead Bubble Coral Block"), S("Bubble Coral"), S("Dead Bubble Coral"), S("Bubble Coral Fan"), S("Dead Bubble Coral Fan")}, + { "fire", S("Fire Coral Block"), S("Dead Fire Coral Block"), S("Fire Coral"), S("Dead Fire Coral"), S("Fire Coral Fan"), S("Dead Fire Coral Fan") }, + { "horn", S("Horn Coral Block"), S("Dead Horn Coral Block"), S("Horn Coral"), S("Dead Horn Coral"), S("Horn Coral Fan"), S("Dead Horn Coral Fan") }, +} + +local function coral_on_place(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 + + if pos_under.y >= pos_above.y then + return itemstack + end + + local g_block = minetest.get_item_group(node_under.name, "coral_block") + local g_coral = minetest.get_item_group(itemstack:get_name(), "coral") + local g_species_block = minetest.get_item_group(node_under.name, "coral_species") + local g_species_plant = minetest.get_item_group(itemstack:get_name(), "coral_species") + + -- Placement rules: + -- Coral plant can only be placed on top of a matching coral block. + if g_block == 0 or (g_coral ~= g_block) or (g_species_block ~= g_species_plant) then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.log("action", player_name + .. " tried to place " .. itemstack:get_name() + .. " at protected position " + .. minetest.pos_to_string(pos_under)) + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + node_under.name = itemstack:get_name() + node_under.param2 = minetest.registered_items[node_under.name].place_param2 or 1 + if node_under.param2 < 8 and math.random(1,2) == 1 then + -- Random horizontal displacement + node_under.param2 = node_under.param2 + 8 + end + minetest.set_node(pos_under, node_under) + local def_node = minetest.registered_nodes[node_under.name] + if def_node.sounds then + minetest.sound_play(def_node.sounds.place, { gain = 0.5, pos = pos_under }, true) + end + if not (minetest.settings:get_bool("creative_mode")) then + itemstack:take_item() + end + + return itemstack +end + +-- Sound for non-block corals +local sounds_coral_plant = mcl_sounds.node_sound_leaves_defaults({footstep = mcl_sounds.node_sound_dirt_defaults().footstep}) + +for c=1, #corals do + local id = corals[c][1] + local doc_desc_block = S("Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.") + local doc_desc_coral = S("Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.") + local doc_desc_fan = S("Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.") + local tt_block = S("Needs water to live") + local tt_coral_dead = S("Grows on coral block of same species") + local tt_coral = tt_coral_dead .. "\n" .. S("Needs water to live") + + -- Coral Block + minetest.register_node("mcl_ocean:"..id.."_coral_block", { + description = corals[c][2], + _doc_items_longdesc = doc_desc_block, + _tt_help = tt_block, + tiles = { "mcl_ocean_"..id.."_coral_block.png" }, + groups = { pickaxey = 1, building_block = 1, coral=1, coral_block=1, coral_species=c, }, + sounds = mcl_sounds.node_sound_dirt_defaults(), + drop = "mcl_ocean:dead_"..id.."_coral_block", + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + }) + minetest.register_node("mcl_ocean:dead_"..id.."_coral_block", { + description = corals[c][3], + _doc_items_create_entry = false, + tiles = { "mcl_ocean_dead_"..id.."_coral_block.png" }, + groups = { pickaxey = 1, building_block = 1, coral=2, coral_block=2, coral_species=c, }, + sounds = mcl_sounds.node_sound_dirt_defaults(), + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + }) + + -- Coral + minetest.register_node("mcl_ocean:"..id.."_coral", { + description = corals[c][4], + _doc_items_longdesc = doc_desc_coral, + _tt_help = tt_coral, + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 1, + tiles = { "mcl_ocean_"..id.."_coral_block.png" }, + special_tiles = { { name = "mcl_ocean_"..id.."_coral.png" } }, + inventory_image = "mcl_ocean_"..id.."_coral.png", + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -0.5, 0.5, -0.5, 0.5, 1.0, 0.5 }, + } + }, + groups = { dig_immediate = 3, deco_block = 1, coral=1, coral_plant=1, coral_species=c, }, + sounds = sounds_coral_plant, + drop = "mcl_ocean:dead_"..id.."_coral", + node_placement_prediction = "", + node_dig_prediction = "mcl_ocean:"..id.."_coral_block", + on_place = coral_on_place, + after_dig_node = function(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "coral") == 0 then + minetest.set_node(pos, {name="mcl_ocean:"..id.."_coral_block"}) + end + end, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + }) + minetest.register_node("mcl_ocean:dead_"..id.."_coral", { + description = corals[c][5], + _doc_items_create_entry = false, + _tt_help = tt_coral_dead, + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 1, + tiles = { "mcl_ocean_dead_"..id.."_coral_block.png" }, + special_tiles = { { name = "mcl_ocean_dead_"..id.."_coral.png" } }, + inventory_image = "mcl_ocean_dead_"..id.."_coral.png", + groups = { dig_immediate = 3, deco_block = 1, coral=2, coral_plant=2, coral_species=c, }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -0.5, 0.5, -0.5, 0.5, 1.0, 0.5 }, + } + }, + sounds = sounds_coral_plant, + node_placement_prediction = "", + node_dig_prediction = "mcl_ocean:dead_"..id.."_coral_block", + on_place = coral_on_place, + after_dig_node = function(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "coral") == 0 then + minetest.set_node(pos, {name="mcl_ocean:dead_"..id.."_coral_block"}) + end + end, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + }) + + -- Coral Fan + minetest.register_node("mcl_ocean:"..id.."_coral_fan", { + description = corals[c][6], + _doc_items_longdesc = doc_desc_fan, + _tt_help = tt_coral, + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 4, + tiles = { "mcl_ocean_"..id.."_coral_block.png" }, + special_tiles = { { name = "mcl_ocean_"..id.."_coral_fan.png" } }, + inventory_image = "mcl_ocean_"..id.."_coral_fan.png", + groups = { dig_immediate = 3, deco_block = 1, coral=1, coral_fan=1, coral_species=c, }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -0.5, 0.5, -0.5, 0.5, 1.0, 0.5 }, + } + }, + sounds = sounds_coral_plant, + drop = "mcl_ocean:dead_"..id.."_coral_fan", + node_placement_prediction = "", + node_dig_prediction = "mcl_ocean:"..id.."_coral_block", + on_place = coral_on_place, + after_dig_node = function(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "coral") == 0 then + minetest.set_node(pos, {name="mcl_ocean:"..id.."_coral_block"}) + end + end, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + }) + minetest.register_node("mcl_ocean:dead_"..id.."_coral_fan", { + description = corals[c][7], + _doc_items_create_entry = false, + _tt_help = tt_coral_dead, + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 4, + tiles = { "mcl_ocean_dead_"..id.."_coral_block.png" }, + special_tiles = { { name = "mcl_ocean_dead_"..id.."_coral_fan.png" } }, + inventory_image = "mcl_ocean_dead_"..id.."_coral_fan.png", + groups = { dig_immediate = 3, deco_block = 1, coral=2, coral_fan=2, coral_species=c, }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -0.5, 0.5, -0.5, 0.5, 1.0, 0.5 }, + } + }, + sounds = sounds_coral_plant, + node_placement_prediction = "", + node_dig_prediction = "mcl_ocean:dead_"..id.."_coral_block", + on_place = coral_on_place, + after_dig_node = function(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "coral") == 0 then + minetest.set_node(pos, {name="mcl_ocean:dead_"..id.."_coral_block"}) + end + end, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + }) + + if mod_doc then + doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral", "nodes", "mcl_ocean:"..id.."_coral") + doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral_fan", "nodes", "mcl_ocean:"..id.."_coral_fan") + doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral_block", "nodes", "mcl_ocean:"..id.."_coral_block") + doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral", "nodes", "mcl_ocean:dead_"..id.."_coral") + doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral_fan", "nodes", "mcl_ocean:dead_"..id.."_coral_fan") + doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral_block", "nodes", "mcl_ocean:dead_"..id.."_coral_block") + end +end + +-- Turn corals and coral fans to dead corals if not inside a water source +minetest.register_abm({ + label = "Coral plant / coral fan death", + nodenames = { "group:coral_plant", "group_coral_fan" }, + interval = 17, + chance = 5, + catch_up = false, + action = function(pos, node, active_object_count, active_object_count_wider) + -- Check if coral's alive + local coral_state = minetest.get_item_group(node.name, "coral") + if coral_state == 1 then + -- Check node above, here lives the actual plant (it's plantlike_rooted) + if minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name ~= "mcl_core:water_source" then + -- Find dead form (it's the same as the node's drop) + local def = minetest.registered_nodes[node.name] + local dead + if def then + node.name = def.drop + else + return + end + -- Set node to dead form. + minetest.set_node(pos, node) + end + end + end, +}) + +-- Turn corals blocks to dead coral blocks if not next to a water source +minetest.register_abm({ + label = "Coral block death", + nodenames = { "group:coral_block" }, + interval = 17, + chance = 5, + catch_up = false, + action = function(pos, node, active_object_count, active_object_count_wider) + -- Check if coral's alive + local coral_state = minetest.get_item_group(node.name, "coral") + if coral_state == 1 then + local posses = { + { 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 }, + { x=0,y=-1,z=0 }, + } + -- Check all 6 neighbors for water + for p=1, #posses do + local checknode = minetest.get_node(vector.add(pos, posses[p])) + if checknode.name == "mcl_core:water_source" then + -- Water found! Don't die. + return + end + end + -- Find dead form (it's the same as the node's drop) + local def = minetest.registered_nodes[node.name] + if def then + node.name = def.drop + else + return + end + -- Set node to dead form + minetest.set_node(pos, node) + end + end, +}) diff --git a/mods/ITEMS/mcl_ocean/depends.txt b/mods/ITEMS/mcl_ocean/depends.txt index 6c4ef5f3..66908e83 100644 --- a/mods/ITEMS/mcl_ocean/depends.txt +++ b/mods/ITEMS/mcl_ocean/depends.txt @@ -1,3 +1,6 @@ +mcl_core mcl_sounds mcl_dye -doc_items +doc? +doc_items? +screwdriver? diff --git a/mods/ITEMS/mcl_ocean/init.lua b/mods/ITEMS/mcl_ocean/init.lua index 82b8126a..2a103b8d 100644 --- a/mods/ITEMS/mcl_ocean/init.lua +++ b/mods/ITEMS/mcl_ocean/init.lua @@ -1,116 +1,14 @@ --- Nodes +-- Prismarine (includes sea lantern) +dofile(minetest.get_modpath(minetest.get_current_modname()).."/prismarine.lua") -minetest.register_node("mcl_ocean:sea_lantern", { - description = "Sea Lantern", - _doc_items_longdesc = "Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.", - paramtype2 = "facedir", - is_ground_content = false, - stack_max = 64, - -- Real light level: 15 (but Minetest caps at 14) - light_source = 14, - drop = { - max_items = 1, - items = { - { items = {'mcl_ocean:prismarine_crystals 3'}, rarity = 2 }, - { items = {'mcl_ocean:prismarine_crystals 2'}} - } - }, - tiles = {{name="mcl_ocean_sea_lantern.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=1.25}}}, - groups = {handy=1, building_block=1, material_glass=1}, - sounds = mcl_sounds.node_sound_glass_defaults(), - _mcl_blast_resistance = 1.5, - _mcl_hardness = 0.3, -}) +-- Corals +dofile(minetest.get_modpath(minetest.get_current_modname()).."/corals.lua") -minetest.register_node("mcl_ocean:prismarine", { - description = "Prismarine", - _doc_items_longdesc = "Prismarine is used as a building block. It slowly changes its color.", - stack_max = 64, - is_ground_content = false, - -- Texture should have 22 frames for smooth transitions. - tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, - _mcl_hardness = 1.5, -}) +-- Seagrass +dofile(minetest.get_modpath(minetest.get_current_modname()).."/seagrass.lua") -minetest.register_node("mcl_ocean:prismarine_brick", { - description = "Prismarine Bricks", - _doc_items_longdesc = doc.sub.items.temp.build, - stack_max = 64, - is_ground_content = false, - tiles = {"mcl_ocean_prismarine_bricks.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, - _mcl_hardness = 1.5, -}) - -minetest.register_node("mcl_ocean:prismarine_dark", { - description = "Dark Prismarine", - _doc_items_longdesc = doc.sub.items.temp.build, - stack_max = 64, - is_ground_content = false, - tiles = {"mcl_ocean_prismarine_dark.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 30, - _mcl_hardness = 1.5, -}) - --- Craftitems - -minetest.register_craftitem("mcl_ocean:prismarine_crystals", { - description = "Prismarine Crystals", - _doc_items_longdesc = doc.sub.items.temp.craftitem, - inventory_image = "mcl_ocean_prismarine_crystals.png", - stack_max = 64, - groups = { craftitem = 1 }, -}) - -minetest.register_craftitem("mcl_ocean:prismarine_shard", { - description = "Prismarine Shard", - _doc_items_longdesc = doc.sub.items.temp.craftitem, - inventory_image = "mcl_ocean_prismarine_shard.png", - stack_max = 64, - groups = { craftitem = 1 }, -}) - --- Crafting - -minetest.register_craft({ - output = 'mcl_ocean:sea_lantern', - recipe = { - {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_crystals', 'mcl_ocean:prismarine_shard'}, - {'mcl_ocean:prismarine_crystals', 'mcl_ocean:prismarine_crystals', 'mcl_ocean:prismarine_crystals'}, - {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_crystals', 'mcl_ocean:prismarine_shard'}, - } -}) - -minetest.register_craft({ - output = 'mcl_ocean:prismarine', - recipe = { - {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, - {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, - } -}) - -minetest.register_craft({ - output = 'mcl_ocean:prismarine_brick', - recipe = { - {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, - {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, - {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, - } -}) - -minetest.register_craft({ - output = 'mcl_ocean:prismarine_dark', - recipe = { - {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, - {'mcl_ocean:prismarine_shard', 'mcl_dye:black', 'mcl_ocean:prismarine_shard'}, - {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, - } -}) +-- Kelp +dofile(minetest.get_modpath(minetest.get_current_modname()).."/kelp.lua") +-- Sea Pickle +dofile(minetest.get_modpath(minetest.get_current_modname()).."/sea_pickle.lua") diff --git a/mods/ITEMS/mcl_ocean/kelp.lua b/mods/ITEMS/mcl_ocean/kelp.lua new file mode 100644 index 00000000..a79ec06a --- /dev/null +++ b/mods/ITEMS/mcl_ocean/kelp.lua @@ -0,0 +1,295 @@ +local S = minetest.get_translator("mcl_ocean") +local mod_doc = minetest.get_modpath("doc") ~= nil + +-- List of supported surfaces for seagrass and kelp +local surfaces = { + { "dirt", "mcl_core:dirt" }, + { "sand", "mcl_core:sand", 1 }, + { "redsand", "mcl_core:redsand", 1 }, + { "gravel", "mcl_core:gravel", 1 }, +} + +local function get_kelp_top(pos, node) + local size = math.ceil(node.param2 / 16) + local pos_water = table.copy(pos) + pos_water.y = pos_water.y + size + return pos_water, minetest.get_node(pos_water) +end + +local function get_submerged(node_water) + local def_water = minetest.registered_nodes[node_water.name] + -- Submerged in water? + if minetest.get_item_group(node_water.name, "water") then + if def_water.liquidtype == "source" then + return "source" + elseif def_water.liquidtype == "flowing" then + return "flowing" + end + end + return false +end + +local function grow_param2_step(param2, snap_into_grid) + local old_param2 = param2 + param2 = param2 + 16 + if param2 > 240 then + param2 = 240 + end + if snap_into_grid and (param2 % 16 ~= 0) then + param2 = param2 - (param2 % 16) + end + return param2, param2 ~= old_param2 +end + +local function kelp_on_place(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 node_above = minetest.get_node(pos_above) + local def_under = minetest.registered_nodes[node_under.name] + local def_above = minetest.registered_nodes[node_above.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 minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.log("action", player_name + .. " tried to place " .. itemstack:get_name() + .. " at protected position " + .. minetest.pos_to_string(pos_under)) + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + local grow_kelp = false + -- Select a kelp node when placed on surface node + if node_under.name == "mcl_core:dirt" then + node_under.name = "mcl_ocean:kelp_dirt" + elseif node_under.name == "mcl_core:sand" then + node_under.name = "mcl_ocean:kelp_sand" + elseif node_under.name == "mcl_core:redsand" then + node_under.name = "mcl_ocean:kelp_redsand" + elseif node_under.name == "mcl_core:gravel" then + node_under.name = "mcl_ocean:kelp_gravel" + elseif minetest.get_item_group(node_under.name, "kelp") == 1 then + -- Place kelp on kelp = grow kelp by 1 node length + node_under.param2, grow_kelp = grow_param2_step(node_under.param2) + if not grow_kelp then + return itemstack + end + else + return itemstack + end + local submerged = false + if grow_kelp then + -- Kelp placed on kelp ... + -- Kelp can be placed on top of another kelp to make it grow + if pos_under.y >= pos_above.y or pos_under.x ~= pos_above.x or pos_under.z ~= pos_above.z then + -- Placed on side or below node, abort + return itemstack + end + -- New kelp top must also be submerged in water source + local _, top_node = get_kelp_top(pos_under, node_under) + submerged = get_submerged(top_node) + if submerged ~= "source" then + -- Not submerged in water source, abort + return itemstack + end + else + -- New kelp placed ... + if pos_under.y >= pos_above.y then + -- Placed on side or below node, abort + return itemstack + end + -- Kelp can be placed inside a water source on top of a surface node + local g_above_water = minetest.get_item_group(node_above.name, "water") + if not (g_above_water ~= 0 and def_above.liquidtype == "source") then + return itemstack + -- TODO: Also allow placement into downwards flowing liquid + end + node_under.param2 = minetest.registered_items[node_under.name].place_param2 or 16 + end + -- Place or grow kelp + local def_node = minetest.registered_items[node_under.name] + if def_node.sounds then + minetest.sound_play(def_node.sounds.place, { gain = 0.5, pos = pos_under }, true) + end + minetest.set_node(pos_under, node_under) + if not (minetest.settings:get_bool("creative_mode")) then + itemstack:take_item() + end + + return itemstack +end + +minetest.register_craftitem("mcl_ocean:kelp", { + description = S("Kelp"), + _tt_help = S("Grows in water on dirt, sand, gravel"), + _doc_items_create_entry = false, + inventory_image = "mcl_ocean_kelp_item.png", + wield_image = "mcl_ocean_kelp_item.png", + on_place = kelp_on_place, + groups = { deco_block = 1 }, +}) + +-- Kelp nodes: kelp on a surface node + +for s=1, #surfaces do + local def = minetest.registered_nodes[surfaces[s][2]] + local alt + if surfaces[s][3] == 1 then + alt = surfaces[s][2] + end + local sounds = table.copy(def.sounds) + local leaf_sounds = mcl_sounds.node_sound_leaves_defaults() + sounds.dig = leaf_sounds.dig + sounds.dug = leaf_sounds.dug + sounds.place = leaf_sounds.place + local tt_help, doc_longdesc, doc_img, desc + if surfaces[s][1] == "dirt" then + doc_longdesc = S("Kelp grows inside water on top of dirt, sand or gravel.") + desc = S("Kelp") + doc_create = true + doc_img = "mcl_ocean_kelp_item.png" + else + doc_create = false + end + minetest.register_node("mcl_ocean:kelp_"..surfaces[s][1], { + _doc_items_entry_name = desc, + _doc_items_longdesc = doc_longdesc, + _doc_items_create_entry = doc_create, + _doc_items_image = doc_img, + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "leveled", + place_param2 = 16, + tiles = def.tiles, + special_tiles = { + { + image = "mcl_ocean_kelp_plant.png", + animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}, + tileable_vertical = true, + } + }, + inventory_image = "("..def.tiles[1]..")^mcl_ocean_kelp_item.png", + wield_image = "mcl_ocean_kelp_item.png", + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -0.5, 0.5, -0.5, 0.5, 1.5, 0.5 }, + }, + }, + groups = { dig_immediate = 3, deco_block = 1, plant = 1, kelp = 1, falling_node = surfaces[s][3] }, + sounds = sounds, + node_dig_prediction = surfaces[s][2], + after_dig_node = function(pos) + minetest.set_node(pos, {name=surfaces[s][2]}) + end, + drop = "mcl_ocean:kelp", + _mcl_falling_node_alternative = alt, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + }) + + if mod_doc and surfaces[s][1] ~= "dirt" then + doc.add_entry_alias("nodes", "mcl_ocean:kelp_dirt", "nodes", "mcl_ocean:kelp_"..surfaces[s][1]) + end +end + +if mod_doc then + doc.add_entry_alias("nodes", "mcl_ocean:kelp_dirt", "craftitems", "mcl_ocean:kelp") +end + +-- Dried kelp stuff + +-- TODO: This is supposed to be eaten very fast +minetest.register_craftitem("mcl_ocean:dried_kelp", { + description = S("Dried Kelp"), + _doc_items_longdesc = S("Dried kelp is a food item."), + inventory_image = "mcl_ocean_dried_kelp.png", + wield_image = "mcl_ocean_dried_kelp.png", + groups = { food = 2, eatable = 1 }, + on_place = minetest.item_eat(1), + on_secondary_use = minetest.item_eat(1), + groups = { food = 2, eatable = 1 }, + _mcl_saturation = 0.6, +}) + +local mod_screwdriver = minetest.get_modpath("screwdriver") ~= nil +local on_rotate +if mod_screwdriver then + on_rotate = screwdriver.rotate_3way +end + + +minetest.register_node("mcl_ocean:dried_kelp_block", { + description = S("Dried Kelp Block"), + _doc_items_longdesc = S("A decorative block that serves as a great furnace fuel."), + tiles = { "mcl_ocean_dried_kelp_top.png", "mcl_ocean_dried_kelp_bottom.png", "mcl_ocean_dried_kelp_side.png" }, + groups = { handy = 1, building_block = 1, flammable = 2, fire_encouragement = 30, fire_flammability = 60 }, + sounds = mcl_sounds.node_sound_leaves_defaults(), + paramtype2 = "facedir", + on_place = mcl_util.rotate_axis, + on_rotate = on_rotate, + _mcl_hardness = 0.5, + _mcl_blast_resistance = 12.5, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "mcl_ocean:kelp", + output = "mcl_ocean:dried_kelp", + cooktime = 10, +}) +minetest.register_craft({ + recipe = { + { "mcl_ocean:dried_kelp","mcl_ocean:dried_kelp","mcl_ocean:dried_kelp" }, + { "mcl_ocean:dried_kelp","mcl_ocean:dried_kelp","mcl_ocean:dried_kelp" }, + { "mcl_ocean:dried_kelp","mcl_ocean:dried_kelp","mcl_ocean:dried_kelp" }, + }, + output = "mcl_ocean:dried_kelp_block", +}) +minetest.register_craft({ + type = "fuel", + recipe = "mcl_ocean:dried_kelp_block", + burntime = 200, +}) + +-- Grow kelp +minetest.register_abm({ + label = "Kelp growth", + nodenames = { "group:kelp" }, + interval = 45, + chance = 12, + catch_up = false, + action = function(pos, node, active_object_count, active_object_count_wider) + local grown + -- Grow kelp by 1 node length if it would grow inside water + node.param2, grown = grow_param2_step(node.param2, true) + local top, top_node = get_kelp_top(pos, node) + local submerged = get_submerged(top_node) + if grown then + if submerged == "source" then + -- Liquid source: Grow normally + minetest.set_node(pos, node) + elseif submerged == "flowing" then + -- Flowing liquid: Grow 1 step, but also turn the top node into a liquid source + minetest.set_node(pos, node) + local def_liq = minetest.registered_nodes[top_node.name] + local alt_liq = def_liq and def_liq.liquid_alternative_source + if alt_liq then + minetest.set_node(top, {name=alt_liq}) + end + end + end + end, +}) diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr new file mode 100644 index 00000000..79384cd7 --- /dev/null +++ b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr @@ -0,0 +1,56 @@ +# textdomain: mcl_ocean +Sea Lantern=Seelaterne +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Seelaternen sind dekorative Lichtquellen, die im Wasser schick aussehen, aber sie können überall platziert werden. +Prismarine=Prismarin +Prismarine is used as a building block. It slowly changes its color.=Prismarin wird aus Baumaterial benutzt. Er verändert langsam seine Farbe. +Prismarine Bricks=Prismarinziegel +Dark Prismarine=Dunkelprismarin +Prismarine Crystals=Prismarinkristalle +Prismarine Shard=Prismarinsplitter +Dried Kelp=Getrockneter Seetang +Dried Kelp Block=Getrockneter Seetangblock +Brain Coral Block=Hirnkorallenblock +Brain Coral Fan=Hirnkorallenfächer +Brain Coral=Hirnkoralle +Bubble Coral Block=Blasenkorallenblock +Bubble Coral Fan=Blasenkorallenfächer +Bubble Coral=Blasenkoralle +Fire Coral Block=Feuerkorallenblock +Fire Coral Fan=Feuerkorallenfächer +Fire Coral=Feuerkoralle +Horn Coral Block=Hornkorallenblock +Horn Coral Fan=Hornkorallenfächer +Horn Coral=Hornkoralle +Tube Coral Block=Trompetenkorallenblock +Tube Coral Fan=Trompetenkorallenfächer +Tube Coral=Trompetenkoralle +Dead Brain Coral Block=Toter Hirnkorallenblock +Dead Brain Coral Fan=Toter Hirnkorallenfächer +Dead Brain Coral=Tote Hirnkoralle +Dead Bubble Coral Block=Toter Blasenkorallenblock +Dead Bubble Coral Fan=Toter Blasenkorallenfächer +Dead Bubble Coral=Tote Blasenkoralle +Dead Fire Coral Block=Toter Feuerkorallenblock +Dead Fire Coral Fan=Toter Feuerkorallenfächer +Dead Fire Coral=Tote Feuerkoralle +Dead Horn Coral Block=Toter Hornkorallenblock +Dead Horn Coral Fan=Toter Hornkorallenfächer +Dead Horn Coral=Tote Hornkoralle +Dead Tube Coral Block=Toter Trompetenkorallenblock +Dead Tube Coral Fan=Toter Trompetenkorallenfächer +Dead Tube Coral=Tote Trompetenkoralle +Seagrass=Seegras +Kelp=Seetang +Kelp grows inside water on top of dirt, sand or gravel.=Seetang wächst im Wasser auf Erde, Sand oder Kies. +Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Korallenblöcke leben im Ozean und benötigen eine Wasserquelle neben ihnen, um zu überleben. Ohne Wasser sterben sie ab. +Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Korallen wachsen auf Korallenblöcken und müssen sich in einer Wasserquelle befinden, um zu überleben. Ohne Wasser sterben sie gemeinsam mit dem Korallenblock ab. +Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Korallenfächer wachsen auf Korallenblöcken und müssen sich in einer Wasserquelle befinden, um zu überleben. Ohne Wasser sterben sie gemeinsam mit dem Korallenblock ab. +Seagrass grows inside water on top of dirt, sand or gravel.=Seegras wächst im Wasser auf Erde, Sand oder Kies. +A decorative block that serves as a great furnace fuel.=Ein dekorativer Block, der sich gut als Ofenbrennstoff eignet. +Dried kelp is a food item.=Getrockneter Seetang ist ein Lebensmittel. +Grows on coral block of same species=Wächst auf Korallenblock der gleichen Art +Needs water to live=Benötigt Wasser zum Leben +Grows in water on dirt, sand, gravel=Wächst im Wasser auf Erde, Sand, Kies +Glows in the water=Leuchtet im Wasser +4 possible sizes=4 mögliche Größen +Grows on dead brain coral block=Wächst auf totem Hirnkorallenblock diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.es.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.es.tr new file mode 100644 index 00000000..1e27376c --- /dev/null +++ b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.es.tr @@ -0,0 +1,50 @@ +# textdomain: mcl_ocean +Sea Lantern=Linterna de mar +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Las linternas marinas son fuentes de luz decorativas que se ven muy bien bajo el agua pero se pueden colocar en cualquier lugar. +Prismarine=Prismarina +Prismarine is used as a building block. It slowly changes its color.=La prismarina se usa como bloque de construcción. Poco a poco cambia su color. +Prismarine Bricks=Ladrillos de prismarina +Dark Prismarine=Prismarina oscura +Prismarine Crystals=Cristales de prismatina +Prismarine Shard=Fragmento de prismatina +Dried Kelp=Algas secas +Dried Kelp Block=Bloque de algas secas +Brain Coral Block=Bloque de coral de cerebro +Brain Coral Fan=Coral de cerebro desparramado +Brain Coral=Coral de cerebro +Bubble Coral Block=Bloque de coral de burbuja +Bubble Coral Fan=Coral de burbuja desparramado +Bubble Coral=Coral de burbuja +Fire Coral Block=Bloque de coral de fuego +Fire Coral Fan=Coral de fuego desparramado +Fire Coral=Coral de fuego +Horn Coral Block=Bloque de coral de cuerno +Horn Coral Fan=Coral de cuerno desparramado +Horn Coral=Coral de cuerno +Tube Coral Block=Bloque de coral de tubo +Tube Coral Fan=Coral de tubo desparramado +Tube Coral=Coral de tubo +Dead Brain Coral Block=Bloque de coral muerto +Dead Brain Coral Fan=Coral desparramado +Dead Brain Coral=Coral de cerebro muerto +Dead Bubble Coral Block=Bloque de coral de burbuja muerto +Dead Bubble Coral Fan=Coral de burbuja desparramado +Dead Bubble Coral=Coral de burbuja muerto +Dead Fire Coral Block=Bloque de coral de fuego muerto +Dead Fire Coral Fan=Coral de fuego desparramado +Dead Fire Coral=Coral de fuego muerto +Dead Horn Coral Block=Bloque de coral de cuerno muerto +Dead Horn Coral Fan=Coral de cuerno desparramado +Dead Horn Coral=Coral de cuerno muerto +Dead Tube Coral Block=Bloque de coral de tubo muerto +Dead Tube Coral Fan=Coral de tubo desparramado +Dead Tube Coral=Coral de tubo muerto +Seagrass=Hierba marina +Kelp=Alga +Kelp grows inside water on top of dirt, sand or gravel.=Las algas crecen dentro del agua sobre tierra, arena o grava. +Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Los bloques de coral viven en los océanos y necesitan una fuente de agua junto a ellos para sobrevivir. Sin agua, mueren. +Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Los corales crecen sobre bloques de coral y necesitan estar dentro de una fuente de agua para sobrevivir. Sin agua, morirá, al igual que el bloque de coral que se encuentra debajo. +Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Los fanáticos de los corales crecen encima de los bloques de coral y necesitan estar dentro de una fuente de agua para sobrevivir. Sin agua, morirá, al igual que el bloque de coral que se encuentra debajo. +Seagrass grows inside water on top of dirt, sand or gravel.=La hierba marina crece dentro del agua sobre tierra, arena o grava. +A decorative block that serves as a great furnace fuel.=Un bloque decorativo que sirve como un gran combustible de horno. +Dried kelp is a food item.=Las algas secas son un alimento. diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr new file mode 100644 index 00000000..a1b3f0b7 --- /dev/null +++ b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr @@ -0,0 +1,59 @@ +# textdomain: mcl_ocean +Sea Lantern=Lanterne aquatique +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Les lanternes marines sont des sources lumineuses décoratives qui ont fière allure sous l'eau mais peuvent être placées n'importe où. +Prismarine=Prismarine +Prismarine is used as a building block. It slowly changes its color.=La prismarine est utilisée comme bloc de construction. Il change lentement de couleur. +Prismarine Bricks=Prismarine Taillée +Dark Prismarine=Prismarine Sombre +Prismarine Crystals=Cristaux de Prismarine +Prismarine Shard=Éclat de Prismarine +Dried Kelp=Algue Séchée +Dried Kelp Block=Bloc d'Algue Séchée +Brain Coral Block=Bloc de Corail +Brain Coral Fan=Gorgone de Corail +Brain Coral=Corail +Bubble Coral Block=Bloc de Corail Bulles +Bubble Coral Fan=Gorgone de Corail Bulles +Bubble Coral=Corail Bulles +Fire Coral Block=Bloc Corail de Feu +Fire Coral Fan=Gorgone Corail de Feu +Fire Coral=Corail de Feu +Horn Coral Block=Bloc de Corail Corné +Horn Coral Fan=Gorgone de Corail Corné +Horn Coral=Corail Corné +Tube Coral Block=Bloc de Corail Tubulaire +Tube Coral Fan=Gorgone de Corail Tubulaire +Tube Coral=Corail Tubulaire +Dead Brain Coral Block=Bloc de Corail Mort +Dead Brain Coral Fan=Gorgone de Corail Mort +Dead Brain Coral=Corail Mort +Dead Bubble Coral Block=Bloc de Corail Bulles Mort +Dead Bubble Coral Fan=Gorgone de Corail Bulles Mort +Dead Bubble Coral=Corail Bulles Mort +Dead Fire Coral Block=Bloc de Corail de Feu Mort +Dead Fire Coral Fan=Gorgone de Corail de Feu Mort +Dead Fire Coral=Corail de Feu Mort +Dead Horn Coral Block=Bloc de Corail Corné Mort +Dead Horn Coral Fan=Gorgone de Corail Corné Mort +Dead Horn Coral=Corail Corné Mort +Dead Tube Coral Block=Bloc de Corail Tubulaire Mort +Dead Tube Coral Fan=Gorgone de Corail Tubulaire Mort +Dead Tube Coral=Corail Tubulaire Mort +Seagrass=Herbe aquatique +Kelp=Algue +Kelp grows inside water on top of dirt, sand or gravel.=Les Algues pousse à l'intérieur de l'eau sur la terre, le sable ou le gravier. +Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Les blocs de corail vivent dans les océans et ont besoin d'une source d'eau à côté d'eux pour survivre. Sans eau, ils meurent. +Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Les coraux se développent au-dessus des blocs de corail et doivent être à l'intérieur d'une source d'eau pour survivre. Sans eau, il mourra, ainsi que le bloc de corail en dessous. +Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Les gorgones de coraux se développent au-dessus des blocs de corail et doivent être à l'intérieur d'une source d'eau pour survivre. Sans eau, il mourra, ainsi que le bloc de corail en dessous. +Seagrass grows inside water on top of dirt, sand or gravel.=Les herbiers aquatique poussent à l'intérieur de l'eau sur la terre, le sable ou le gravier. +A decorative block that serves as a great furnace fuel.=Un bloc décoratif qui sert de bon combustible pour le four. +Dried kelp is a food item.=L'algue séchée est un aliment. +Grows on coral block of same species=Pousse sur un bloc de corail de la même espèce +Needs water to live=A besoin d'eau pour vivre +Grows in water on dirt, sand, gravel=Pousse dans l'eau sur la terre, le sable et le gravier +Glows in the water=Brille dans l'eau +4 possible sizes=4 tailles possibles +Grows on dead brain coral block=Pousse sur un bloc de corail mort +Sea Pickle=Cornichon de mer +Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Les cornichons de mer poussent sur des blocs de corail morts et fournissent de la lumière lorsqu'ils sont sous l'eau. Ils viennent en 4 tailles qui varient en luminosité. +It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Il ne peut être placé que sur des blocs de corail morts. Placer un cornichon sur un autre cornichon le rendra plus brillant et plus brillant. \ No newline at end of file diff --git a/mods/ITEMS/mcl_ocean/locale/template.txt b/mods/ITEMS/mcl_ocean/locale/template.txt new file mode 100644 index 00000000..9fb4f8e1 --- /dev/null +++ b/mods/ITEMS/mcl_ocean/locale/template.txt @@ -0,0 +1,60 @@ +# textdomain: mcl_ocean +Sea Lantern= +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.= +Prismarine= +Prismarine is used as a building block. It slowly changes its color.= +Prismarine Bricks= +Dark Prismarine= +Prismarine Crystals= +Prismarine Shard= +Dried Kelp= +Dried Kelp Block= +Brain Coral Block= +Brain Coral Fan= +Brain Coral= +Bubble Coral Block= +Bubble Coral Fan= +Bubble Coral= +Fire Coral Block= +Fire Coral Fan= +Fire Coral= +Horn Coral Block= +Horn Coral Fan= +Horn Coral= +Tube Coral Block= +Tube Coral Fan= +Tube Coral= +Dead Brain Coral Block= +Dead Brain Coral Fan= +Dead Brain Coral= +Dead Bubble Coral Block= +Dead Bubble Coral Fan= +Dead Bubble Coral= +Dead Fire Coral Block= +Dead Fire Coral Fan= +Dead Fire Coral= +Dead Horn Coral Block= +Dead Horn Coral Fan= +Dead Horn Coral= +Dead Tube Coral Block= +Dead Tube Coral Fan= +Dead Tube Coral= +Seagrass= +Kelp= +Kelp grows inside water on top of dirt, sand or gravel.= +Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.= +Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.= +Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.= +Seagrass grows inside water on top of dirt, sand or gravel.= +A decorative block that serves as a great furnace fuel.= +Dried kelp is a food item.= +Grows on coral block of same species= +Needs water to live= +Grows in water on dirt, sand, gravel +Glows in the water= +4 possible sizes= +Grows on dead brain coral block= +Sea Pickle= +Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.= +It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.= + diff --git a/mods/ITEMS/mcl_ocean/mod.conf b/mods/ITEMS/mcl_ocean/mod.conf index 81edf016..664d8e1e 100644 --- a/mods/ITEMS/mcl_ocean/mod.conf +++ b/mods/ITEMS/mcl_ocean/mod.conf @@ -1 +1,2 @@ name = mcl_ocean +description = Includes various ocean nodes diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua new file mode 100644 index 00000000..5840d59c --- /dev/null +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -0,0 +1,117 @@ +-- Nodes + +local S = minetest.get_translator("mcl_ocean") + +minetest.register_node("mcl_ocean:sea_lantern", { + description = S("Sea Lantern"), + _doc_items_longdesc = S("Sea lanterns are decorative light sources which look great underwater but can be placed anywhere."), + paramtype2 = "facedir", + is_ground_content = false, + stack_max = 64, + light_source = minetest.LIGHT_MAX, + drop = { + max_items = 1, + items = { + { items = {'mcl_ocean:prismarine_crystals 3'}, rarity = 2 }, + { items = {'mcl_ocean:prismarine_crystals 2'}} + } + }, + tiles = {{name="mcl_ocean_sea_lantern.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=1.25}}}, + groups = {handy=1, building_block=1, material_glass=1}, + sounds = mcl_sounds.node_sound_glass_defaults(), + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, +}) + +minetest.register_node("mcl_ocean:prismarine", { + description = S("Prismarine"), + _doc_items_longdesc = S("Prismarine is used as a building block. It slowly changes its color."), + stack_max = 64, + is_ground_content = false, + -- Texture should have 22 frames for smooth transitions. + tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, + groups = {pickaxey=1, building_block=1, material_stone=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 1.5, + _mcl_hardness = 1.5, +}) + +minetest.register_node("mcl_ocean:prismarine_brick", { + description = S("Prismarine Bricks"), + _doc_items_longdesc = doc.sub.items.temp.build, + stack_max = 64, + is_ground_content = false, + tiles = {"mcl_ocean_prismarine_bricks.png"}, + groups = {pickaxey=1, building_block=1, material_stone=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 1.5, + _mcl_hardness = 1.5, +}) + +minetest.register_node("mcl_ocean:prismarine_dark", { + description = S("Dark Prismarine"), + _doc_items_longdesc = doc.sub.items.temp.build, + stack_max = 64, + is_ground_content = false, + tiles = {"mcl_ocean_prismarine_dark.png"}, + groups = {pickaxey=1, building_block=1, material_stone=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 1.5, + _mcl_hardness = 1.5, +}) + +-- Craftitems + +minetest.register_craftitem("mcl_ocean:prismarine_crystals", { + description = S("Prismarine Crystals"), + _doc_items_longdesc = doc.sub.items.temp.craftitem, + inventory_image = "mcl_ocean_prismarine_crystals.png", + stack_max = 64, + groups = { craftitem = 1 }, +}) + +minetest.register_craftitem("mcl_ocean:prismarine_shard", { + description = S("Prismarine Shard"), + _doc_items_longdesc = doc.sub.items.temp.craftitem, + inventory_image = "mcl_ocean_prismarine_shard.png", + stack_max = 64, + groups = { craftitem = 1 }, +}) + +-- Crafting + +minetest.register_craft({ + output = 'mcl_ocean:sea_lantern', + recipe = { + {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_crystals', 'mcl_ocean:prismarine_shard'}, + {'mcl_ocean:prismarine_crystals', 'mcl_ocean:prismarine_crystals', 'mcl_ocean:prismarine_crystals'}, + {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_crystals', 'mcl_ocean:prismarine_shard'}, + } +}) + +minetest.register_craft({ + output = 'mcl_ocean:prismarine', + recipe = { + {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, + {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, + } +}) + +minetest.register_craft({ + output = 'mcl_ocean:prismarine_brick', + recipe = { + {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, + {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, + {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, + } +}) + +minetest.register_craft({ + output = 'mcl_ocean:prismarine_dark', + recipe = { + {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, + {'mcl_ocean:prismarine_shard', 'mcl_dye:black', 'mcl_ocean:prismarine_shard'}, + {'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard', 'mcl_ocean:prismarine_shard'}, + } +}) + diff --git a/mods/ITEMS/mcl_ocean/sea_pickle.lua b/mods/ITEMS/mcl_ocean/sea_pickle.lua new file mode 100644 index 00000000..55ea1755 --- /dev/null +++ b/mods/ITEMS/mcl_ocean/sea_pickle.lua @@ -0,0 +1,205 @@ +local S = minetest.get_translator("mcl_ocean") +local mod_doc = minetest.get_modpath("doc") ~= nil + +local function sea_pickle_on_place(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 node_above = minetest.get_node(pos_above) + local def_under = minetest.registered_nodes[node_under.name] + local def_above = minetest.registered_nodes[node_above.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 minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.log("action", player_name + .. " tried to place " .. itemstack:get_name() + .. " at protected position " + .. minetest.pos_to_string(pos_under)) + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + local submerged = false + if minetest.get_item_group(node_above.name, "water") ~= 0 then + submerged = true + end + -- Place + if node_under.name == "mcl_ocean:dead_brain_coral_block" then + -- Place on suitable coral block + if submerged then + node_under.name = "mcl_ocean:sea_pickle_1_dead_brain_coral_block" + else + node_under.name = "mcl_ocean:sea_pickle_1_off_dead_brain_coral_block" + end + minetest.set_node(pos_under, node_under) + elseif minetest.get_item_group(node_under.name, "sea_pickle") ~= 0 then + -- Grow by 1 stage + local def = minetest.registered_nodes[node_under.name] + if def and def._mcl_sea_pickle_next then + node_under.name = def._mcl_sea_pickle_next + minetest.set_node(pos_under, node_under) + else + return itemstack + end + else + return itemstack + end + if not (minetest.settings:get_bool("creative_mode")) then + itemstack:take_item() + end + return itemstack +end + +-- Sea Pickle on brain coral + +local sounds_coral_plant = mcl_sounds.node_sound_leaves_defaults({footstep = mcl_sounds.node_sound_dirt_defaults().footstep}) +local ontop = "dead_brain_coral_block" +local canonical = "mcl_ocean:sea_pickle_1_"..ontop + +for s=1,4 do + local desc, doc_desc, doc_use, doc_create, tt_help, nici, img, img_off, on_place + if s == 1 then + desc = S("Sea Pickle") + doc_desc = S("Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.") + doc_use = S("It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.") + tt_help = S("Glows in the water").."\n"..S("4 possible sizes").."\n"..S("Grows on dead brain coral block") + img = "mcl_ocean_sea_pickle_item.png" + on_place = sea_pickle_on_place + else + doc_create = false + nici = 1 + img = "mcl_ocean_"..ontop..".png^(mcl_ocean_sea_pickle_"..s.."_anim.png^[verticalframe:2:1)" + end + img_off = "mcl_ocean_"..ontop..".png^mcl_ocean_sea_pickle_"..s.."_off.png" + local next_on, next_off + if s < 4 then + next_on = "mcl_ocean:sea_pickle_"..tostring(s+1).."_"..ontop + next_off = "mcl_ocean:sea_pickle_"..tostring(s+1).."_off_"..ontop + end + + minetest.register_node("mcl_ocean:sea_pickle_"..s.."_"..ontop, { + description = desc, + _tt_help = tt_help, + _doc_items_create_entry = doc_create, + _doc_items_longdesc = doc_desc, + _doc_items_usagehelp = doc_use, + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "meshoptions", + tiles = { "mcl_ocean_"..ontop..".png" }, + special_tiles = { + { + image = "mcl_ocean_sea_pickle_"..s.."_anim.png", + animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length=1.7}, + } + }, + inventory_image = img, + wield_image = img, + groups = { dig_immediate = 3, deco_block = 1, sea_pickle=1, not_in_creative_inventory=nici }, + -- Light level: 6 at size 1, +3 for each additional stage + light_source = math.min(6 + (s-1)*3, minetest.LIGHT_MAX), + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -0.15, 0.5, -0.15, 0.15, 0.5+2/16+(2/16)*s, 0.15 }, + } + }, + sounds = sounds_coral_plant, + drop = canonical .. " "..s, + node_placement_prediction = "", + node_dig_prediction = "mcl_ocean:"..ontop, + after_dig_node = function(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "sea_pickle") == 0 then + minetest.set_node(pos, {name="mcl_ocean:"..ontop}) + end + end, + on_place = on_place, + _mcl_sea_pickle_off = "mcl_ocean:sea_pickle_"..s.."_off_"..ontop, + _mcl_sea_pickle_next = next_on, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + }) + + minetest.register_node("mcl_ocean:sea_pickle_"..s.."_off_"..ontop, { + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "meshoptions", + tiles = { "mcl_ocean_"..ontop..".png" }, + special_tiles = { "mcl_ocean_sea_pickle_"..s.."_off.png", }, + groups = { dig_immediate = 3, deco_block = 1, sea_pickle=2, not_in_creative_inventory=1 }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -0.15, 0.5, -0.15, 0.15, 0.5+2/16+(2/16)*s, 0.15 }, + } + }, + inventory_image = img_off, + wield_image = img_off, + sounds = sounds_coral_plant, + drop = canonical .. " "..s, + node_placement_prediction = "", + node_dig_prediction = "mcl_ocean:"..ontop, + after_dig_node = function(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "sea_pickle") == 0 then + minetest.set_node(pos, {name="mcl_ocean:"..ontop}) + end + end, + _mcl_sea_pickle_on = "mcl_ocean:sea_pickle_"..s.."_"..ontop, + _mcl_sea_pickle_next = next_off, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + }) + + if mod_doc then + if s == 1 then + doc.add_entry_alias("nodes", "mcl_ocean:sea_pickle_1_dead_brain_coral_block", "nodes", "mcl_ocean:sea_pickle_1_off_"..ontop) + else + doc.add_entry_alias("nodes", "mcl_ocean:sea_pickle_1_dead_brain_coral_block", "nodes", "mcl_ocean:sea_pickle_"..s.."_off_"..ontop) + doc.add_entry_alias("nodes", "mcl_ocean:sea_pickle_1_dead_brain_coral_block", "nodes", "mcl_ocean:sea_pickle_"..s.."_"..ontop) + end + end +end + +minetest.register_abm({ + label = "Sea pickle update", + nodenames = { "group:sea_pickle" }, + interval = 17, + chance = 5, + catch_up = false, + action = function(pos, node, active_object_count, active_object_count_wider) + -- Check if it's lit + local state = minetest.get_item_group(node.name, "sea_pickle") + -- Check for water + local checknode = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) + local def = minetest.registered_nodes[node.name] + if minetest.get_item_group(checknode.name, "water") ~= 0 then + -- Sea pickle is unlit + if state == 2 then + node.name = def._mcl_sea_pickle_on + minetest.set_node(pos, node) + return + end + else + -- Sea pickle is lit + if state == 1 then + node.name = def._mcl_sea_pickle_off + minetest.set_node(pos, node) + return + end + end + end, +}) diff --git a/mods/ITEMS/mcl_ocean/seagrass.lua b/mods/ITEMS/mcl_ocean/seagrass.lua new file mode 100644 index 00000000..a5765cf9 --- /dev/null +++ b/mods/ITEMS/mcl_ocean/seagrass.lua @@ -0,0 +1,156 @@ +local S = minetest.get_translator("mcl_ocean") +local mod_doc = minetest.get_modpath("doc") ~= nil + +-- List of supported surfaces for seagrass +local surfaces = { + { "dirt", "mcl_core:dirt" }, + { "sand", "mcl_core:sand", 1 }, + { "redsand", "mcl_core:redsand", 1 }, + { "gravel", "mcl_core:gravel", 1 }, +} + +local function seagrass_on_place(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 node_above = minetest.get_node(pos_above) + local def_under = minetest.registered_nodes[node_under.name] + local def_above = minetest.registered_nodes[node_above.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 pos_under.y >= pos_above.y then + return itemstack + end + + -- Placement rules: + -- Seagrass can only be placed on top of dirt inside water + local g_above_water = minetest.get_item_group(node_above.name, "water") + if not (g_above_water ~= 0 and def_above.liquidtype == "source") then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.log("action", player_name + .. " tried to place " .. itemstack:get_name() + .. " at protected position " + .. minetest.pos_to_string(pos_under)) + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + -- Select a seagrass node + if node_under.name == "mcl_core:dirt" then + node_under.name = "mcl_ocean:seagrass_dirt" + elseif node_under.name == "mcl_core:sand" then + node_under.name = "mcl_ocean:seagrass_sand" + elseif node_under.name == "mcl_core:redsand" then + node_under.name = "mcl_ocean:seagrass_redsand" + elseif node_under.name == "mcl_core:gravel" then + node_under.name = "mcl_ocean:seagrass_gravel" + else + return itemstack + end + node_under.param2 = minetest.registered_items[node_under.name].place_param2 or 3 + if node_under.param2 < 8 and math.random(1,2) == 1 then + -- Random horizontal displacement + node_under.param2 = node_under.param2 + 8 + end + local def_node = minetest.registered_items[node_under.name] + if def_node.sounds then + minetest.sound_play(def_node.sounds.place, { gain = 0.5, pos = pos_under }, true) + end + minetest.set_node(pos_under, node_under) + if not (minetest.settings:get_bool("creative_mode")) then + itemstack:take_item() + end + + return itemstack +end + +minetest.register_craftitem("mcl_ocean:seagrass", { + description = S("Seagrass"), + _tt_help = S("Grows in water on dirt, sand, gravel"), + _doc_items_create_entry = false, + inventory_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", + wield_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", + on_place = seagrass_on_place, + groups = { deco_block = 1 }, +}) + +-- Seagrass nodes: seagrass on a surface node + +for s=1, #surfaces do + local def = minetest.registered_nodes[surfaces[s][2]] + local alt + if surfaces[s][3] == 1 then + alt = surfaces[s][2] + end + local sounds = table.copy(def.sounds) + local leaf_sounds = mcl_sounds.node_sound_leaves_defaults() + sounds.dig = leaf_sounds.dig + sounds.dug = leaf_sounds.dug + sounds.place = leaf_sounds.place + local doc_longdesc, doc_img, desc + if surfaces[s][1] == "dirt" then + doc_longdesc = S("Seagrass grows inside water on top of dirt, sand or gravel.") + desc = S("Seagrass") + doc_create = true + doc_img = "mcl_ocean_seagrass.png" + else + doc_create = false + end + minetest.register_node("mcl_ocean:seagrass_"..surfaces[s][1], { + _doc_items_entry_name = desc, + _doc_items_longdesc = doc_longdesc, + _doc_items_create_entry = doc_create, + _doc_items_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + tiles = def.tiles, + special_tiles = { + { + image = "mcl_ocean_seagrass.png", + animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length=1.0}, + } + }, + inventory_image = "("..def.tiles[1]..")^(mcl_ocean_seagrass.png^[verticalframe:12:0)", + wield_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -0.5, 0.5, -0.5, 0.5, 1.3, 0.5 }, + }, + }, + groups = { handy = 1, shearsy = 1, deco_block = 1, plant = 1, seagrass = 1, falling_node = surfaces[s][3], not_in_creative_inventory = 1 }, + sounds = sounds, + node_dig_prediction = surfaces[s][2], + after_dig_node = function(pos) + minetest.set_node(pos, {name=surfaces[s][2]}) + end, + drop = "", + _mcl_falling_node_alternative = alt, + _mcl_shears_drop = { "mcl_ocean:seagrass" }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + }) + if mod_doc and surfaces[s][1] ~= "dirt" then + doc.add_entry_alias("nodes", "mcl_ocean:seagrass_dirt", "nodes", "mcl_ocean:seagrass_"..surfaces[s][1]) + end +end + +if mod_doc then + doc.add_entry_alias("nodes", "mcl_ocean:seagrass_dirt", "craftitems", "mcl_ocean:seagrass") +end diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral.png new file mode 100644 index 00000000..72903249 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_block.png new file mode 100644 index 00000000..02ea5c43 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_fan.png new file mode 100644 index 00000000..e15952bb Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_fan.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral.png new file mode 100644 index 00000000..50d0dc29 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_block.png new file mode 100644 index 00000000..d2ff8670 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_fan.png new file mode 100644 index 00000000..00704777 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_fan.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral.png new file mode 100644 index 00000000..ae729634 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_block.png new file mode 100644 index 00000000..101d4e57 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_fan.png new file mode 100644 index 00000000..716f0b9a Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_fan.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral.png new file mode 100644 index 00000000..3e259083 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_block.png new file mode 100644 index 00000000..1fee1648 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_fan.png new file mode 100644 index 00000000..de1def3e Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_fan.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral.png new file mode 100644 index 00000000..48cbcf17 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_block.png new file mode 100644 index 00000000..9aa1da51 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_fan.png new file mode 100644 index 00000000..0cea55d8 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_fan.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral.png new file mode 100644 index 00000000..59301d59 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_block.png new file mode 100644 index 00000000..0b2f11d4 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_fan.png new file mode 100644 index 00000000..0900bd77 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_fan.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral.png new file mode 100644 index 00000000..1ff0862b Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_block.png new file mode 100644 index 00000000..b06cb33d Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_fan.png new file mode 100644 index 00000000..6340c513 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_fan.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp.png new file mode 100644 index 00000000..7358dd29 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_bottom.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_bottom.png new file mode 100644 index 00000000..f3f85134 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_bottom.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_side.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_side.png new file mode 100644 index 00000000..9c3e4237 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_side.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_top.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_top.png new file mode 100644 index 00000000..f3f85134 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_top.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral.png new file mode 100644 index 00000000..cf49fca8 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_block.png new file mode 100644 index 00000000..fea7af8c Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_fan.png new file mode 100644 index 00000000..b8847806 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_fan.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral.png new file mode 100644 index 00000000..a51711a2 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_block.png new file mode 100644 index 00000000..1192a6e5 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_fan.png new file mode 100644 index 00000000..a885ecf1 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_fan.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_item.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_item.png new file mode 100644 index 00000000..d7a10f5c Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_item.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_plant.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_plant.png new file mode 100644 index 00000000..107fa8a6 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_plant.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_bricks.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_bricks.png index f708a270..26ba85c7 100644 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_bricks.png and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_bricks.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_anim.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_anim.png new file mode 100644 index 00000000..4af3abfb Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_anim.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_off.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_off.png new file mode 100644 index 00000000..3d840314 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_off.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_anim.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_anim.png new file mode 100644 index 00000000..c8e917b5 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_anim.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_off.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_off.png new file mode 100644 index 00000000..738c570d Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_off.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_anim.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_anim.png new file mode 100644 index 00000000..11258988 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_anim.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_off.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_off.png new file mode 100644 index 00000000..958fdac3 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_off.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_anim.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_anim.png new file mode 100644 index 00000000..194eb47c Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_anim.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_off.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_off.png new file mode 100644 index 00000000..4f6b13a5 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_off.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_item.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_item.png new file mode 100644 index 00000000..0fca2e24 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_item.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_seagrass.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_seagrass.png new file mode 100644 index 00000000..aab17751 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_seagrass.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral.png new file mode 100644 index 00000000..394157d5 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_block.png new file mode 100644 index 00000000..02857340 Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_block.png differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_fan.png new file mode 100644 index 00000000..c7b2bebe Binary files /dev/null and b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_fan.png differ diff --git a/mods/ITEMS/mcl_portals/README.md b/mods/ITEMS/mcl_portals/README.md index 77c5c0ef..560030e8 100644 --- a/mods/ITEMS/mcl_portals/README.md +++ b/mods/ITEMS/mcl_portals/README.md @@ -8,7 +8,7 @@ End portal: Build an upright frame of red nether brick blocks, 4 blocks wide and Created by maikerumine and Wuzzy. Code license: MIT License (see `LICENSE`). -Texture license: See main MineClone 2 directory. +Texture license: See README.md in main MineClone 2 directory. License of sound: [CC BY 3.0](http://creativecommons.org/licenses/by/3.0/) Authors: [FreqMan](https://freesound.org/people/FreqMan/) and Wuzzy diff --git a/mods/ITEMS/mcl_portals/depends.txt b/mods/ITEMS/mcl_portals/depends.txt index fbb8a6e2..f794e5f9 100644 --- a/mods/ITEMS/mcl_portals/depends.txt +++ b/mods/ITEMS/mcl_portals/depends.txt @@ -1,7 +1,9 @@ mcl_init -mcl_util +mcl_worlds mcl_core -mcl_fire mcl_nether mcl_end +mcl_particles +mcl_spawn +awards? doc? diff --git a/mods/ITEMS/mcl_portals/init.lua b/mods/ITEMS/mcl_portals/init.lua index cf4716c4..2fd96afa 100644 --- a/mods/ITEMS/mcl_portals/init.lua +++ b/mods/ITEMS/mcl_portals/init.lua @@ -1,5 +1,7 @@ -- Load files +mcl_portals = {} + -- Nether portal: -- Obsidian frame, activated by flint and steel dofile(minetest.get_modpath("mcl_portals").."/portal_nether.lua") diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr new file mode 100644 index 00000000..59340329 --- /dev/null +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_portals +End Portal=Endportal +An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Ein Endportal teleportiert Kreaturen und Objekte zur mysteriösen Ende-Dimension (und wieder zurück!). +Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Springen Sie ins Portal, um sich zu teleportieren. Von der Oberwelt aus werden Sie zu einer festen Position im Ende hin teleportiert. Eine 5×5-Obsidianplattform wird am Zielort erzeugt. Im Ende werden Sie zurück zu Ihrem Startpunkt in der Oberwelt teleportiert. +End Portal Frame=Endportalrahmen +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Endportalrahmen werden in der Konstruktion von Endportalen benutzt. Jeder Block hat einen Sockel für ein Enderauge. +NOTE: The End dimension is currently incomplete and might change in future versions.=ANMERKUNG: Die Ende-Dimension ist momentan unfertig und könnte sich in künftigen Versionen ändern. +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.=Um ein Endportal zu bauen, brauchen sie 12 Endportalrahmen und 12 Enderaugen. Die Endportalrahmenblöcke muss um ein horizontales Feld von 3×3 platziert sein, wobei jeder von ihnen nach innen zeigt. Jede andere Anordnung wird nicht funktionieren. +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Platzieren Sie ein Enderauge in jeden Block. Das Endportal wird sich in der Mitte öffnen, wenn das letzte Auge platziert wurde. +End Portal Frame with Eye of Ender=Endportalrahmen mit Enderauge +Nether Portal=Netherportal +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Ein Netherportal teleportiert Kreaturen und Objekte zur heißen und gefährlichen Nether-Dimension (und zurück!). Betreten auf eigene Gefahr! +Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Stellen Sie sich ins Portal für einen Moment, um sich zu teleportieren. Beim ersten Mal wird auch ein Portal in der anderen Dimension erschaffen. Wenn ein Netherportal im Nether gebaut wird, wird es zurück zur Oberwelt führen. Ein Netherportal wird zerstört, wenn das Obsidian, das ihn umgibt, zerstört wird, oder, wenn es einer Explosion ausgesetzt war. +Obsidian is also used as the frame of Nether portals.=Obsidian wird auch als Rahmen von Netherportalen benutzt. +To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Um ein Netherportal zu öffnen, platzieren Sie einen aufrechten Rahmen aus Obsidian mit einer Breite von 4 Blöcken und einer Höhe von 5 Blöcken, nur mit Luft in der Mitte. Nachdem Sie den Rahmen gebaut haben, entfachen Sie ein Feuer im Obsidianrahmen. Netherportale funktionieren nur in der Oberwelt und im Nether. +Once placed, an eye of ender can not be taken back.=Sobald platziert, kann ein Enderauge nicht mehr zurück genommen werden. +Used to construct end portals=Benutzt zur Konstruktion von Endportalen +Liquid container=Flüssigkeitsbehälter +No effect=Keine Wirkung diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.es.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.es.tr new file mode 100644 index 00000000..9636f69c --- /dev/null +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.es.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_portals +End Portal=Portal del End +An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Un portal final teletransporta criaturas y objetos a la misteriosa dimensión final (¡y viceversa!). +Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Salta al portal para teletransportarte. Entrar en un portal final en el Overworld te teletransporta a una posición fija en la dimensión final y crea una plataforma de obsidiana 5 × 5 en tu destino. Los portales finales en el final lo llevarán de regreso a su punto de generación en el mundo terrenal +End Portal Frame=Marco de portal del End +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Los marcos del portal final se utilizan en la construcción de portales finales. Cada bloque tiene un zócalo para un ojo de ender. +NOTE: The End dimension is currently incomplete and might change in future versions.=NOTA: El portal del end está actualmente incompleto y puede cambiar en futuras versiones. +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.=Para crear un portal final, necesita 12 marcos de portal final y 12 ojos de ender. Los marcos del portal final deben estar dispuestos alrededor de un área horizontal de 3 × 3 con cada bloque mirando hacia adentro. Cualquier otro arreglo fallará. +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Coloque un ojo de ender en cada bloque. El portal final aparece en el medio después de colocar el ojo final. +End Portal Frame with Eye of Ender=Marco de portal del End con ojo de ender +Nether Portal=Portal del Nether +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Un portal Nether teletransporta criaturas y objetos a la dimensión Nether ardiente y peligrosa (¡y viceversa!). ¡Entra bajo tu propio riesgo! +Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=SPárate en el portal por un momento para activar la teletransportación. Entrar en un portal Nether por primera vez también creará un nuevo portal en la otra dimensión. Si se ha construido un portal Nether en Nether, conducirá al Overworld. Un portal abisal se destruye si se destruye cualquiera de las obsidianas que lo rodean, o si quedó atrapado en una explosión. +Obsidian is also used as the frame of Nether portals.=La obsidiana también se usa como marco de portal del End. +To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Para abrir un portal Nether, coloque un marco vertical de obsidiana con un ancho de 4 bloques y una altura de 5 bloques, dejando solo aire en el centro. Después de colocar este marco, enciende un fuego en el marco de obsidiana. Los portales de Nether solo funcionan en Overworld y Nether. +Once placed, an eye of ender can not be taken back.=Una vez colocado, un ojo de ender no puede ser retirado. diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr new file mode 100644 index 00000000..76a2a6f8 --- /dev/null +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr @@ -0,0 +1,15 @@ +# textdomain: mcl_portals +End Portal=Portail de l'End +An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Un portail de l'End téléporte des créatures et des objets dans la mystérieuse dimension End (et vice-versa!). +Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Sautez dans le portail pour vous téléporter. Entrer dans un portail d'End dans l'Overworld vous téléporte à une position fixe dans la dimension d'End et crée une plate-forme d'obsidienne 5×5 à votre destination. Les portails de l'End à la fin vous ramèneront à votre point d'apparition dans l'Overworld. +End Portal Frame=Cadre de Portail de l'End +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Les portiques d'End sont utilisés dans la construction de portails d'End. Chaque bloc a une prise pour un oeil d'ender. +NOTE: The End dimension is currently incomplete and might change in future versions.=REMARQUE: la dimension d'End est actuellement incomplète et pourrait changer dans les futures versions. +End Portal Frame with Eye of Ender=Cadre de portail de l'End avec Oeil d'Ender +Nether Portal=Portail du Nether +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk! +Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Tenez-vous un instant dans le portail pour activer la téléportation. Entrer pour la première fois sur un portail Nether créera également un nouveau portail dans l'autre dimension. Si un portail du Nether a été construit dans le Nether, il mènera à l'Overworld. Un portail du Nether est détruit si l'une des obsidiennes qui l'entourent est détruit, ou s'il a été pris dans une explosion. +Obsidian is also used as the frame of Nether portals.=Obsidian is also used as the frame of Nether portals. +To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Pour ouvrir un portail du Nether, placez un cadre vertical d'obsidienne d'une largeur de 4 blocs et d'une hauteur de 5 blocs, ne laissant que de l'air au centre. Après avoir placé ce cadre, allumez un feu dans le cadre en obsidienne. Les portails du Nether ne fonctionnent que dans l'Overworld et le Nether. +Once placed, an eye of ender can not be taken back.=Une fois placé, un œil d'ender ne peut pas être repris. +Used to construct end portals=Utilisé pour construire des portails d'End diff --git a/mods/ITEMS/mcl_portals/locale/template.txt b/mods/ITEMS/mcl_portals/locale/template.txt new file mode 100644 index 00000000..d7c5a30f --- /dev/null +++ b/mods/ITEMS/mcl_portals/locale/template.txt @@ -0,0 +1,15 @@ +# textdomain: mcl_portals +End Portal= +An End portal teleports creatures and objects to the mysterious End dimension (and back!).= +Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.= +End Portal Frame= +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.= +NOTE: The End dimension is currently incomplete and might change in future versions.= +End Portal Frame with Eye of Ender= +Nether Portal= +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!= +Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.= +Obsidian is also used as the frame of Nether portals.= +To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.= +Once placed, an eye of ender can not be taken back.= +Used to construct end portals= diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 44f0e143..8506dd27 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -1,82 +1,40 @@ +local S = minetest.get_translator("mcl_portals") + -- Parameters +local SPAWN_MIN = mcl_vars.mg_end_min+70 +local SPAWN_MAX = mcl_vars.mg_end_min+98 -local TCAVE = 0.6 -local nobj_cave = nil --- 3D noise +local mg_name = minetest.get_mapgen_setting("mg_name") -local np_cave = { - offset = 0, - scale = 1, - spread = {x = 384, y = 128, z = 384}, -- squashed 3:1 - seed = 59033, - octaves = 5, - persist = 0.7 -} - --- Portal frame material -local portal_frame = "mcl_nether:quartz_block" - --- Destroy portal if pos (portal frame or portal node) got destroyed local destroy_portal = function(pos) - -- Deactivate Nether portal - local meta = minetest.get_meta(pos) - local p1 = minetest.string_to_pos(meta:get_string("portal_frame1")) - local p2 = minetest.string_to_pos(meta:get_string("portal_frame2")) - if not p1 or not p2 then - return - end - - local first = true - - -- p1 metadata of first node - local mp1 - for x = p1.x, p2.x do - for y = p1.y, p2.y do - for z = p1.z, p2.z do - local p = vector.new(x, y, z) - local m = minetest.get_meta(p) - if first then - --[[ Only proceed if the first node still has metadata. - If it doesn't have metadata, another node propably triggred the delection - routine earlier, so we bail out earlier to avoid an infinite cascade - of on_destroy events. ]] - mp1 = minetest.string_to_pos(m:get_string("portal_frame1")) - if not mp1 then - return - end + local neighbors = { + { 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 n=1, #neighbors do + local npos = vector.add(pos, neighbors[n]) + if minetest.get_node(npos).name == "mcl_portals:portal_end" then + minetest.remove_node(npos) end - local nn = minetest.get_node(p).name - if nn == portal_frame or nn == "mcl_portals:portal_end" then - -- Remove portal nodes, but not myself - if nn == "mcl_portals:portal_end" and not vector.equals(p, pos) then - minetest.remove_node(p) - end - -- Clear metadata of portal nodes and the frame - m:set_string("portal_frame1", "") - m:set_string("portal_frame2", "") - m:set_string("portal_target", "") - end - first = false - end - end end end --- Nodes +-- End portal minetest.register_node("mcl_portals:portal_end", { - description = "End Portal", + description = S("End Portal"), + _tt_help = S("Used to construct end portals"), + _doc_items_longdesc = S("An End portal teleports creatures and objects to the mysterious End dimension (and back!)."), + _doc_items_usagehelp = S("Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld."), tiles = { - "blank.png", - "blank.png", - "blank.png", - "blank.png", { name = "mcl_portals_end_portal.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 2.0, + length = 1.0, }, }, { @@ -85,16 +43,16 @@ minetest.register_node("mcl_portals:portal_end", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 2.0, + length = 6.0, }, }, + "blank.png", }, drawtype = "nodebox", paramtype = "light", - paramtype2 = "facedir", sunlight_propagates = true, use_texture_alpha = true, - walkable = false, + walkable = true, diggable = false, pointable = false, buildable_to = false, @@ -104,287 +62,325 @@ minetest.register_node("mcl_portals:portal_end", { light_source = 14, post_effect_color = {a = 192, r = 0, g = 0, b = 0}, alpha = 192, + after_destruct = destroy_portal, + -- This prevents “falling through” + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -7/16, 0.5}, + }, + }, node_box = { type = "fixed", fixed = { - {-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}, + {-0.5, -0.5, -0.5, 0.5, 4/16, 0.5}, }, }, - groups = {not_in_creative_inventory = 1}, - on_destruct = destroy_portal, + groups = {portal=1, not_in_creative_inventory = 1, disable_jump = 1}, _mcl_hardness = -1, - _mcl_blast_resistance = 18000000, + _mcl_blast_resistance = 36000000, }) -local function build_end_portal(pos, target3) - local p = {x = pos.x - 1, y = pos.y - 1, z = pos.z} - local p1 = {x = pos.x - 1, y = pos.y - 1, z = pos.z} - local p2 = {x = p1.x + 3, y = p1.y + 4, z = p1.z} - - for i = 1, 4 do - minetest.set_node(p, {name = portal_frame}) - p.y = p.y + 1 - end - for i = 1, 3 do - minetest.set_node(p, {name = portal_frame}) - p.x = p.x + 1 - end - for i = 1, 4 do - minetest.set_node(p, {name = portal_frame}) - p.y = p.y - 1 - end - for i = 1, 3 do - minetest.set_node(p, {name = portal_frame}) - p.x = p.x - 1 - end +-- Obsidian platform at the End portal destination in the End +local function build_end_portal_destination(pos) + local p1 = {x = pos.x - 2, y = pos.y, z = pos.z-2} + local p2 = {x = pos.x + 2, y = pos.y+2, z = pos.z+2} for x = p1.x, p2.x do for y = p1.y, p2.y do - p = {x = x, y = y, z = p1.z} - if not (x == p1.x or x == p2.x or y == p1.y or y == p2.y) then - minetest.set_node(p, {name = "mcl_portals:portal_end", param2 = 0}) + for z = p1.z, p2.z do + local newp = {x=x,y=y,z=z} + -- Build obsidian platform + if minetest.registered_nodes[minetest.get_node(newp).name].is_ground_content then + if y == p1.y then + minetest.set_node(newp, {name="mcl_core:obsidian"}) + else + minetest.remove_node(newp) + end end - local meta = minetest.get_meta(p) - meta:set_string("portal_frame1", minetest.pos_to_string(p1)) - meta:set_string("portal_frame2", minetest.pos_to_string(p2)) - meta:set_string("portal_target", minetest.pos_to_string(target3)) + end + end + end +end - if y ~= p1.y then - for z = -2, 2 do - if z ~= 0 then - p.z = p.z + z - if minetest.registered_nodes[ - minetest.get_node(p).name].is_ground_content then - minetest.remove_node(p) - end - p.z = p.z - z + +-- Check if pos is part of a valid end portal frame, filled with eyes of ender. +local function check_end_portal_frame(pos) + -- Check if pos has an end portal frame with eye of ender + local eframe = function(pos, param2) + local node = minetest.get_node(pos) + if node.name == "mcl_portals:end_portal_frame_eye" then + if param2 == nil or node.param2 == param2 then + return true, node + end + end + return false + end + + -- Step 1: Find a row of 3 end portal frames with eyes, all facing the same direction + local streak = 0 + local streak_start, streak_end, streak_start_node, streak_end_node + local last_param2 + local axes = { "x", "z" } + for a=1, #axes do + local axis = axes[a] + for b=pos[axis]-2, pos[axis]+2 do + local cpos = table.copy(pos) + cpos[axis] = b + local e, node = eframe(cpos, last_param2) + if e then + last_param2 = node.param2 + streak = streak + 1 + if streak == 1 then + streak_start = table.copy(pos) + streak_start[axis] = b + streak_start_node = node + elseif streak == 3 then + streak_end = table.copy(pos) + streak_end[axis] = b + streak_end_node = node + break + end + else + streak = 0 + last_param2 = nil + end + end + if streak_end then + break + end + streak = 0 + last_param2 = nil + end + -- Has a row been found? + if streak_end then + -- Step 2: Using the known facedir, check the remaining spots in which we expect + -- “eyed” end portal frames. + local dir = minetest.facedir_to_dir(streak_start_node.param2) + if dir.x ~= 0 then + for i=1, 3 do + if not eframe({x=streak_start.x + i*dir.x, y=streak_start.y, z=streak_start.z - 1}) then + return false + end + if not eframe({x=streak_start.x + i*dir.x, y=streak_start.y, z=streak_end.z + 1}) then + return false + end + if not eframe({x=streak_start.x + 4*dir.x, y=streak_start.y, z=streak_start.z + i-1}) then + return false end end - end - end - end -end - -local function find_end_target3_y2(target3_x, target3_z) - local start_y = mcl_vars.mg_end_min + math.random(20, 120) -- Search start - if not nobj_cave then - nobj_cave = minetest.get_perlin(np_cave) - end - local air = 0 -- Consecutive air nodes found - - for y = start_y, start_y - 120, -1 do - local nval_cave = nobj_cave:get3d({x = target3_x, y = y, z = target3_z}) - - if nval_cave > TCAVE then -- Cavern - air = air + 1 - else -- Not cavern, check if 4 nodes of space above - if air >= 4 then - return y + 2 - else -- Not enough space, reset air to zero - air = 0 + -- All checks survived! We have a valid portal! + local k + if dir.x > 0 then + k = 1 + else + k = -3 end - end - end - - return start_y -- Fallback -end - -local function move_check2(p1, max, dir) - local p = {x = p1.x, y = p1.y, z = p1.z} - local d = math.abs(max - p1[dir]) / (max - p1[dir]) - - while p[dir] ~= max do - p[dir] = p[dir] + d - if minetest.get_node(p).name ~= portal_frame then - return false - end - -- Abort if any of the portal frame blocks already has metadata. - -- This mod does not yet portals which neighbor each other directly. - -- TODO: Reorganize the way how portal frame coordinates are stored. - local meta = minetest.get_meta(p) - local p1 = meta:get_string("portal_frame1") - if minetest.string_to_pos(p1) ~= nil then - return false - end - end - - return true -end - -local function check_end_portal(p1, p2) - if p1.x ~= p2.x then - if not move_check2(p1, p2.x, "x") then - return false - end - if not move_check2(p2, p1.x, "x") then - return false - end - elseif p1.z ~= p2.z then - if not move_check2(p1, p2.z, "z") then - return false - end - if not move_check2(p2, p1.z, "z") then - return false - end - else - return false - end - - if not move_check2(p1, p2.y, "y") then - return false - end - if not move_check2(p2, p1.y, "y") then - return false - end - - return true -end - -local function is_end_portal(pos) - for d = -3, 3 do - for y = -4, 4 do - local px = {x = pos.x + d, y = pos.y + y, z = pos.z} - local pz = {x = pos.x, y = pos.y + y, z = pos.z + d} - - if check_end_portal(px, {x = px.x + 3, y = px.y + 4, z = px.z}) then - return px, {x = px.x + 3, y = px.y + 4, z = px.z} + return true, { x = streak_start.x + k, y = streak_start.y, z = streak_start.z } + elseif dir.z ~= 0 then + for i=1, 3 do + if not eframe({x=streak_start.x - 1, y=streak_start.y, z=streak_start.z + i*dir.z}) then + return false + end + if not eframe({x=streak_end.x + 1, y=streak_start.y, z=streak_start.z + i*dir.z}) then + return false + end + if not eframe({x=streak_start.x + i-1, y=streak_start.y, z=streak_start.z + 4*dir.z}) then + return false + end end - if check_end_portal(pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}) then - return pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3} + local k + if dir.z > 0 then + k = 1 + else + k = -3 end + -- All checks survived! We have a valid portal! + return true, { x = streak_start.x, y = streak_start.y, z = streak_start.z + k } end end + return false end -local function make_end_portal(pos) - local p1, p2 = is_end_portal(pos) - if not p1 or not p2 then - return false - end - - for d = 1, 2 do - for y = p1.y + 1, p2.y - 1 do - local p - if p1.z == p2.z then - p = {x = p1.x + d, y = y, z = p1.z} - else - p = {x = p1.x, y = y, z = p1.z + d} - end - if minetest.get_node(p).name ~= "air" then - return false - end - end - end - - local param2 - if p1.z == p2.z then - param2 = 0 +-- Generate or destroy a 3×3 end portal beginning at pos. To be used to fill an end portal framea. +-- If destroy == true, the 3×3 area is removed instead. +local function end_portal_area(pos, destroy) + local SIZE = 3 + local name + if destroy then + name = "air" else - param2 = 1 + name = "mcl_portals:portal_end" end - - local target3 = {x = p1.x, y = p1.y, z = p1.z} - target3.x = target3.x + 1 - if target3.y < mcl_vars.mg_end_max and target3.y > mcl_vars.mg_end_min then - target3.y = math.random(mcl_vars.mg_overworld_min + 40, mcl_vars.mg_overworld_min + 96) - else - target3.y = find_end_target3_y2(target3.x, target3.z) - end - - for d = 0, 3 do - for y = p1.y, p2.y do - local p = {} - if param2 == 0 then - p = {x = p1.x + d, y = y, z = p1.z} - else - p = {x = p1.x, y = y, z = p1.z + d} + local posses = {} + for x=pos.x, pos.x+SIZE-1 do + for z=pos.z, pos.z+SIZE-1 do + table.insert(posses, {x=x,y=pos.y,z=z}) end - if minetest.get_node(p).name == "air" then - minetest.set_node(p, {name = "mcl_portals:portal_end", param2 = param2}) - end - local meta = minetest.get_meta(p) - - -- Portal frame corners - meta:set_string("portal_frame1", minetest.pos_to_string(p1)) - meta:set_string("portal_frame2", minetest.pos_to_string(p2)) - - -- Portal target coordinates - meta:set_string("portal_target", minetest.pos_to_string(target3)) end - end - - return true + minetest.bulk_set_node(posses, {name=name}) end minetest.register_abm({ label = "End portal teleportation", nodenames = {"mcl_portals:portal_end"}, interval = 1, - chance = 2, + chance = 1, action = function(pos, node) - for _,obj in ipairs(minetest.get_objects_inside_radius(pos,1)) do --maikerumine added for objects to travel - local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel + for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel if obj:is_player() or lua_entity then - local meta = minetest.get_meta(pos) - local target3 = minetest.string_to_pos(meta:get_string("portal_target")) - if target3 then - -- force emerge of target3 area - minetest.get_voxel_manip():read_from_map(target3, target3) - if not minetest.get_node_or_nil(target3) then - minetest.emerge_area( - vector.subtract(target3, 4), vector.add(target3, 4)) + local dim = mcl_worlds.pos_to_dimension(pos) + + local objpos = obj:get_pos() + if objpos == nil then + return + end + + -- Check if object is actually in portal. + objpos.y = math.ceil(objpos.y) + if minetest.get_node(objpos).name ~= "mcl_portals:portal_end" then + return + end + + local target + if dim == "end" then + -- End portal in the End: + -- Teleport back to the player's spawn or world spawn in the Overworld. + + if obj:is_player() then + target = mcl_spawn.get_spawn_pos(obj) + else + target = mcl_spawn.get_world_spawn_pos(obj) + end + else + -- End portal in any other dimension: + -- Teleport to the End at a fixed position and generate a + -- 5×5 obsidian platform below. + + local platform_pos = mcl_vars.mg_end_platform_pos + -- force emerge of target1 area + minetest.get_voxel_manip():read_from_map(platform_pos, platform_pos) + if not minetest.get_node_or_nil(platform_pos) then + minetest.emerge_area(vector.subtract(platform_pos, 3), vector.add(platform_pos, 3)) end - -- teleport the player - minetest.after(3, function(obj, pos, target3) - local objpos = obj:getpos() - if objpos == nil then - return - end - -- If player stands, player is at ca. something+0.5 - -- which might cause precision problems, so we used ceil. - objpos.y = math.ceil(objpos.y) - if minetest.get_node(objpos).name ~= "mcl_portals:portal_end" then - return + -- Build destination + local function check_and_build_end_portal_destination(pos) + local n = minetest.get_node_or_nil(pos) + if n and n.name ~= "mcl_core:obsidian" then + build_end_portal_destination(pos) + minetest.after(2, check_and_build_end_portal_destination, pos) + elseif not n then + minetest.after(1, check_and_build_end_portal_destination, pos) end + end - -- Build destination - local function check_and_build_end_portal(pos, target3) - local n = minetest.get_node_or_nil(target3) - if n and n.name ~= "mcl_portals:portal_end" then - build_end_portal(target3, pos) - minetest.after(2, check_and_build_end_portal, pos, target3) - elseif not n then - minetest.after(1, check_and_build_end_portal, pos, target3) - end - end + local platform + build_end_portal_destination(platform_pos) + check_and_build_end_portal_destination(platform_pos) - check_and_build_end_portal(pos, target3) + target = table.copy(platform_pos) + target.y = target.y + 1 + end - -- Teleport - obj:setpos(target3) - minetest.sound_play("mcl_portals_teleport", {pos=target3, gain=0.5, max_hear_distance = 16}) - - end, obj, pos, target3) + -- Teleport + obj:set_pos(target) + if obj:is_player() then + -- Look towards the main End island + if dim ~= "end" then + obj:set_look_horizontal(math.pi/2) + end + mcl_worlds.dimension_change(obj, mcl_worlds.pos_to_dimension(target)) + minetest.sound_play("mcl_portals_teleport", {pos=target, gain=0.5, max_hear_distance = 16}, true) end end end end, }) +local rotate_frame, rotate_frame_eye + +if minetest.get_modpath("screwdriver") then + -- Intentionally not rotatable + rotate_frame = false + rotate_frame_eye = false +end + +minetest.register_node("mcl_portals:end_portal_frame", { + description = S("End Portal Frame"), + _tt_help = S("Used to construct end portals"), + _doc_items_longdesc = S("End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.") .. "\n" .. S("NOTE: The End dimension is currently incomplete and might change in future versions."), + _doc_items_usagehelp = S("To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.") .. "\n" .. S("Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.") .. "\n" .. S("Once placed, an eye of ender can not be taken back."), + groups = { creative_breakable = 1, deco_block = 1, end_portal_frame = 1 }, + tiles = { "mcl_portals_endframe_top.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_side.png" }, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 5/16, 0.5 }, + }, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + paramtype = "light", + sunlight_propagates = false, + light_source = 1, + + on_rotate = rotate_frame, + + _mcl_blast_resistance = 36000000, + _mcl_hardness = -1, +}) + +minetest.register_node("mcl_portals:end_portal_frame_eye", { + description = S("End Portal Frame with Eye of Ender"), + _tt_help = S("Used to construct end portals"), + _doc_items_create_entry = false, + groups = { creative_breakable = 1, deco_block = 1, comparator_signal = 15, end_portal_frame = 2 }, + tiles = { "mcl_portals_endframe_top.png^[lowpart:75:mcl_portals_endframe_eye.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_eye.png^mcl_portals_endframe_side.png" }, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 5/16, 0.5 }, -- Frame + { -4/16, 5/16, -4/16, 4/16, 0.5, 4/16 }, -- Eye + }, + }, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + paramtype = "light", + sunlight_propagates = false, + light_source = 1, + on_destruct = function(pos) + local ok, ppos = check_end_portal_frame(pos) + if ok then + end_portal_area(ppos, true) + end + end, + on_construct = function(pos) + local ok, ppos = check_end_portal_frame(pos) + if ok then + end_portal_area(ppos) + end + end, + + on_rotate = rotate_frame_eye, + + _mcl_blast_resistance = 36000000, + _mcl_hardness = -1, +}) + +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_portals:end_portal_frame", "nodes", "mcl_portals:end_portal_frame_eye") +end + --[[ ITEM OVERRIDES ]] --- Frame material -minetest.override_item(portal_frame, { - on_destruct = destroy_portal, -}) - -- Portal opener minetest.override_item("mcl_end:ender_eye", { - _doc_items_longdesc = "An eye of ander can be used to open a portal to the End.", - _doc_items_usagehelp = "To open an End portal, place an upright frame of quartz blocks with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the eye of ender on the frame.", on_place = function(itemstack, user, pointed_thing) -- Use pointed node's on_rightclick function first, if present local node = minetest.get_node(pointed_thing.under) @@ -394,23 +390,36 @@ minetest.override_item("mcl_end:ender_eye", { end end - -- If used on portal frame, open a portal - if pointed_thing.under and node.name == portal_frame then - local opened = make_end_portal(pointed_thing.under) - if opened then + -- Place eye of ender into end portal frame + if pointed_thing.under and node.name == "mcl_portals:end_portal_frame" then + local protname = user:get_player_name() + if minetest.is_protected(pointed_thing.under, protname) then + minetest.record_protection_violation(pointed_thing.under, protname) + return itemstack + end + minetest.set_node(pointed_thing.under, { name = "mcl_portals:end_portal_frame_eye", param2 = node.param2 }) + + if minetest.get_modpath("doc") then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:end_portal_frame") + end + minetest.sound_play( + "default_place_node_hard", + {pos = pointed_thing.under, gain = 0.5, max_hear_distance = 16}, true) + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() -- 1 use + end + + local ok = check_end_portal_frame(pointed_thing.under) + if ok then if minetest.get_modpath("doc") then doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal_end") end - minetest.sound_play( - "fire_flint_and_steel", - {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 16}) - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() -- 1 use - end end end - return itemstack end, }) +minetest.override_item("mcl_core:bedrock", { + after_destruct = destroy_portal, +}) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 221af24a..f58058e6 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_portals") + -- Parameters local TCAVE = 0.6 @@ -6,8 +8,14 @@ local nobj_cave = nil -- Portal frame sizes local FRAME_SIZE_X_MIN = 4 local FRAME_SIZE_Y_MIN = 5 -local FRAME_SIZE_X_MAX = 23 -local FRAME_SIZE_Y_MAX = 23 +local FRAME_SIZE_X_MAX = 4 -- TODO: 23 +local FRAME_SIZE_Y_MAX = 5 -- TODO: 23 + +local TELEPORT_DELAY = 3 -- seconds before teleporting in Nether portal +local TELEPORT_COOLOFF = 4 -- after object was teleported, for this many seconds it won't teleported again + +local mg_name = minetest.get_mapgen_setting("mg_name") +local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" -- 3D noise local np_cave = { @@ -19,6 +27,11 @@ local np_cave = { persist = 0.7 } +-- Table of objects (including players) which recently teleported by a +-- Nether portal. Those objects have a brief cooloff period before they +-- can teleport again. This prevents annoying back-and-forth teleportation. +local portal_cooloff = {} + -- Destroy portal if pos (portal frame or portal node) got destroyed local destroy_portal = function(pos) -- Deactivate Nether portal @@ -66,7 +79,10 @@ local destroy_portal = function(pos) end minetest.register_node("mcl_portals:portal", { - description = "Nether Portal", + description = S("Nether Portal"), + _doc_items_longdesc = S("A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!"), + _doc_items_usagehelp = S("Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion."), + tiles = { "blank.png", "blank.png", @@ -103,7 +119,7 @@ minetest.register_node("mcl_portals:portal", { is_ground_content = false, drop = "", light_source = 11, - post_effect_color = {a = 180, r = 128, g = 23, b = 23}, + post_effect_color = {a = 180, r = 51, g = 7, b = 89}, alpha = 192, node_box = { type = "fixed", @@ -111,7 +127,7 @@ minetest.register_node("mcl_portals:portal", { {-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}, }, }, - groups = {not_in_creative_inventory = 1}, + groups = {portal=1, not_in_creative_inventory = 1}, on_destruct = destroy_portal, _mcl_hardness = -1, @@ -169,17 +185,21 @@ local function build_portal(pos, target) end end end + minetest.log("action", "[mcl_portal] Destination Nether portal generated at "..minetest.pos_to_string(p2).."!") end local function find_nether_target_y(target_x, target_z) - local start_y = mcl_vars.mg_nether_min + math.random(38, 117) -- Search start + if mg_name == "flat" then + return mcl_vars.mg_flat_nether_floor + 1 + end + local start_y = math.random(mcl_vars.mg_lava_nether_max + 1, mcl_vars.mg_bedrock_nether_top_min - 5) -- Search start if not nobj_cave then nobj_cave = minetest.get_perlin(np_cave) end local air = 4 - for y = start_y, start_y -117, -1 do - local nval_cave = nobj_cave:get3d({x = target_x, y = y, z = target_z}) + for y = start_y, math.max(mcl_vars.mg_lava_nether_max + 1), -1 do + local nval_cave = nobj_cave:get_3d({x = target_x, y = y, z = target_z}) if nval_cave > TCAVE then -- Cavern air = air + 1 @@ -253,22 +273,39 @@ end local function is_portal(pos) local xsize, ysize = FRAME_SIZE_X_MIN-1, FRAME_SIZE_Y_MIN-1 - for d = -xsize, xsize do - for y = -ysize, ysize do - local px = {x = pos.x + d, y = pos.y + y, z = pos.z} - local pz = {x = pos.x, y = pos.y + y, z = pos.z + d} - - if check_portal(px, {x = px.x + xsize, y = px.y + ysize, z = px.z}) then - return px, {x = px.x + xsize, y = px.y + ysize, z = px.z} - end - if check_portal(pz, {x = pz.x, y = pz.y + ysize, z = pz.z + xsize}) then - return pz, {x = pz.x, y = pz.y + ysize, z = pz.z + xsize} + for sx = FRAME_SIZE_X_MIN, FRAME_SIZE_X_MAX do + local xsize = sx - 1 + for sy = FRAME_SIZE_Y_MIN, FRAME_SIZE_Y_MAX do + local ysize = sy - 1 + for d = -xsize, xsize do + for y = -ysize, ysize do + local px = {x = pos.x + d, y = pos.y + y, z = pos.z} + local pz = {x = pos.x, y = pos.y + y, z = pos.z + d} + if check_portal(px, {x = px.x + xsize, y = px.y + ysize, z = px.z}) then + return px, {x = px.x + xsize, y = px.y + ysize, z = px.z} + end + if check_portal(pz, {x = pz.x, y = pz.y + ysize, z = pz.z + xsize}) then + return pz, {x = pz.x, y = pz.y + ysize, z = pz.z + xsize} + end + end end end end end -local function make_portal(pos) +-- Attempts to light a Nether portal at pos and +-- select target position. +-- Pos can be any of the obsidian frame blocks or the inner part. +-- The frame MUST be filled only with air or any fire, which will be replaced with Nether portal blocks. +-- If no Nether portal can be lit, nothing happens. +-- Returns true on success and false on failure. +function mcl_portals.light_nether_portal(pos) + -- Only allow to make portals in Overworld and Nether + local dim = mcl_worlds.pos_to_dimension(pos) + if dim ~= "overworld" and dim ~= "nether" then + return false + end + -- Create Nether portal nodes local p1, p2 = is_portal(pos) if not p1 or not p2 then return false @@ -282,7 +319,8 @@ local function make_portal(pos) else p = {x = p1.x, y = y, z = p1.z + d} end - if minetest.get_node(p).name ~= "air" then + local nn = minetest.get_node(p).name + if nn ~= "air" and minetest.get_item_group(nn, "fire") ~= 1 then return false end end @@ -295,15 +333,29 @@ local function make_portal(pos) param2 = 1 end + -- Find target + local target = {x = p1.x, y = p1.y, z = p1.z} target.x = target.x + 1 if target.y < mcl_vars.mg_nether_max and target.y > mcl_vars.mg_nether_min then - target.y = math.random(mcl_vars.mg_overworld_min + 40, mcl_vars.mg_overworld_min + 96) + if superflat then + target.y = mcl_vars.mg_bedrock_overworld_max + 5 + elseif mg_name == "flat" then + local ground = minetest.get_mapgen_setting("mgflat_ground_level") + ground = tonumber(ground) + if not ground then + ground = 8 + end + target.y = ground + 2 + else + target.y = math.random(mcl_vars.mg_overworld_min + 40, mcl_vars.mg_overworld_min + 96) + end else target.y = find_nether_target_y(target.x, target.z) end - local dmin, dmax, ymin, ymax = 0, FRAME_SIZE_X_MIN - 1, p1.y, p2.y + local dmin, ymin, ymax = 0, p1.y, p2.y + local dmax = math.max(math.abs(p1.x - p2.x), math.abs(p1.z - p2.z)) for d = dmin, dmax do for y = ymin, ymax do if not ((d == dmin or d == dmax) and (y == ymin or y == ymax)) then @@ -313,7 +365,7 @@ local function make_portal(pos) else p = {x = p1.x, y = y, z = p1.z + d} end - if minetest.get_node(p).name == "air" then + if d ~= dmin and d ~= dmax and y ~= ymin and y ~= ymax then minetest.set_node(p, {name = "mcl_portals:portal", param2 = param2}) end local meta = minetest.get_meta(p) @@ -338,37 +390,48 @@ minetest.register_abm({ interval = 1, chance = 2, action = function(pos, node) - minetest.add_particlespawner( - 32, --amount - 4, --time - {x = pos.x - 0.25, y = pos.y - 0.25, z = pos.z - 0.25}, --minpos - {x = pos.x + 0.25, y = pos.y + 0.25, z = pos.z + 0.25}, --maxpos - {x = -0.8, y = -0.8, z = -0.8}, --minvel - {x = 0.8, y = 0.8, z = 0.8}, --maxvel - {x = 0, y = 0, z = 0}, --minacc - {x = 0, y = 0, z = 0}, --maxacc - 0.5, --minexptime - 1, --maxexptime - 1, --minsize - 2, --maxsize - false, --collisiondetection - "mcl_portals_particle.png" --texture - ) + minetest.add_particlespawner({ + amount = 32, + time = 4, + minpos = {x = pos.x - 0.25, y = pos.y - 0.25, z = pos.z - 0.25}, + maxpos = {x = pos.x + 0.25, y = pos.y + 0.25, z = pos.z + 0.25}, + minvel = {x = -0.8, y = -0.8, z = -0.8}, + maxvel = {x = 0.8, y = 0.8, z = 0.8}, + minacc = {x = 0, y = 0, z = 0}, + maxacc = {x = 0, y = 0, z = 0}, + minexptime = 0.5, + maxexptime = 1, + minsize = 1, + maxsize = 2, + collisiondetection = false, + texture = "mcl_particles_teleport.png", + }) for _,obj in ipairs(minetest.get_objects_inside_radius(pos,1)) do --maikerumine added for objects to travel local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel if obj:is_player() or lua_entity then + -- Prevent quick back-and-forth teleportation + if portal_cooloff[obj] then + return + end local meta = minetest.get_meta(pos) local target = minetest.string_to_pos(meta:get_string("portal_target")) if target then -- force emerge of target area minetest.get_voxel_manip():read_from_map(target, target) if not minetest.get_node_or_nil(target) then - minetest.emerge_area( - vector.subtract(target, 4), vector.add(target, 4)) + minetest.emerge_area(vector.subtract(target, 4), vector.add(target, 4)) end - -- teleport the player - minetest.after(3, function(obj, pos, target) - local objpos = obj:getpos() + + -- teleport function + local teleport = function(obj, pos, target) + if (not obj:get_luaentity()) and (not obj:is_player()) then + return + end + -- Prevent quick back-and-forth teleportation + if portal_cooloff[obj] then + return + end + local objpos = obj:get_pos() if objpos == nil then return end @@ -380,25 +443,42 @@ minetest.register_abm({ return end - -- Build target portal - local function check_and_build_portal(pos, target) - local n = minetest.get_node_or_nil(target) - if n and n.name ~= "mcl_portals:portal" then - build_portal(target, pos) - minetest.after(2, check_and_build_portal, pos, target) - elseif not n then - minetest.after(1, check_and_build_portal, pos, target) - end + -- Teleport + obj:set_pos(target) + if obj:is_player() then + mcl_worlds.dimension_change(obj, mcl_worlds.pos_to_dimension(target)) + minetest.sound_play("mcl_portals_teleport", {pos=target, gain=0.5, max_hear_distance = 16}, true) end - check_and_build_portal(pos, target) + -- Enable teleportation cooloff for some seconds, to prevent back-and-forth teleportation + portal_cooloff[obj] = true + minetest.after(TELEPORT_COOLOFF, function(o) + portal_cooloff[o] = false + end, obj) + if obj:is_player() then + local name = obj:get_player_name() + minetest.log("action", "[mcl_portal] "..name.." teleported to Nether portal at "..minetest.pos_to_string(target)..".") + end + end - -- Teleport - obj:setpos(target) - minetest.sound_play("mcl_portals_teleport", {pos=target, gain=0.5, max_hear_distance = 16}) + local n = minetest.get_node_or_nil(target) + if n and n.name ~= "mcl_portals:portal" then + -- Emerge target area, wait for emerging to be finished, build destination portal + -- (if there isn't already one, teleport object after a short delay. + local emerge_callback = function(blockpos, action, calls_remaining, param) + minetest.log("verbose", "[mcl_portal] emerge_callack called! action="..action) + if calls_remaining <= 0 and action ~= minetest.EMERGE_CANCELLED and action ~= minetest.EMERGE_ERRORED then + minetest.log("verbose", "[mcl_portal] Area for destination Nether portal emerged!") + build_portal(param.target, param.pos, false) + minetest.after(TELEPORT_DELAY, teleport, obj, pos, target) + end + end + minetest.log("verbose", "[mcl_portal] Emerging area for destination Nether portal ...") + minetest.emerge_area(vector.subtract(target, 7), vector.add(target, 7), emerge_callback, { pos = pos, target = target }) + else + minetest.after(TELEPORT_DELAY, teleport, obj, pos, target) + end - - end, obj, pos, target) end end end @@ -408,19 +488,31 @@ minetest.register_abm({ --[[ ITEM OVERRIDES ]] --- Frame material +local longdesc = minetest.registered_nodes["mcl_core:obsidian"]._doc_items_longdesc +longdesc = longdesc .. "\n" .. S("Obsidian is also used as the frame of Nether portals.") +local usagehelp = S("To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.") + minetest.override_item("mcl_core:obsidian", { + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, on_destruct = destroy_portal, _on_ignite = function(user, pointed_thing) local pos = pointed_thing.under - local portal_placed = make_portal(pos) + local portal_placed = mcl_portals.light_nether_portal(pos) + if portal_placed then + minetest.log("action", "[mcl_portal] Nether portal activated at "..minetest.pos_to_string(pos)..".") + end if portal_placed and minetest.get_modpath("doc") then doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal") - else - local node = minetest.get_node(pointed_thing.above) - if node.name ~= "mcl_portals:portal" then - mcl_fire.set_fire(pointed_thing) + + -- Achievement for finishing a Nether portal TO the Nether + local dim = mcl_worlds.pos_to_dimension(pos) + if minetest.get_modpath("awards") and dim ~= "nether" and user:is_player() then + awards.unlock(user:get_player_name(), "mcl:buildNetherPortal") end + return true + else + return false end end, }) diff --git a/mods/ITEMS/mcl_portals/sounds/mcl_portals_teleport.ogg b/mods/ITEMS/mcl_portals/sounds/mcl_portals_teleport.ogg index b943a832..1d64c451 100644 Binary files a/mods/ITEMS/mcl_portals/sounds/mcl_portals_teleport.ogg and b/mods/ITEMS/mcl_portals/sounds/mcl_portals_teleport.ogg differ diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_end_portal.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_end_portal.png index 975be7f7..1003beb3 100644 Binary files a/mods/ITEMS/mcl_portals/textures/mcl_portals_end_portal.png and b/mods/ITEMS/mcl_portals/textures/mcl_portals_end_portal.png differ diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_bottom.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_bottom.png new file mode 100644 index 00000000..49125a86 Binary files /dev/null and b/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_bottom.png differ diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_eye.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_eye.png new file mode 100644 index 00000000..c1d3a2bb Binary files /dev/null and b/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_eye.png differ diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_side.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_side.png new file mode 100644 index 00000000..6922795e Binary files /dev/null and b/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_side.png differ diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_top.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_top.png new file mode 100644 index 00000000..ad2b729f Binary files /dev/null and b/mods/ITEMS/mcl_portals/textures/mcl_portals_endframe_top.png differ diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_particle.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_particle.png deleted file mode 100644 index 56a5b78c..00000000 Binary files a/mods/ITEMS/mcl_portals/textures/mcl_portals_particle.png and /dev/null differ diff --git a/mods/ITEMS/mcl_portals/textures/mcl_portals_portal.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_portal.png index 4fad43cb..4be1e41f 100644 Binary files a/mods/ITEMS/mcl_portals/textures/mcl_portals_portal.png and b/mods/ITEMS/mcl_portals/textures/mcl_portals_portal.png differ diff --git a/mods/ITEMS/mcl_potions/README.txt b/mods/ITEMS/mcl_potions/README.txt index 0fa49a9e..7ebe4ba6 100644 --- a/mods/ITEMS/mcl_potions/README.txt +++ b/mods/ITEMS/mcl_potions/README.txt @@ -1,5 +1,5 @@ License information: -* Code: WTFPL -* Textures: From Faithful 32×32 texture pack (see main MineClone 2 license notes) +* Code: MIT License +* Textures: See main MineClone 2 README.md file * Sounds: CC0 diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index f6a796f8..5123d8b7 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -1,11 +1,14 @@ -local brewhelp = "This item is used in potion brewing." +local S = minetest.get_translator("mcl_potions") + +local brewhelp = S("Put this item in an item frame for decoration. It's useless otherwise.") minetest.register_craftitem("mcl_potions:fermented_spider_eye", { - description = "Fermented Spider Eye", + description = S("Fermented Spider Eye"), _doc_items_longdesc = brewhelp, wield_image = "mcl_potions_spider_eye_fermented.png", inventory_image = "mcl_potions_spider_eye_fermented.png", - groups = { brewitem = 1 }, + -- TODO: Reveal item when it's actually useful + groups = { brewitem = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1 }, stack_max = 64, }) @@ -16,9 +19,10 @@ minetest.register_craft({ }) minetest.register_craftitem("mcl_potions:glass_bottle", { - description = "Glass Bottle", - _doc_items_longdesc = "A glass bottle is used as a container for potions and can be used to collect water directly.", - _doc_items_usagehelp = "To collect water, it on a cauldron with water (which removes a level of water) or a water source (which removes no water).", + description = S("Glass Bottle"), + _tt_help = S("Liquid container"), + _doc_items_longdesc = S("A glass bottle is used as a container for liquids and can be used to collect water directly."), + _doc_items_usagehelp = S("To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water)."), inventory_image = "mcl_potions_potion_bottle_empty.png", wield_image = "mcl_potions_potion_bottle_empty.png", groups = {brewitem=1}, @@ -37,38 +41,74 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { -- Try to fill glass bottle with water local get_water = false + local from_liquid_source = false + local river_water = false if not def then -- Unknown node: no-op elseif def.groups and def.groups.water and def.liquidtype == "source" then -- Water source get_water = true + from_liquid_source = true + river_water = node.name == "mclx_core:river_water_source" -- Or reduce water level of cauldron by 1 - elseif node.name == "mcl_cauldrons:cauldron_3" then - get_water = true - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_2"}) - elseif node.name == "mcl_cauldrons:cauldron_2" then - get_water = true - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_1"}) - elseif node.name == "mcl_cauldrons:cauldron_1" then - get_water = true - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) + elseif string.sub(node.name, 1, 14) == "mcl_cauldrons:" then + local pname = placer:get_player_name() + if minetest.is_protected(pointed_thing.under, pname) then + minetest.record_protection_violation(pointed_thing.under, pname) + return itemstack + end + if node.name == "mcl_cauldrons:cauldron_3" then + get_water = true + minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_2"}) + elseif node.name == "mcl_cauldrons:cauldron_2" then + get_water = true + minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_1"}) + elseif node.name == "mcl_cauldrons:cauldron_1" then + get_water = true + minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) + elseif node.name == "mcl_cauldrons:cauldron_3r" then + get_water = true + river_water = true + minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_2r"}) + elseif node.name == "mcl_cauldrons:cauldron_2r" then + get_water = true + river_water = true + minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_1r"}) + elseif node.name == "mcl_cauldrons:cauldron_1r" then + get_water = true + river_water = true + minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) + end end if get_water then - -- Replace with water bottle, if possible, otherwise - -- place the water potion at a place where's space - local water_bottle = ItemStack("mcl_potions:potion_water") - minetest.sound_play("mcl_potions_bottle_fill", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}) - if itemstack:get_count() == 1 then - return water_bottle - else - local inv = placer:get_inventory() - if inv:room_for_item("main", water_bottle) then - inv:add_item("main", water_bottle) + local creative = minetest.settings:get_bool("creative_mode") == true + if from_liquid_source or creative then + -- Replace with water bottle, if possible, otherwise + -- place the water potion at a place where's space + local water_bottle + if river_water then + water_bottle = ItemStack("mcl_potions:potion_river_water") else - minetest.add_item(placer:getpos(), water_bottle) + water_bottle = ItemStack("mcl_potions:potion_water") + end + local inv = placer:get_inventory() + if creative then + -- Don't replace empty bottle in creative for convenience reasons + if not inv:contains_item("main", water_bottle) then + inv:add_item("main", water_bottle) + end + elseif itemstack:get_count() == 1 then + return water_bottle + else + if inv:room_for_item("main", water_bottle) then + inv:add_item("main", water_bottle) + else + minetest.add_item(placer:get_pos(), water_bottle) + end + itemstack:take_item() end - itemstack:take_item() end + minetest.sound_play("mcl_potions_bottle_fill", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}, true) end end return itemstack @@ -83,7 +123,7 @@ minetest.register_craft( { } }) --- Tempalte function for creating images of filled potions +-- Template function for creating images of filled potions -- - colorstring must be a ColorString of form “#RRGGBB”, e.g. “#0000FF” for blue. -- - opacity is optional opacity from 0-255 (default: 127) local potion_image = function(colorstring, opacity) @@ -93,16 +133,40 @@ local potion_image = function(colorstring, opacity) return "mcl_potions_potion_bottle_drinkable.png^(mcl_potions_potion_overlay.png^[colorize:"..colorstring..":"..tostring(opacity)..")" end +-- Cauldron fill up rules: +-- Adding any water increases the water level by 1, preserving the current water type +local cauldron_levels = { + -- start = { add water, add river water } + { "", "_1", "_1r" }, + { "_1", "_2", "_2" }, + { "_2", "_3", "_3" }, + { "_1r", "_2r", "_2r" }, + { "_2r", "_3r", "_3r" }, +} +local fill_cauldron = function(cauldron, water_type) + local base = "mcl_cauldrons:cauldron" + for i=1, #cauldron_levels do + if cauldron == base .. cauldron_levels[i][1] then + if water_type == "mclx_core:river_water_source" then + return base .. cauldron_levels[i][3] + else + return base .. cauldron_levels[i][2] + end + end + end +end + -- Itemstring of potions is “mcl_potions:potion_” minetest.register_craftitem("mcl_potions:potion_water", { - description = "Water Bottle", - _doc_items_longdesc = "Water bottles can be used to brew potions and to fill cauldrons. Drinking water has no effect.", - _doc_items_usagehelp = "Wield it and rightclick to drink it. Rightclick a cauldron to put the water into the cauldron.", + description = S("Water Bottle"), + _tt_help = S("No effect"), + _doc_items_longdesc = S("Water bottles can be used to fill cauldrons. Drinking water has no effect."), + _doc_items_usagehelp = S("Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron."), stack_max = 1, inventory_image = potion_image("#0000FF"), wield_image = potion_image("#0000FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1}, + groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1}, on_place = function(itemstack, placer, pointed_thing) if pointed_thing.type == "node" then local node = minetest.get_node(pointed_thing.under) @@ -115,19 +179,21 @@ minetest.register_craftitem("mcl_potions:potion_water", { end end - -- Increase water level of cauldron by 1 - if node.name == "mcl_cauldrons:cauldron" then - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_1"}) - minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}) - return "mcl_potions:glass_bottle" - elseif node.name == "mcl_cauldrons:cauldron_1" then - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_2"}) - minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}) - return "mcl_potions:glass_bottle" - elseif node.name == "mcl_cauldrons:cauldron_2" then - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_3"}) - minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}) - return "mcl_potions:glass_bottle" + local cauldron = fill_cauldron(node.name, "mcl_core:water_source") + if cauldron then + local pname = placer:get_player_name() + if minetest.is_protected(pointed_thing.under, pname) then + minetest.record_protection_violation(pointed_thing.under, pname) + return itemstack + end + -- Increase water level of cauldron by 1 + minetest.set_node(pointed_thing.under, {name=cauldron}) + minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}, true) + if minetest.settings:get_bool("creative_mode") == true then + return itemstack + else + return "mcl_potions:glass_bottle" + end end end @@ -137,47 +203,102 @@ minetest.register_craftitem("mcl_potions:potion_water", { on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) -local how_to_drink = "To drink it, wield it, then rightclick." +minetest.register_craftitem("mcl_potions:potion_river_water", { + description = S("River Water Bottle"), + _tt_help = S("No effect"), + _doc_items_longdesc = S("River water bottles can be used to fill cauldrons. Drinking it has no effect."), + _doc_items_usagehelp = S("Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron."), + + stack_max = 1, + inventory_image = potion_image("#0044FF"), + wield_image = potion_image("#0044FF"), + groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1}, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + + -- Call on_rightclick if the pointed node defines it + if placer and not placer:get_player_control().sneak then + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack + end + end + + local cauldron = fill_cauldron(node.name, "mclx_core:river_water_source") + if cauldron then + local pname = placer:get_player_name() + if minetest.is_protected(pointed_thing.under, pname) then + minetest.record_protection_violation(pointed_thing.under, pname) + return itemstack + end + -- Increase water level of cauldron by 1 + minetest.set_node(pointed_thing.under, {name=cauldron}) + minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}, true) + if minetest.settings:get_bool("creative_mode") == true then + return itemstack + else + return "mcl_potions:glass_bottle" + end + end + end + + -- Drink the water by default + return minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, placer, pointed_thing) + end, + on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), +}) + + + +local how_to_drink = S("Use the “Place” key to drink it.") minetest.register_craftitem("mcl_potions:potion_awkward", { - description = "Awkward Potion", - _doc_items_longdesc = "This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect.", + description = S("Awkward Potion"), + _tt_help = S("No effect"), + _doc_items_longdesc = S("This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect."), _doc_items_usagehelp = how_to_drink, stack_max = 1, inventory_image = potion_image("#0000FF"), wield_image = potion_image("#0000FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1}, + -- TODO: Reveal item when it's actually useful + groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1}, on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) minetest.register_craftitem("mcl_potions:potion_mundane", { - description = "Mundane Potion", - _doc_items_longdesc = "This potion has a clean taste and is used for brewing more potions. Drinking it has no effect.", + description = S("Mundane Potion"), + _tt_help = S("No effect"), + _doc_items_longdesc = S("This potion has a clean taste and is used for brewing more potions. Drinking it has no effect."), _doc_items_usagehelp = how_to_drink, stack_max = 1, inventory_image = potion_image("#0000FF"), wield_image = potion_image("#0000FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1}, + -- TODO: Reveal item when it's actually useful + groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 }, on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) minetest.register_craftitem("mcl_potions:potion_thick", { - description = "Thick Potion", - _doc_items_longdesc = "This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect.", + description = S("Thick Potion"), + _tt_help = S("No effect"), + _doc_items_longdesc = S("This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect."), _doc_items_usagehelp = how_to_drink, stack_max = 1, inventory_image = potion_image("#0000FF"), wield_image = potion_image("#0000FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1}, + -- TODO: Reveal item when it's actually useful + groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 }, on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) minetest.register_craftitem("mcl_potions:speckled_melon", { - description = "Glistering Melon", - _doc_items_longdesc = brewhelp, + description = S("Glistering Melon"), + _doc_items_longdesc = S("This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else."), stack_max = 64, - groups = { brewitem = 1 }, + -- TODO: Reveal item when it's actually useful + groups = { brewitem = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1 }, inventory_image = "mcl_potions_melon_speckled.png", }) @@ -191,10 +312,11 @@ minetest.register_craft({ }) minetest.register_craftitem("mcl_potions:dragon_breath", { - description = "Dragon's Breath", + description = S("Dragon's Breath"), _doc_items_longdesc = brewhelp, wield_image = "mcl_potions_dragon_breath.png", inventory_image = "mcl_potions_dragon_breath.png", - groups = { brewitem = 1 }, + -- TODO: Reveal item when it's actually useful + groups = { brewitem = 1, not_in_creative_inventory = 1 }, stack_max = 64, }) diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr new file mode 100644 index 00000000..c01b7f3c --- /dev/null +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_potions +Put this item in an item frame for decoration. It's useless otherwise.=Platizeren Sie diesen Gegenstand in einen Rahmen als Deko. Ansonsten ist er nutzlos. +Fermented Spider Eye=Fermentiertes Spinnenauge +Glass Bottle=Glasflasche +A glass bottle is used as a container for liquids and can be used to collect water directly.=Eine Glasflasche wird als Behälter von Flüssigkeiten benutzt und kann Wasser direkt aufsammeln. +To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Um Wasser aufzusammen, benutzen Sie sie an einem Kessel mit Wasser (was etwas Wasser entfernt) oder einer Wasserquelle (was kein Wasser entfernt). +Water Bottle=Wasserflasche +Water bottles can be used to fill cauldrons. Drinking water has no effect.=Wasserflaschen können benutzt werden, um Kessel aufzufüllen. Trinken hat keine Wirkung. +Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron.=Rechtsklicken zum Trinken. Auf einem Kessel rechtsklicken, um das Wasser in den Kessel zu schütten. +River Water Bottle=Flusswasserflasche +River water bottles can be used to fill cauldrons. Drinking it has no effect.=Flusswasserflaschen können benutzt werden, um Kessel aufzufüllen. Trinken hat keine Wirkung. +Awkward Potion=Seltsamer Trank +This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect.=Dieser Trank schmeckt komisch. Er wird zum Brauen von Tränken benutzt. Trinken hat keine Wirkung. +Mundane Potion=Klarer Trank +This potion has a clean taste and is used for brewing more potions. Drinking it has no effect.=Dieser Trank hat einen klaren Geschmack und wird zum Brauen von Tränken benutzt. Trinken hat keine Wirkung. +Thick Potion=Bitterer Trank +This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect.=Dieser Trank hat einen bitteren Geschmack und wird zum Brauen von Tränken benutzt. Trinken hat keine Wirkung. +Glistering Melon=Glitzermelone +This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Diese glänzende Melone ist voller winziger Goldnuggets und sähe ganz nett in einem Rahmen aus. Er ist nicht essbar und auch sonst zu nichts zu gebrauchen. +Dragon's Breath=Drachenatem +Use the “Place” key to drink it.=Benutzen Sie die „Platzieren“-Taste zum Trinken. +Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Benutzen Sie die „Platzieren“-Taste zum Trinken. Platzieren Sie diesen Gegenstand auf einen Kessel, um das Wasser in den Kessel zu schütten. +Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Benutzen Sie die „Platzieren“-Taste zum Trinken. Platzieren Sie diesen Gegenstand auf einen Kessel, um das Flusswasser in den Kessel zu schütten. +Liquid container=Flüssigkeitsbehälter +No effect=Keine Wirkung diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.es.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.es.tr new file mode 100644 index 00000000..82f38bb6 --- /dev/null +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.es.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_potions +Put this item in an item frame for decoration. It's useless otherwise.=Pon este artículo en un marco de artículo para la decoración. +Fermented Spider Eye=Ojo de araña fermentado +Glass Bottle=Frasco de cristal +A glass bottle is used as a container for liquids and can be used to collect water directly.=El frasco de cristal se usa como recipiente para líquidos y se puede usar para recoger agua directamente. +To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Para recoger agua, colóquela en un caldero con agua (que elimina un nivel de agua) o cualquier fuente de agua (que no elimine agua). +Water Bottle=Frasco de cristal con agua +Water bottles can be used to fill cauldrons. Drinking water has no effect.=Las botellas de agua se pueden usar para llenar calderos. El agua potable no tiene efecto. +Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron.=Haga clic derecho para beber. Haga clic derecho en un caldero para verter el agua en el caldero. +River Water Bottle=Frasco de cristal con agua de rio +River water bottles can be used to fill cauldrons. Drinking it has no effect.=Las botellas de agua de río se pueden usar para llenar calderos. Beberlo no tiene ningún efecto. +Awkward Potion=Poción incomoda +This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect.=Esta poción tiene un sabor extraño y se usa para preparar más pociones. Beberlo no tiene ningún efecto. +Mundane Potion=Poción Mundana +This potion has a clean taste and is used for brewing more potions. Drinking it has no effect.=Esta poción tiene un sabor limpio y se usa para preparar más pociones. Beberlo no tiene ningún efecto. +Thick Potion=Poción densa +This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect.=Esta poción tiene un sabor amargo y se usa para preparar más pociones. Beberlo no tiene ningún efecto. +Glistering Melon=Rodaja de sandía reluciente +This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Esta sandía brillante está llena de pequeñas pepitas de oro y sería bueno en un marco de artículo. No es comestible y no es útil para nada más. +Dragon's Breath=Aliento de dragón +Use the “Place” key to drink it.=Use la tecla "Colocar" para beberlo. +Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Use la tecla "Acción" para beber. Coloque este artículo en un caldero para verter el agua en el caldero. +Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Use la tecla "Acción" para beber. Coloque este artículo en un caldero para verter el agua de río en el caldero. diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr new file mode 100644 index 00000000..632c1d96 --- /dev/null +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_potions +Put this item in an item frame for decoration. It's useless otherwise.=Mettez cet élément dans un cadre à élément pour la décoration. C'est inutile sinon. +Fermented Spider Eye=Oeil d'araignée fermenté +Glass Bottle=Bouteille en verre +A glass bottle is used as a container for liquids and can be used to collect water directly.=Une bouteille en verre est utilisée comme récipient pour les liquides et peut être utilisée pour collecter l'eau directement. +To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Pour collecter l'eau, poser la sur un chaudron avec de l'eau (qui enlève un niveau d'eau) ou toute source d'eau (qui n'enlève pas d'eau). +Water Bottle=Bouteille d'eau +Water bottles can be used to fill cauldrons. Drinking water has no effect.=Les bouteilles d'eau peuvent être utilisées pour remplir les chaudrons. L'eau potable n'a aucun effet. +Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron.=Clic droit pour boire. Clic droit sur un chaudron pour verser l'eau dans le chaudron. +River Water Bottle=Bouteille d'eau de rivière +River water bottles can be used to fill cauldrons. Drinking it has no effect.=Les bouteilles d'eau de rivière peuvent être utilisées pour remplir les chaudrons. Le boire n'a aucun effet. +Awkward Potion=Potion maladroite +This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect.=Cette potion a un goût gênant et est utilisée pour préparer plus de potions. Le boire n'a aucun effet. +Mundane Potion=Potion mondaine +This potion has a clean taste and is used for brewing more potions. Drinking it has no effect.=Cette potion a un goût propre et est utilisée pour préparer plus de potions. Le boire n'a aucun effet. +Thick Potion=Potion épaisse +This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect.=Cette potion a un goût amer et est utilisée pour préparer plus de potions. Le boire n'a aucun effet. +Glistering Melon=Melon étincelant +This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Ce melon brillant est plein de minuscules pépites d'or et serait bien dans un cadre d'objet. Il n'est pas comestible et n'est utile à rien d'autre. +Dragon's Breath=Le souffle du dragon +Use the “Place” key to drink it.=Utilisez la touche "Utiliser" pour le boire. +Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Utilisez la touche "Utiliser" pour boire. Placez cet article sur un chaudron pour verser l'eau dans le chaudron. +Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Utilisez la touche "Utiliser" pour boire. Placez cet objet sur un chaudron pour verser l'eau de la rivière dans le chaudron. +Liquid container=Récipient de liquide +No effect=Aucun effet diff --git a/mods/ITEMS/mcl_potions/locale/template.txt b/mods/ITEMS/mcl_potions/locale/template.txt new file mode 100644 index 00000000..3eccfd70 --- /dev/null +++ b/mods/ITEMS/mcl_potions/locale/template.txt @@ -0,0 +1,25 @@ +# textdomain: mcl_potions +Put this item in an item frame for decoration. It's useless otherwise.= +Fermented Spider Eye= +Glass Bottle= +A glass bottle is used as a container for liquids and can be used to collect water directly.= +To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water).= +Water Bottle= +Water bottles can be used to fill cauldrons. Drinking water has no effect.= +Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron.= +River Water Bottle= +River water bottles can be used to fill cauldrons. Drinking it has no effect.= +Awkward Potion= +This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect.= +Mundane Potion= +This potion has a clean taste and is used for brewing more potions. Drinking it has no effect.= +Thick Potion= +This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect.= +Glistering Melon= +This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.= +Dragon's Breath= +Use the “Place” key to drink it.= +Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.= +Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.= +Liquid container= +No effect= diff --git a/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_fill.ogg b/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_fill.ogg index 8de011fe..c78bfee1 100644 Binary files a/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_fill.ogg and b/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_fill.ogg differ diff --git a/mods/ITEMS/mcl_signs/README.txt b/mods/ITEMS/mcl_signs/README.txt index 8950bead..ee161fc9 100644 --- a/mods/ITEMS/mcl_signs/README.txt +++ b/mods/ITEMS/mcl_signs/README.txt @@ -1,9 +1,12 @@ Mod based on reworked signs mod by PilzAdam: https://forum.minetest.net/viewtopic.php?t=3289 -License of code: WTFPL +License of code and font: MIT License -License of textures: See README.me in top directory. +Font source: 04.jp.org, some modifications and additions were made (added support for Latin-1 Supplement) +Original font license text states: “YOU MAY USE THEM AS YOU LIKE” (in about.gif file distributed with the font) + +License of textures: See README.md in top directory of MineClone 2. License of models: GPLv3 (https://www.gnu.org/licenses/gpl-3.0.html) Models author: 22i. diff --git a/mods/ITEMS/mcl_signs/characters b/mods/ITEMS/mcl_signs/characters deleted file mode 100644 index 83d65050..00000000 --- a/mods/ITEMS/mcl_signs/characters +++ /dev/null @@ -1,279 +0,0 @@ -A -_a_ -7 -B -_b_ -5 -C -_c_ -6 -D -_d_ -6 -E -_e_ -5 -F -_f_ -5 -G -_g_ -6 -H -_h_ -6 -I -_i_ -1 -J -_j_ -4 -K -_k_ -5 -L -_l_ -4 -M -_m_ -7 -N -_n_ -6 -O -_o_ -6 -P -_p_ -5 -Q -_q_ -7 -R -_r_ -5 -S -_s_ -5 -T -_t_ -5 -U -_u_ -6 -V -_v_ -7 -W -_w_ -9 -X -_x_ -5 -Y -_y_ -7 -Z -_z_ -5 -a -_a -5 -b -_b -5 -c -_c -4 -d -_d -5 -e -_e -4 -f -_f -4 -g -_g -5 -h -_h -5 -i -_i -1 -j -_j -1 -k -_k -4 -l -_l -1 -m -_m -7 -n -_n -5 -o -_o -5 -p -_p -5 -q -_q -5 -r -_r -3 -s -_s -4 -t -_t -3 -u -_u -4 -v -_v -5 -w -_w -7 -x -_x -5 -y -_y -4 -z -_z -4 - -_sp -2 -0 -_0 -4 -1 -_1 -2 -2 -_2 -4 -3 -_3 -4 -4 -_4 -4 -5 -_5 -4 -6 -_6 -4 -7 -_7 -4 -8 -_8 -4 -9 -_9 -4 -( -_bl -2 -) -_br -2 -{ -_cl -3 -} -_cr -3 -[ -_sl -2 -] -_sr -2 -' -_ap -1 -! -_ex -1 -? -_qu -4 -@ -_at -5 -# -_hs -5 -$ -_dl -4 -% -_pr -5 -^ -_ca -3 -& -_am -5 -* -_as -3 -_ -_un -3 -+ -_ps -3 -- -_mn -3 -= -_eq -3 -; -_sm -1 -, -_cm -2 -" -_qo -3 -/ -_dv -5 -~ -_tl -4 -< -_lt -3 -> -_gt -3 -\ -_re -5 -| -_vb -1 -. -_dt -1 diff --git a/mods/ITEMS/mcl_signs/characters.txt b/mods/ITEMS/mcl_signs/characters.txt new file mode 100644 index 00000000..3e30994a --- /dev/null +++ b/mods/ITEMS/mcl_signs/characters.txt @@ -0,0 +1,567 @@ +A +_a_ +7 +B +_b_ +5 +C +_c_ +6 +D +_d_ +6 +E +_e_ +5 +F +_f_ +5 +G +_g_ +6 +H +_h_ +6 +I +_i_ +1 +J +_j_ +4 +K +_k_ +5 +L +_l_ +4 +M +_m_ +7 +N +_n_ +6 +O +_o_ +6 +P +_p_ +5 +Q +_q_ +7 +R +_r_ +5 +S +_s_ +5 +T +_t_ +5 +U +_u_ +6 +V +_v_ +7 +W +_w_ +9 +X +_x_ +5 +Y +_y_ +7 +Z +_z_ +5 +a +_a +5 +b +_b +5 +c +_c +4 +d +_d +5 +e +_e +4 +f +_f +4 +g +_g +5 +h +_h +5 +i +_i +1 +j +_j +1 +k +_k +4 +l +_l +1 +m +_m +7 +n +_n +5 +o +_o +5 +p +_p +5 +q +_q +5 +r +_r +3 +s +_s +4 +t +_t +3 +u +_u +4 +v +_v +5 +w +_w +7 +x +_x +5 +y +_y +4 +z +_z +4 + +_sp +2 +0 +_0 +4 +1 +_1 +2 +2 +_2 +4 +3 +_3 +4 +4 +_4 +4 +5 +_5 +4 +6 +_6 +4 +7 +_7 +4 +8 +_8 +4 +9 +_9 +4 +( +_bl +2 +) +_br +2 +{ +_cl +3 +} +_cr +3 +[ +_sl +2 +] +_sr +2 +' +_ap +1 +! +_ex +1 +? +_qu +4 +@ +_at +5 +# +_hs +5 +$ +_dl +4 +% +_pr +5 +^ +_ca +3 +& +_am +5 +* +_as +3 +_ +_un +3 ++ +_ps +3 +- +_mn +3 += +_eq +3 +; +_sm +1 +, +_cm +2 +" +_qo +3 +/ +_dv +5 +~ +_tl +4 +< +_lt +3 +> +_gt +3 +\ +_re +5 +| +_vb +1 +. +_dt +1 +: +_co +1 +` +_gr +2 +ä +_ae +5 +ë +_ee +5 +ï +_ie +5 +ö +_oe +5 +ü +_ue +5 +Ä +_ae_ +5 +Ë +_ee_ +5 +Ï +_ie_ +5 +Ö +_oe_ +5 +Ü +_ue_ +5 +ß +_sz +5 +× +_times_cross +5 +· +_times_dot +5 +÷ +_div +5 +» +_guill_right +5 +« +_guill_left +5 +¢ +_cent +5 +¿ +_qu_inv +5 +± +_plus_minus +5 +© +_copyright +5 +® +_registered +5 +¨ +_diaresis +5 +§ +_paragraph +5 +¦ +_broken_bar +5 +¥ +_yen +5 +¤ +_currency +5 +£ +_pound +5 +µ +_mu +5 +¡ +_ex_inv +5 +¬ +_not +5 +¯ +_macron +5 +° +_degree +5 +¹ +_1_sup +5 +² +_2_sup +5 +³ +_3_sup +5 +´ +_acute +5 +¶ +_pilcrow +5 +¼ +_1_4 +5 +½ +_1_2 +5 +¾ +_3_4 +5 +À +_a_grave_ +5 +Á +_a_acute_ +5 +Â +_a_circumflex_ +5 +Ã +_a_tilde_ +5 +Å +_a_ring +5 +Æ +_ae_lig_ +5 +ª +_a_sup +5 +º +_o_sup +5 +¸ +_cedille +5 +Ç +_c_cedille_ +5 +ç +_c_cedille +5 +È +_e_grave_ +5 +É +_e_acute_ +5 +Ê +_e_circumflex_ +5 +Ì +_i_grave_ +5 +Í +_i_acute_ +5 +Î +_i_circumflex_ +5 +Ð +_d_dash_ +5 +Ñ +_n_tilde_ +5 +Ò +_o_grave_ +5 +Ó +_o_acute_ +5 +Ô +_o_circumflex_ +5 +Õ +_o_tilde_ +5 +Ø +_o_dash_ +5 +Ù +_u_grave_ +5 +Ú +_u_acute_ +5 +Û +_u_circumflex_ +5 +Ý +_y_acute_ +5 +Þ +_thorn_ +5 +à +_a_grave +5 +á +_a_acute +5 +â +_a_circumflex +5 +ã +_a_tilde +5 +å +_a_ring +5 +æ +_ae_lig +5 +è +_e_grave +5 +é +_e_acute +5 +ê +_e_circumflex +5 +ì +_i_grave +5 +í +_i_acute +5 +î +_i_circumflex +5 +ð +_d_dash +5 +ñ +_n_tilde +5 +ò +_o_grave +5 +ó +_o_acute +5 +ô +_o_circumflex +5 +õ +_o_tilde +5 +ø +_o_dash +5 +ù +_u_grave +5 +ú +_u_acute +5 +û +_u_circumflex +5 +ý +_y_acute +5 +þ +_thorn +5 +ÿ +_y_diaresis +5 diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index c4bcec3e..89d6b78b 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -1,8 +1,20 @@ --- Font: 04.jp.org +local S = minetest.get_translator("mcl_signs") +local F = minetest.formspec_escape --- load characters map -local chars_file = io.open(minetest.get_modpath("mcl_signs").."/characters", "r") --- FIXME: Support more characters (many characters are missing) +-- Load the characters map (characters.txt) +--[[ File format of characters.txt: +It's an UTF-8 encoded text file that contains metadata for all supported characters. It contains a sequence of info blocks, one for each character. Each info block is made out of 3 lines: +Line 1: The literal UTF-8 encoded character +Line 2: Name of the texture file for this character minus the “.png” suffix; found in the “textures/” sub-directory +Line 3: Currently ignored. Previously this was for the character width in pixels + +After line 3, another info block may follow. This repeats until the end of the file. + +All character files must be 5 or 6 pixels wide (5 pixels are preferred) +]] + +local chars_file = io.open(minetest.get_modpath("mcl_signs").."/characters.txt", "r") +-- FIXME: Support more characters (many characters are missing). Currently ASCII and Latin-1 Supplement are supported. local charmap = {} if not chars_file then minetest.log("error", "[mcl_signs] : character map file not found") @@ -53,8 +65,7 @@ local string_to_line_array = function(str) current = current + 1 tab[current] = "" linechar = 1 - -- This check cuts off overlong lines - elseif linechar <= LINE_LENGTH then + else tab[current] = tab[current]..char linechar = linechar + 1 end @@ -81,8 +92,9 @@ local generate_line = function(s, ypos) local width = 0 local chars = 0 local printed_char_width = CHAR_WIDTH + 1 - while chars <= LINE_LENGTH and i <= #s do + while chars < LINE_LENGTH and i <= #s do local file = nil + -- Get and render character if charmap[s:sub(i, i)] ~= nil then file = charmap[s:sub(i, i)] i = i + 1 @@ -90,8 +102,11 @@ local generate_line = function(s, ypos) file = charmap[s:sub(i, i + 1)] i = i + 2 else - minetest.log("warning", "[mcl_signs] Unknown symbol in '"..s.."' at "..i.." (probably "..s:sub(i, i)..")") + -- No character image found. + -- Use replacement character: + file = "_rc" i = i + 1 + minetest.log("verbose", "[mcl_signs] Unknown symbol in '"..s.."' at "..i) end if file ~= nil then width = width + printed_char_width @@ -114,9 +129,9 @@ local generate_texture = function(lines, signnodename) local texture = "[combine:"..SIGN_WIDTH.."x"..SIGN_WIDTH local ypos if signnodename == "mcl_signs:wall_sign" then - ypos = 29 + ypos = 30 else - ypos = -2 + ypos = 0 end for i = 1, #lines do texture = texture..generate_line(lines[i], ypos) @@ -157,18 +172,36 @@ local function get_rotation_level(facedir, nodename) return rl end -local sign_groups = {handy=1,axey=1, flammable=1, deco_block=1, material_wood=1, attached_node=1} +local function get_wall_signtext_info(param2, nodename) + local dir = minetest.wallmounted_to_dir(param2) + if dir.x > 0 then + return 2 + elseif dir.z > 0 then + return 1 + elseif dir.x < 0 then + return 4 + else + return 3 + end +end + +local sign_groups = {handy=1,axey=1, flammable=1, deco_block=1, material_wood=1, attached_node=1, dig_by_piston=1, flammable=-1} local destruct_sign = function(pos) local objects = minetest.get_objects_inside_radius(pos, 0.5) for _, v in ipairs(objects) do - if v:get_entity_name() == "mcl_signs:text" then + local ent = v:get_luaentity() + if ent and ent.name == "mcl_signs:text" then v:remove() end end + local players = minetest.get_connected_players() + for p=1, #players do + minetest.close_formspec(players[p]:get_player_name(), "mcl_signs:set_text_"..pos.x.."_"..pos.y.."_"..pos.z) + end end -local update_sign = function(pos, fields, sender) +local update_sign = function(pos, fields, sender, force_remove) local meta = minetest.get_meta(pos) if not meta then return @@ -181,47 +214,51 @@ local update_sign = function(pos, fields, sender) if text == nil then text = "" end - local objects = minetest.get_objects_inside_radius(pos, 0.5) - for _, v in ipairs(objects) do - if v:get_entity_name() == "mcl_signs:text" then - v:set_properties({textures={generate_texture(create_lines(text), v:get_luaentity()._signnodename)}}) - return - end - end - - -- if there is no entity + local sign_info local n = minetest.get_node(pos) local nn = n.name if nn == "mcl_signs:standing_sign" or nn == "mcl_signs:standing_sign22_5" or nn == "mcl_signs:standing_sign45" or nn == "mcl_signs:standing_sign67_5" then sign_info = signtext_info_standing[get_rotation_level(n.param2, nn) + 1] elseif nn == "mcl_signs:wall_sign" then - sign_info = signtext_info_wall[n.param2 + 1] + sign_info = signtext_info_wall[get_wall_signtext_info(n.param2)] end if sign_info == nil then + minetest.log("error", "[mcl_signs] Missing sign_info!") return end - local text_entity = minetest.add_entity({ + + local objects = minetest.get_objects_inside_radius(pos, 0.5) + local text_entity + for _, v in ipairs(objects) do + local ent = v:get_luaentity() + if ent and ent.name == "mcl_signs:text" then + if force_remove then + v:remove() + else + text_entity = v + break + end + end + end + + if not text_entity then + text_entity = minetest.add_entity({ x = pos.x + sign_info.delta.x, y = pos.y + sign_info.delta.y, z = pos.z + sign_info.delta.z}, "mcl_signs:text") - if nn == "mcl_signs:standing_sign22_5" then - sign_info.yaw = sign_info.yaw + math.pi / 8 - elseif nn == "mcl_signs:standing_sign45" then - sign_info.yaw = sign_info.yaw + 2 * (math.pi / 8) - elseif nn == "mcl_signs:standing_sign67_5" then - sign_info.yaw = sign_info.yaw + 3 * (math.pi / 8) end text_entity:get_luaentity()._signnodename = nn + text_entity:set_properties({textures={generate_texture(create_lines(text), nn)}}) - text_entity:setyaw(sign_info.yaw) + text_entity:set_yaw(sign_info.yaw) end local show_formspec = function(player, pos) minetest.show_formspec( player:get_player_name(), "mcl_signs:set_text_"..pos.x.."_"..pos.y.."_"..pos.z, - "size[6,3]textarea[0.25,0.25;6,1.5;text;Edit sign text:;]label[0,1.5;Maximum line length: 15\nMaximum lines: 4]button_exit[0,2.5;6,1;submit;Done]" + "size[6,3]textarea[0.25,0.25;6,1.5;text;"..F(S("Enter sign text:"))..";]label[0,1.5;"..F(S("Maximum line length: 15")).."\n"..F(S("Maximum lines: 4")).."]button_exit[0,2.5;6,1;submit;"..F(S("Done")).."]" ) end @@ -240,9 +277,10 @@ if minetest.get_modpath("mcl_sounds") then end minetest.register_node("mcl_signs:wall_sign", { - description = "Sign", - _doc_items_longdesc = "Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.", - _doc_items_usagehelp = "Place the sign at the side to build a wall sign, place it on top of another block to build a sign with a sign post.\nAfter placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. The text can not be changed once it has been written; you have to break and place the sign again.", + description = S("Sign"), + _tt_help = S("Can be written"), + _doc_items_longdesc = S("Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them."), + _doc_items_usagehelp = S("After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again."), inventory_image = "default_sign.png", walkable = false, is_ground_content = false, @@ -281,7 +319,7 @@ minetest.register_node("mcl_signs:wall_sign", { local wdir = minetest.dir_to_wallmounted(dir) - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() local fdir = minetest.dir_to_facedir(dir) @@ -324,6 +362,9 @@ minetest.register_node("mcl_signs:wall_sign", { if not success then return itemstack end + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end sign_info = signtext_info_standing[rotation_level + 1] -- Side else @@ -347,29 +388,33 @@ minetest.register_node("mcl_signs:wall_sign", { x = place_pos.x + sign_info.delta.x, y = place_pos.y + sign_info.delta.y, z = place_pos.z + sign_info.delta.z}, "mcl_signs:text") - text_entity:setyaw(sign_info.yaw) + text_entity:set_yaw(sign_info.yaw) text_entity:get_luaentity()._signnodename = nodeitem:get_name() - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end - minetest.sound_play({name="default_place_node_hard", gain=1.0}, {pos = place_pos}) + minetest.sound_play({name="default_place_node_hard", gain=1.0}, {pos = place_pos}, true) show_formspec(placer, place_pos) return itemstack end, on_destruct = destruct_sign, - on_receive_fields = function(pos, formname, fields, sender) - update_sign(pos, fields, sender) - end, on_punch = function(pos, node, puncher) update_sign(pos) end, + on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_FACE then + local r = screwdriver.rotate.wallmounted(pos, node, mode) + node.param2 = r + minetest.swap_node(pos, node) + update_sign(pos, nil, nil, true) + return true + else + return false + end + end, _mcl_hardness = 1, - _mcl_blast_resistance = 5, + _mcl_blast_resistance = 1, }) - -- Standing sign nodes. -- 4 rotations at 0°, 22.5°, 45° and 67.5°. -- These are 4 out of 16 possible rotations. @@ -392,35 +437,75 @@ local ssign = { sounds = node_sounds, on_destruct = destruct_sign, - on_receive_fields = function(pos, formname, fields, sender) - update_sign(pos, fields, sender) - end, on_punch = function(pos, node, puncher) update_sign(pos) end, + on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_FACE then + node.name = "mcl_signs:standing_sign22_5" + minetest.swap_node(pos, node) + elseif mode == screwdriver.ROTATE_AXIS then + return false + end + update_sign(pos, nil, nil, true) + return true + end, + _mcl_hardness = 1, - _mcl_blast_resistance = 5, + _mcl_blast_resistance = 1, } --- 22.5° minetest.register_node("mcl_signs:standing_sign", ssign) + +-- 22.5° local ssign22_5 = table.copy(ssign) ssign22_5.mesh = "mcl_signs_sign22.5.obj" +ssign22_5.on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_FACE then + node.name = "mcl_signs:standing_sign45" + minetest.swap_node(pos, node) + elseif mode == screwdriver.ROTATE_AXIS then + return false + end + update_sign(pos, nil, nil, true) + return true +end +minetest.register_node("mcl_signs:standing_sign22_5", ssign22_5) -- 45° -minetest.register_node("mcl_signs:standing_sign22_5", ssign22_5) local ssign45 = table.copy(ssign) ssign45.mesh = "mcl_signs_sign45.obj" +ssign45.on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_FACE then + node.name = "mcl_signs:standing_sign67_5" + minetest.swap_node(pos, node) + elseif mode == screwdriver.ROTATE_AXIS then + return false + end + update_sign(pos, nil, nil, true) + return true +end minetest.register_node("mcl_signs:standing_sign45", ssign45) -- 67.5° -local ssign67 = table.copy(ssign) -ssign67.mesh = "mcl_signs_sign67.5.obj" -minetest.register_node("mcl_signs:standing_sign67_5", ssign67) - +local ssign67_5 = table.copy(ssign) +ssign67_5.mesh = "mcl_signs_sign67.5.obj" +ssign67_5.on_rotate = function(pos, node, user, mode) + if mode == screwdriver.ROTATE_FACE then + node.name = "mcl_signs:standing_sign" + node.param2 = (node.param2 + 1) % 4 + minetest.swap_node(pos, node) + elseif mode == screwdriver.ROTATE_AXIS then + return false + end + update_sign(pos, nil, nil, true) + return true +end +minetest.register_node("mcl_signs:standing_sign67_5", ssign67_5) +-- FIXME: Prevent entity destruction by /clearobjects minetest.register_entity("mcl_signs:text", { - collisionbox = { 0, 0, 0, 0, 0, 0 }, + pointable = false, visual = "upright_sprite", textures = {}, physical = false, @@ -435,7 +520,7 @@ minetest.register_entity("mcl_signs:text", { self._signnodename = des._signnodename end end - local meta = minetest.get_meta(self.object:getpos()) + local meta = minetest.get_meta(self.object:get_pos()) local text = meta:get_string("text") self.object:set_properties({ textures={generate_texture(create_lines(text), self._signnodename)}, @@ -475,7 +560,12 @@ end minetest.register_alias("signs:sign_wall", "mcl_signs:wall_sign") minetest.register_alias("signs:sign_yard", "mcl_signs:standing_sign") - -if minetest.settings:get_bool("log_mods") then - minetest.log("action", "[mcl_signs] loaded") -end +minetest.register_lbm({ + name = "mcl_signs:respawn_entities", + label = "Respawn sign text entities", + run_at_every_load = true, + nodenames = { "mcl_signs:wall_sign", "mcl_signs:standing_sign", "mcl_signs:standing_sign22_5", "mcl_signs:standing_sign45", "mcl_signs:standing_sign67_5" }, + action = function(pos, node) + update_sign(pos) + end, +}) diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr new file mode 100644 index 00000000..a7513659 --- /dev/null +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_signs +Sign=Schild +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=Schilder können beschrieben werden und kommen in zwei Varianten: Wandschild und stehendes Schild. Sie können auf und an den Seiten von anderen Blöclen platziert werden, aber nicht unter ihnen. +After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again.=Nachdem das Schild platziert wurde, kann man etwas darauf schreiben. 4 Zeilen mit je 15 Zeichen pro Zeile sind verfügbar, alles darüber geht verloren. Es werden nicht alle Zeichen unterstützt. Der Text kann nicht geändert werden, sobald er geschrieben wurde; man muss das Schild erneut platzieren. +Enter sign text:=Schildtext eingeben: +Maximum line length: 15=Maximale Zeilenlänge: 15 +Maximum lines: 4=Maximale Zeilen: 4 +Done=Fertig +Can be written=Kann beschriftet werden diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.es.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.es.tr new file mode 100644 index 00000000..d67e2da0 --- /dev/null +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.es.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_signs +Sign=Firmar +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=Los letreros se pueden escribir y vienen en dos variantes: letrero de muro y letrero en un poste de letrero. Los letreros se pueden colocar en la parte superior y en los costados de otros bloques, pero no debajo de ellos. +After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again.=Después de colocar el letrero, puede escribir algo en él. Tiene 4 líneas de texto con hasta 15 caracteres para cada línea; todo lo que esté más allá de estos límites se pierde. No todos los personajes son compatibles. El texto no se puede cambiar una vez que se ha escrito; tienes que romper y colocar el letrero nuevamente. +Enter sign text:=Inserte el texto del letrero: +Maximum line length: 15=Longitud máxima de línea: 15 +Maximum lines: 4=Líneas máximas: 4 +Done=Escribir cartel diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr new file mode 100644 index 00000000..158640da --- /dev/null +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_signs +Sign=Panneau +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=Les panneaux peuvent être écrits et se déclinent en deux variantes: panneau mural et panneau sur poteau. Des panneaux peuvent être placés en haut et sur les côtés des autres blocs, mais pas en dessous. +After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again.=Après avoir placé le panneau, vous pouvez écrire quelque chose dessus. Vous avez 4 lignes de texte avec jusqu'à 15 caractères pour chaque ligne; tout ce qui dépasse ces limites est perdu. Tous les caractères ne sont pas pris en charge. Le texte ne peut pas être modifié une fois qu'il a été écrit; vous devez casser et placer à nouveau le panneau. +Enter sign text:=Saisir le texte du panneau: +Maximum line length: 15=Longueur maximum des lignes: 15 +Maximum lines: 4=Nombre maximum de lignes: 4 +Done=Terminé +Can be written=Peut être écrit diff --git a/mods/ITEMS/mcl_signs/locale/template.txt b/mods/ITEMS/mcl_signs/locale/template.txt new file mode 100644 index 00000000..6635e989 --- /dev/null +++ b/mods/ITEMS/mcl_signs/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: mcl_signs +Sign= +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.= +After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again.= +Enter sign text:= +Maximum line length: 15= +Maximum lines: 4= +Done= +Can be written= diff --git a/mods/ITEMS/mcl_signs/textures/_0.png b/mods/ITEMS/mcl_signs/textures/_0.png index 93070cc7..e764f3d6 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_0.png and b/mods/ITEMS/mcl_signs/textures/_0.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_1.png b/mods/ITEMS/mcl_signs/textures/_1.png index fc4da531..7fae5fa4 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_1.png and b/mods/ITEMS/mcl_signs/textures/_1.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_1_2.png b/mods/ITEMS/mcl_signs/textures/_1_2.png new file mode 100644 index 00000000..52d025e8 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_1_2.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_1_4.png b/mods/ITEMS/mcl_signs/textures/_1_4.png new file mode 100644 index 00000000..220e65ef Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_1_4.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_1_sup.png b/mods/ITEMS/mcl_signs/textures/_1_sup.png new file mode 100644 index 00000000..6be5fdcb Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_1_sup.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_2.png b/mods/ITEMS/mcl_signs/textures/_2.png index e482082b..e32866d0 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_2.png and b/mods/ITEMS/mcl_signs/textures/_2.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_2_sup.png b/mods/ITEMS/mcl_signs/textures/_2_sup.png new file mode 100644 index 00000000..3db95217 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_2_sup.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_3.png b/mods/ITEMS/mcl_signs/textures/_3.png index c4031324..4e7da566 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_3.png and b/mods/ITEMS/mcl_signs/textures/_3.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_3_4.png b/mods/ITEMS/mcl_signs/textures/_3_4.png new file mode 100644 index 00000000..46e17104 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_3_4.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_3_sup.png b/mods/ITEMS/mcl_signs/textures/_3_sup.png new file mode 100644 index 00000000..add33732 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_3_sup.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_5.png b/mods/ITEMS/mcl_signs/textures/_5.png index 684fc45e..baf23b27 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_5.png and b/mods/ITEMS/mcl_signs/textures/_5.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_6.png b/mods/ITEMS/mcl_signs/textures/_6.png index 6b91013d..31fcd7d7 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_6.png and b/mods/ITEMS/mcl_signs/textures/_6.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_7.png b/mods/ITEMS/mcl_signs/textures/_7.png index d13f3973..7594eb9d 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_7.png and b/mods/ITEMS/mcl_signs/textures/_7.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_8.png b/mods/ITEMS/mcl_signs/textures/_8.png index af994c2a..b61f4e29 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_8.png and b/mods/ITEMS/mcl_signs/textures/_8.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_9.png b/mods/ITEMS/mcl_signs/textures/_9.png index 5054efc9..5ed82070 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_9.png and b/mods/ITEMS/mcl_signs/textures/_9.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_acute.png b/mods/ITEMS/mcl_signs/textures/_a_acute.png new file mode 100644 index 00000000..b72b4853 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_acute.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_acute_.png b/mods/ITEMS/mcl_signs/textures/_a_acute_.png new file mode 100644 index 00000000..d038b45c Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_acute_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_circumflex.png b/mods/ITEMS/mcl_signs/textures/_a_circumflex.png new file mode 100644 index 00000000..f9b80df6 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_circumflex.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_circumflex_.png b/mods/ITEMS/mcl_signs/textures/_a_circumflex_.png new file mode 100644 index 00000000..8b35bdf7 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_circumflex_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_grave.png b/mods/ITEMS/mcl_signs/textures/_a_grave.png new file mode 100644 index 00000000..3f0de45a Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_grave.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_grave_.png b/mods/ITEMS/mcl_signs/textures/_a_grave_.png new file mode 100644 index 00000000..8176f51c Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_grave_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_ring.png b/mods/ITEMS/mcl_signs/textures/_a_ring.png new file mode 100644 index 00000000..d3c06ae6 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_ring.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_ring_.png b/mods/ITEMS/mcl_signs/textures/_a_ring_.png new file mode 100644 index 00000000..d3e9b7e9 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_ring_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_sup.png b/mods/ITEMS/mcl_signs/textures/_a_sup.png new file mode 100644 index 00000000..4f4f9801 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_sup.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_tilde.png b/mods/ITEMS/mcl_signs/textures/_a_tilde.png new file mode 100644 index 00000000..567632c3 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_tilde.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_a_tilde_.png b/mods/ITEMS/mcl_signs/textures/_a_tilde_.png new file mode 100644 index 00000000..fd3d9778 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_a_tilde_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_acute.png b/mods/ITEMS/mcl_signs/textures/_acute.png new file mode 100644 index 00000000..0655de2d Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_acute.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ae.png b/mods/ITEMS/mcl_signs/textures/_ae.png new file mode 100644 index 00000000..7f199e47 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_ae.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ae_.png b/mods/ITEMS/mcl_signs/textures/_ae_.png new file mode 100644 index 00000000..e19fdf1c Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_ae_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ae_lig.png b/mods/ITEMS/mcl_signs/textures/_ae_lig.png new file mode 100644 index 00000000..a02bd30c Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_ae_lig.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ae_lig_.png b/mods/ITEMS/mcl_signs/textures/_ae_lig_.png new file mode 100644 index 00000000..0eb5d2f5 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_ae_lig_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_am.png b/mods/ITEMS/mcl_signs/textures/_am.png index 8e762a1d..76a88675 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_am.png and b/mods/ITEMS/mcl_signs/textures/_am.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ap.png b/mods/ITEMS/mcl_signs/textures/_ap.png index 0575401f..bced380a 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_ap.png and b/mods/ITEMS/mcl_signs/textures/_ap.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_bl.png b/mods/ITEMS/mcl_signs/textures/_bl.png index 04604211..422fcc58 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_bl.png and b/mods/ITEMS/mcl_signs/textures/_bl.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_br.png b/mods/ITEMS/mcl_signs/textures/_br.png index c8cd9c8d..88b1ba4a 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_br.png and b/mods/ITEMS/mcl_signs/textures/_br.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_broken_bar.png b/mods/ITEMS/mcl_signs/textures/_broken_bar.png new file mode 100644 index 00000000..c733fd86 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_broken_bar.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_c.png b/mods/ITEMS/mcl_signs/textures/_c.png index e36136fa..0ae311f3 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_c.png and b/mods/ITEMS/mcl_signs/textures/_c.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_c_.png b/mods/ITEMS/mcl_signs/textures/_c_.png index 7917a84e..13526091 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_c_.png and b/mods/ITEMS/mcl_signs/textures/_c_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_c_cedille.png b/mods/ITEMS/mcl_signs/textures/_c_cedille.png new file mode 100644 index 00000000..9d5a4b56 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_c_cedille.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_c_cedille_.png b/mods/ITEMS/mcl_signs/textures/_c_cedille_.png new file mode 100644 index 00000000..7eb654bc Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_c_cedille_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_cedille.png b/mods/ITEMS/mcl_signs/textures/_cedille.png new file mode 100644 index 00000000..0de32ed0 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_cedille.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_cent.png b/mods/ITEMS/mcl_signs/textures/_cent.png new file mode 100644 index 00000000..ecdb1f1d Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_cent.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_cl.png b/mods/ITEMS/mcl_signs/textures/_cl.png index 106b3937..38cad796 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_cl.png and b/mods/ITEMS/mcl_signs/textures/_cl.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_cm.png b/mods/ITEMS/mcl_signs/textures/_cm.png index 716939ad..6b2b10a1 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_cm.png and b/mods/ITEMS/mcl_signs/textures/_cm.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_co.png b/mods/ITEMS/mcl_signs/textures/_co.png new file mode 100644 index 00000000..6775d5ea Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_co.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_copyright.png b/mods/ITEMS/mcl_signs/textures/_copyright.png new file mode 100644 index 00000000..7cfdf217 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_copyright.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_cr.png b/mods/ITEMS/mcl_signs/textures/_cr.png index fc3506b9..cd6d6dac 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_cr.png and b/mods/ITEMS/mcl_signs/textures/_cr.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_currency.png b/mods/ITEMS/mcl_signs/textures/_currency.png new file mode 100644 index 00000000..1264c894 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_currency.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_d_dash.png b/mods/ITEMS/mcl_signs/textures/_d_dash.png new file mode 100644 index 00000000..73f5a124 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_d_dash.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_d_dash_.png b/mods/ITEMS/mcl_signs/textures/_d_dash_.png new file mode 100644 index 00000000..e9c9e69c Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_d_dash_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_degree.png b/mods/ITEMS/mcl_signs/textures/_degree.png new file mode 100644 index 00000000..64a7ee2b Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_degree.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_diaresis.png b/mods/ITEMS/mcl_signs/textures/_diaresis.png new file mode 100644 index 00000000..f8b75d38 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_diaresis.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_div.png b/mods/ITEMS/mcl_signs/textures/_div.png new file mode 100644 index 00000000..80834375 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_div.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_dl.png b/mods/ITEMS/mcl_signs/textures/_dl.png index f02d723b..044e4f00 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_dl.png and b/mods/ITEMS/mcl_signs/textures/_dl.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_dt.png b/mods/ITEMS/mcl_signs/textures/_dt.png index 92cc4a9f..5dfa7534 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_dt.png and b/mods/ITEMS/mcl_signs/textures/_dt.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_dv.png b/mods/ITEMS/mcl_signs/textures/_dv.png index 37dc9536..2989d93d 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_dv.png and b/mods/ITEMS/mcl_signs/textures/_dv.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_e.png b/mods/ITEMS/mcl_signs/textures/_e.png index 9cca45b5..316e966a 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_e.png and b/mods/ITEMS/mcl_signs/textures/_e.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_e_acute.png b/mods/ITEMS/mcl_signs/textures/_e_acute.png new file mode 100644 index 00000000..911207f8 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_e_acute.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_e_acute_.png b/mods/ITEMS/mcl_signs/textures/_e_acute_.png new file mode 100644 index 00000000..b6019374 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_e_acute_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_e_circumflex.png b/mods/ITEMS/mcl_signs/textures/_e_circumflex.png new file mode 100644 index 00000000..2b5ace3c Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_e_circumflex.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_e_circumflex_.png b/mods/ITEMS/mcl_signs/textures/_e_circumflex_.png new file mode 100644 index 00000000..c17d9dc2 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_e_circumflex_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_e_grave.png b/mods/ITEMS/mcl_signs/textures/_e_grave.png new file mode 100644 index 00000000..c24ab463 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_e_grave.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_e_grave_.png b/mods/ITEMS/mcl_signs/textures/_e_grave_.png new file mode 100644 index 00000000..c71bb2ef Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_e_grave_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ee.png b/mods/ITEMS/mcl_signs/textures/_ee.png new file mode 100644 index 00000000..646c19e1 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_ee.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ee_.png b/mods/ITEMS/mcl_signs/textures/_ee_.png new file mode 100644 index 00000000..5db7bc66 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_ee_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_eq.png b/mods/ITEMS/mcl_signs/textures/_eq.png index fc5e8310..166f7a30 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_eq.png and b/mods/ITEMS/mcl_signs/textures/_eq.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ex.png b/mods/ITEMS/mcl_signs/textures/_ex.png index 83500a41..65a76aad 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_ex.png and b/mods/ITEMS/mcl_signs/textures/_ex.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ex_inv.png b/mods/ITEMS/mcl_signs/textures/_ex_inv.png new file mode 100644 index 00000000..1e7bbfe8 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_ex_inv.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_f.png b/mods/ITEMS/mcl_signs/textures/_f.png index 1ac67a01..1e431df1 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_f.png and b/mods/ITEMS/mcl_signs/textures/_f.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_g_.png b/mods/ITEMS/mcl_signs/textures/_g_.png index 3408aa0e..bfe05463 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_g_.png and b/mods/ITEMS/mcl_signs/textures/_g_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_gr.png b/mods/ITEMS/mcl_signs/textures/_gr.png new file mode 100644 index 00000000..3f806499 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_gr.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_gt.png b/mods/ITEMS/mcl_signs/textures/_gt.png index efe2c94a..0449b44d 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_gt.png and b/mods/ITEMS/mcl_signs/textures/_gt.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_guill_left.png b/mods/ITEMS/mcl_signs/textures/_guill_left.png new file mode 100644 index 00000000..32b90c3e Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_guill_left.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_guill_right.png b/mods/ITEMS/mcl_signs/textures/_guill_right.png new file mode 100644 index 00000000..d372e6a8 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_guill_right.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_h.png b/mods/ITEMS/mcl_signs/textures/_h.png index cca4751a..bd6f1891 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_h.png and b/mods/ITEMS/mcl_signs/textures/_h.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_hs.png b/mods/ITEMS/mcl_signs/textures/_hs.png index 46f83c43..682a92a2 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_hs.png and b/mods/ITEMS/mcl_signs/textures/_hs.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_i_acute.png b/mods/ITEMS/mcl_signs/textures/_i_acute.png new file mode 100644 index 00000000..20bdafb6 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_i_acute.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_i_acute_.png b/mods/ITEMS/mcl_signs/textures/_i_acute_.png new file mode 100644 index 00000000..4cdc943d Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_i_acute_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_i_circumflex.png b/mods/ITEMS/mcl_signs/textures/_i_circumflex.png new file mode 100644 index 00000000..f0e71272 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_i_circumflex.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_i_circumflex_.png b/mods/ITEMS/mcl_signs/textures/_i_circumflex_.png new file mode 100644 index 00000000..dc46f3ff Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_i_circumflex_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_i_grave.png b/mods/ITEMS/mcl_signs/textures/_i_grave.png new file mode 100644 index 00000000..7254cd7d Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_i_grave.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_i_grave_.png b/mods/ITEMS/mcl_signs/textures/_i_grave_.png new file mode 100644 index 00000000..1e221267 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_i_grave_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_j.png b/mods/ITEMS/mcl_signs/textures/_j.png index 9b375448..7fec5021 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_j.png and b/mods/ITEMS/mcl_signs/textures/_j.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_k_.png b/mods/ITEMS/mcl_signs/textures/_k_.png index 4444abdd..5e0a6b99 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_k_.png and b/mods/ITEMS/mcl_signs/textures/_k_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_lt.png b/mods/ITEMS/mcl_signs/textures/_lt.png index 3a183ebd..54295121 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_lt.png and b/mods/ITEMS/mcl_signs/textures/_lt.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_macron.png b/mods/ITEMS/mcl_signs/textures/_macron.png new file mode 100644 index 00000000..ffb9dfd7 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_macron.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_mn.png b/mods/ITEMS/mcl_signs/textures/_mn.png index 7d04cac6..2230e106 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_mn.png and b/mods/ITEMS/mcl_signs/textures/_mn.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_mu.png b/mods/ITEMS/mcl_signs/textures/_mu.png new file mode 100644 index 00000000..3d8c1b89 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_mu.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_n_tilde.png b/mods/ITEMS/mcl_signs/textures/_n_tilde.png new file mode 100644 index 00000000..47166911 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_n_tilde.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_n_tilde_.png b/mods/ITEMS/mcl_signs/textures/_n_tilde_.png new file mode 100644 index 00000000..0dba0d47 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_n_tilde_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_not.png b/mods/ITEMS/mcl_signs/textures/_not.png new file mode 100644 index 00000000..a98f885e Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_not.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o.png b/mods/ITEMS/mcl_signs/textures/_o.png index f644e1e7..2a579385 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_o.png and b/mods/ITEMS/mcl_signs/textures/_o.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_.png b/mods/ITEMS/mcl_signs/textures/_o_.png index d5984b00..44ac3cbc 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_o_.png and b/mods/ITEMS/mcl_signs/textures/_o_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_acute.png b/mods/ITEMS/mcl_signs/textures/_o_acute.png new file mode 100644 index 00000000..cda99b3a Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_acute.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_acute_.png b/mods/ITEMS/mcl_signs/textures/_o_acute_.png new file mode 100644 index 00000000..e25a3a7f Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_acute_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_circumflex.png b/mods/ITEMS/mcl_signs/textures/_o_circumflex.png new file mode 100644 index 00000000..2f7a188d Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_circumflex.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_circumflex_.png b/mods/ITEMS/mcl_signs/textures/_o_circumflex_.png new file mode 100644 index 00000000..5e4c6be6 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_circumflex_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_dash.png b/mods/ITEMS/mcl_signs/textures/_o_dash.png new file mode 100644 index 00000000..9e5de53d Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_dash.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_dash_.png b/mods/ITEMS/mcl_signs/textures/_o_dash_.png new file mode 100644 index 00000000..badbe9b8 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_dash_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_grave.png b/mods/ITEMS/mcl_signs/textures/_o_grave.png new file mode 100644 index 00000000..b6b31a9a Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_grave.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_grave_.png b/mods/ITEMS/mcl_signs/textures/_o_grave_.png new file mode 100644 index 00000000..d34e9d71 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_grave_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_sup.png b/mods/ITEMS/mcl_signs/textures/_o_sup.png new file mode 100644 index 00000000..eeff0a29 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_sup.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_tilde.png b/mods/ITEMS/mcl_signs/textures/_o_tilde.png new file mode 100644 index 00000000..6cbd7cec Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_tilde.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_o_tilde_.png b/mods/ITEMS/mcl_signs/textures/_o_tilde_.png new file mode 100644 index 00000000..bb061691 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_o_tilde_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_oe.png b/mods/ITEMS/mcl_signs/textures/_oe.png new file mode 100644 index 00000000..9b689215 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_oe.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_oe_.png b/mods/ITEMS/mcl_signs/textures/_oe_.png new file mode 100644 index 00000000..73b4da80 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_oe_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_paragraph.png b/mods/ITEMS/mcl_signs/textures/_paragraph.png new file mode 100644 index 00000000..52c16212 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_paragraph.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_pilcrow.png b/mods/ITEMS/mcl_signs/textures/_pilcrow.png new file mode 100644 index 00000000..9764ff8b Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_pilcrow.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_plus_minus.png b/mods/ITEMS/mcl_signs/textures/_plus_minus.png new file mode 100644 index 00000000..e7c3f120 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_plus_minus.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_pound.png b/mods/ITEMS/mcl_signs/textures/_pound.png new file mode 100644 index 00000000..31d38d39 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_pound.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_pr.png b/mods/ITEMS/mcl_signs/textures/_pr.png index 5c231c9a..c8783948 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_pr.png and b/mods/ITEMS/mcl_signs/textures/_pr.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_q_.png b/mods/ITEMS/mcl_signs/textures/_q_.png index 8ad18512..67479941 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_q_.png and b/mods/ITEMS/mcl_signs/textures/_q_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_qo.png b/mods/ITEMS/mcl_signs/textures/_qo.png index 27cae96a..c7b87be6 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_qo.png and b/mods/ITEMS/mcl_signs/textures/_qo.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_qu.png b/mods/ITEMS/mcl_signs/textures/_qu.png index 26cf5b45..1458c7e1 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_qu.png and b/mods/ITEMS/mcl_signs/textures/_qu.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_qu_inv.png b/mods/ITEMS/mcl_signs/textures/_qu_inv.png new file mode 100644 index 00000000..757bd06d Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_qu_inv.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_r_.png b/mods/ITEMS/mcl_signs/textures/_r_.png index 5acd9637..f8b47275 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_r_.png and b/mods/ITEMS/mcl_signs/textures/_r_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_rc.png b/mods/ITEMS/mcl_signs/textures/_rc.png new file mode 100644 index 00000000..8b66915e Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_rc.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_registered.png b/mods/ITEMS/mcl_signs/textures/_registered.png new file mode 100644 index 00000000..9a78dda3 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_registered.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_s.png b/mods/ITEMS/mcl_signs/textures/_s.png index 4e2538f4..4c47aee0 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_s.png and b/mods/ITEMS/mcl_signs/textures/_s.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_s_.png b/mods/ITEMS/mcl_signs/textures/_s_.png index d5281d78..08cf6ff6 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_s_.png and b/mods/ITEMS/mcl_signs/textures/_s_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_sl.png b/mods/ITEMS/mcl_signs/textures/_sl.png index d825f1aa..413aa577 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_sl.png and b/mods/ITEMS/mcl_signs/textures/_sl.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_sm.png b/mods/ITEMS/mcl_signs/textures/_sm.png index dc3c258d..460c5d6d 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_sm.png and b/mods/ITEMS/mcl_signs/textures/_sm.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_sp.png b/mods/ITEMS/mcl_signs/textures/_sp.png index 59bbc581..4aae0ea8 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_sp.png and b/mods/ITEMS/mcl_signs/textures/_sp.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_sr.png b/mods/ITEMS/mcl_signs/textures/_sr.png index dd192f54..afefa91b 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_sr.png and b/mods/ITEMS/mcl_signs/textures/_sr.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_sz.png b/mods/ITEMS/mcl_signs/textures/_sz.png new file mode 100644 index 00000000..56d2847a Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_sz.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_thorn.png b/mods/ITEMS/mcl_signs/textures/_thorn.png new file mode 100644 index 00000000..e44f23d8 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_thorn.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_thorn_.png b/mods/ITEMS/mcl_signs/textures/_thorn_.png new file mode 100644 index 00000000..1b6d2558 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_thorn_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_times_cross.png b/mods/ITEMS/mcl_signs/textures/_times_cross.png new file mode 100644 index 00000000..25af91b6 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_times_cross.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_times_dot.png b/mods/ITEMS/mcl_signs/textures/_times_dot.png new file mode 100644 index 00000000..42dac52b Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_times_dot.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_tl.png b/mods/ITEMS/mcl_signs/textures/_tl.png index a8bf1764..5f1b4fb4 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_tl.png and b/mods/ITEMS/mcl_signs/textures/_tl.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_u_acute.png b/mods/ITEMS/mcl_signs/textures/_u_acute.png new file mode 100644 index 00000000..580f6104 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_u_acute.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_u_acute_.png b/mods/ITEMS/mcl_signs/textures/_u_acute_.png new file mode 100644 index 00000000..9237d3ca Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_u_acute_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_u_circumflex.png b/mods/ITEMS/mcl_signs/textures/_u_circumflex.png new file mode 100644 index 00000000..2b238be1 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_u_circumflex.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_u_circumflex_.png b/mods/ITEMS/mcl_signs/textures/_u_circumflex_.png new file mode 100644 index 00000000..1608ecf1 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_u_circumflex_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_u_grave.png b/mods/ITEMS/mcl_signs/textures/_u_grave.png new file mode 100644 index 00000000..05128042 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_u_grave.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_u_grave_.png b/mods/ITEMS/mcl_signs/textures/_u_grave_.png new file mode 100644 index 00000000..66868579 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_u_grave_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ue.png b/mods/ITEMS/mcl_signs/textures/_ue.png new file mode 100644 index 00000000..6249aaeb Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_ue.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_ue_.png b/mods/ITEMS/mcl_signs/textures/_ue_.png new file mode 100644 index 00000000..3193a941 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_ue_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_vb.png b/mods/ITEMS/mcl_signs/textures/_vb.png index b40ff989..ca2e5667 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_vb.png and b/mods/ITEMS/mcl_signs/textures/_vb.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_w.png b/mods/ITEMS/mcl_signs/textures/_w.png index daa59763..6c2eea3e 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_w.png and b/mods/ITEMS/mcl_signs/textures/_w.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_w_.png b/mods/ITEMS/mcl_signs/textures/_w_.png index 8848484d..f1e26c10 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_w_.png and b/mods/ITEMS/mcl_signs/textures/_w_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_y_acute.png b/mods/ITEMS/mcl_signs/textures/_y_acute.png new file mode 100644 index 00000000..37cb54b3 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_y_acute.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_y_acute_.png b/mods/ITEMS/mcl_signs/textures/_y_acute_.png new file mode 100644 index 00000000..bcc15c41 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_y_acute_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_y_diaresis.png b/mods/ITEMS/mcl_signs/textures/_y_diaresis.png new file mode 100644 index 00000000..135a8ce2 Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_y_diaresis.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_yen.png b/mods/ITEMS/mcl_signs/textures/_yen.png new file mode 100644 index 00000000..ec4ad65e Binary files /dev/null and b/mods/ITEMS/mcl_signs/textures/_yen.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_z.png b/mods/ITEMS/mcl_signs/textures/_z.png index 86eb502c..8a710780 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_z.png and b/mods/ITEMS/mcl_signs/textures/_z.png differ diff --git a/mods/ITEMS/mcl_signs/textures/_z_.png b/mods/ITEMS/mcl_signs/textures/_z_.png index 9bff4002..6192800b 100644 Binary files a/mods/ITEMS/mcl_signs/textures/_z_.png and b/mods/ITEMS/mcl_signs/textures/_z_.png differ diff --git a/mods/ITEMS/mcl_signs/textures/default_sign.png b/mods/ITEMS/mcl_signs/textures/default_sign.png index 07798311..6adabb51 100644 Binary files a/mods/ITEMS/mcl_signs/textures/default_sign.png and b/mods/ITEMS/mcl_signs/textures/default_sign.png differ diff --git a/mods/ITEMS/mcl_sponges/depends.txt b/mods/ITEMS/mcl_sponges/depends.txt index 3d96266d..10e9d290 100644 --- a/mods/ITEMS/mcl_sponges/depends.txt +++ b/mods/ITEMS/mcl_sponges/depends.txt @@ -1 +1,3 @@ mcl_sounds +mcl_core? +mclx_core? diff --git a/mods/ITEMS/mcl_sponges/init.lua b/mods/ITEMS/mcl_sponges/init.lua index 841aae6a..db68b281 100644 --- a/mods/ITEMS/mcl_sponges/init.lua +++ b/mods/ITEMS/mcl_sponges/init.lua @@ -1,5 +1,11 @@ +local S = minetest.get_translator("mcl_sponges") + local absorb = function(pos) local change = false + -- Count number of absorbed river water vs other nodes + -- to determine the wet sponge type. + local river_water = 0 + local non_river_water = 0 local p, n for i=-3,3 do for j=-3,3 do @@ -9,16 +15,30 @@ local absorb = function(pos) if minetest.get_item_group(n.name, "water") ~= 0 then minetest.add_node(p, {name="air"}) change = true + if n.name == "mclx_core:river_water_source" or n.name == "mclx_core:river_water_flowing" then + river_water = river_water + 1 + else + non_river_water = non_river_water + 1 + end end end end end - return change + -- The dominant water type wins. In case of a tie, normal water wins. + -- This slight bias is intentional. + local sponge_type + if river_water > non_river_water then + sponge_type = "mcl_sponges:sponge_wet_river_water" + else + sponge_type = "mcl_sponges:sponge_wet" + end + return change, sponge_type end minetest.register_node("mcl_sponges:sponge", { - description = "Sponge", - _doc_items_longdesc = "Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.", + description = S("Sponge"), + _tt_help = S("Removes water on contact"), + _doc_items_longdesc = S("Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge."), drawtype = "normal", is_ground_content = false, tiles = {"mcl_sponges_sponge.png"}, @@ -59,8 +79,9 @@ minetest.register_node("mcl_sponges:sponge", { if on_water then -- Absorb water -- FIXME: pos is not always the right placement position because of pointed_thing - if absorb(pos) then - minetest.item_place_node(ItemStack("mcl_sponges:sponge_wet"), placer, pointed_thing) + local absorbed, wet_sponge = absorb(pos) + if absorbed then + minetest.item_place_node(ItemStack(wet_sponge), placer, pointed_thing) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end @@ -69,13 +90,14 @@ minetest.register_node("mcl_sponges:sponge", { end return minetest.item_place_node(itemstack, placer, pointed_thing) end, - _mcl_blast_resistance = 3, + _mcl_blast_resistance = 0.6, _mcl_hardness = 0.6, }) minetest.register_node("mcl_sponges:sponge_wet", { - description = "Wet Sponge", - _doc_items_longdesc = "Wet sponges can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, water will pour into the bucket.", + description = S("Waterlogged Sponge"), + _tt_help = S("Can be dried in furnace"), + _doc_items_longdesc = S("A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket."), drawtype = "normal", is_ground_content = false, tiles = {"mcl_sponges_sponge_wet.png"}, @@ -86,10 +108,37 @@ minetest.register_node("mcl_sponges:sponge_wet", { stack_max = 64, sounds = mcl_sounds.node_sound_dirt_defaults(), groups = {handy=1, building_block=1}, - _mcl_blast_resistance = 3, + _mcl_blast_resistance = 0.6, _mcl_hardness = 0.6, }) +if minetest.get_modpath("mclx_core") then + minetest.register_node("mcl_sponges:sponge_wet_river_water", { + description = S("Riverwaterlogged Sponge"), + _tt_help = S("Can be dried in furnace"), + _doc_items_longdesc = S("This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.") .. "\n" .. S("A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water."), + drawtype = "normal", + is_ground_content = false, + tiles = {"mcl_sponges_sponge_wet_river_water.png"}, + walkable = true, + pointable = true, + diggable = true, + buildable_to = false, + stack_max = 64, + sounds = mcl_sounds.node_sound_dirt_defaults(), + groups = {handy=1, building_block=1}, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + }) + + minetest.register_craft({ + type = "cooking", + output = "mcl_sponges:sponge", + recipe = "mcl_sponges:sponge_wet_river_water", + cooktime = 10, + }) +end + minetest.register_craft({ type = "cooking", output = "mcl_sponges:sponge", @@ -104,8 +153,9 @@ minetest.register_abm({ interval = 1, chance = 1, action = function(pos) - if absorb(pos) then - minetest.add_node(pos, {name = "mcl_sponges:sponge_wet"}) + local absorbed, wet_sponge = absorb(pos) + if absorbed then + minetest.add_node(pos, {name = wet_sponge}) end end, }) diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.de.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.de.tr new file mode 100644 index 00000000..4f0b827f --- /dev/null +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.de.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_sponges +Sponge=Schwamm +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Schwämme sind Blöcke, die Wasser um sie herum entfernen, wenn sie platziert wurden oder in Berührung mit Wasser kommen, was sie in einen nassen Schwamm verwandelt. +Waterlogged Sponge=Wassergetränkter Schwamm +A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Ein wassergetränkter Schwamm kann in einem Ofen getrocknet werden, um ihn zu einem (trockenem) Schwamm zu verwandeln. Wenn es einen leeren Eimer im Brennstoffplatz des Ofens gibt, wird das Wasser in den Eimer fließen. +Riverwaterlogged Sponge=Flusswassergetränkter Schwamm +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Dies ist ein Schwamm, der triefend nass und voller Flusswasser ist. Er kann in einem Ofen getrocknet werden, um ihn zu einem (trockenem) Schwamm zu verwandeln. Wenn es einen leeren Eimer im Brennstoffplatz des Ofens gibt, wird das Flusswasser in den Eimer fließen. +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Ein Schwamm wird flusswassergetränkt (statt wassergetränkt), wenn er mehr Flusswasser als (normales) Wasser aufsaugt. +Removes water on contact=Entfernt Wasser bei Berührung +Can be dried in furnace=Kann im Ofen getrocknet werden diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.es.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.es.tr new file mode 100644 index 00000000..4ee44838 --- /dev/null +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.es.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_sponges +Sponge=Esponja +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Las esponjas son bloques que eliminan el agua a su alrededor cuando se colocan o entran en contacto con el agua, convirtiéndola en una esponja húmeda. +Waterlogged Sponge=Esponja mojada +A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Se puede secar una esponja mojada de agua en el horno para convertirla en una esponja (seca). Cuando hay un cubo vacío en la ranura de combustible de un horno, el agua se vierte en el cubo. +Riverwaterlogged Sponge=Esponja mojada con agua de rio +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Esta es una esponja mojada con agua de río. Se puede secar en el horno para convertirlo en una esponja (seca). Cuando hay un balde vacío en la ranura de combustible del horno, el agua del río se vierte en el balde. +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Una esponja se inunda de río (en lugar de inundarse) si absorbe más agua de río que el agua (normal). diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.fr.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.fr.tr new file mode 100644 index 00000000..58dd74be --- /dev/null +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.fr.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_sponges +Sponge=Éponge +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Les éponges sont des blocs qui éliminent l'eau autour d'eux lorsqu'ils sont placés ou entrent en contact avec l'eau, la transformant en une éponge humide. +Waterlogged Sponge=Éponge gorgée d'eau +A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Une éponge gorgée d'eau peut être séchée dans le four pour la transformer en éponge (sèche). Lorsqu'il y a un seau vide dans la fente de combustible d'un four, l'eau se déversera dans le seau. +Riverwaterlogged Sponge=Éponge gorgée d'eau de rivière +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Il s'agit d'une éponge trempée d'eau de rivière. Elle peut être séché dans le four pour le transformer en éponge (sèche). Lorsqu'il y a un seau vide dans la fente de combustible du four, l'eau de la rivière se déversera dans le seau. +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Une éponge devient gorgée d'eau de rivière (au lieu d'être gorgée d'eau) si elle aspire plus d'eau de rivière que d'eau (normale). +Removes water on contact=Élimine l'eau au contact +Can be dried in furnace=Peut être séché au four diff --git a/mods/ITEMS/mcl_sponges/locale/template.txt b/mods/ITEMS/mcl_sponges/locale/template.txt new file mode 100644 index 00000000..9307c2cd --- /dev/null +++ b/mods/ITEMS/mcl_sponges/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: mcl_sponges +Sponge= +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.= +Waterlogged Sponge= +A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.= +Riverwaterlogged Sponge= +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.= +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.= +Removes water on contact= +Can be dried in furnace= diff --git a/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge.png b/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge.png index 0d68d872..dd7f3b71 100644 Binary files a/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge.png and b/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge.png differ diff --git a/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge_wet.png b/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge_wet.png index 7f4e8420..e9d15219 100644 Binary files a/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge_wet.png and b/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge_wet.png differ diff --git a/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge_wet_river_water.png b/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge_wet_river_water.png new file mode 100644 index 00000000..bbbf86fa Binary files /dev/null and b/mods/ITEMS/mcl_sponges/textures/mcl_sponges_sponge_wet_river_water.png differ diff --git a/mods/ITEMS/mcl_stairs/API.md b/mods/ITEMS/mcl_stairs/API.md new file mode 100644 index 00000000..6c91754b --- /dev/null +++ b/mods/ITEMS/mcl_stairs/API.md @@ -0,0 +1,83 @@ +# API for `mcl_stairs` + +Register your own stairs and slabs! + +## Quick start + +Register platinum stair and slab based on node `example:platinum`: + +``` +mcl_stairs.register_stair_and_slab_simple("platinum", "example:platinum", "Platinum Stair", "Platinum Slab", "Double Platinum Slab") +``` + +## `mcl_stairs.register_stair_and_slab_simple(subname, sourcenode, desc_stair, desc_slab, double_description, corner_stair_texture_override)` +Register a simple stair and a slab. The stair and slab will inherit all attributes from `sourcenode`. The `sourcenode` is also used as the item for crafting recipes. + +This function is meant for simple nodes; if you need more flexibility, use one of the other functions instead. + +See `register_stair` and `register_slab` for the itemstrings of the registered nodes. + +### Parameters +* `subname`: Name fragment for node itemstrings (see `register_stair` and `register_slab`) +* `sourcenode`: The node on which this stair is based on +* `desc_stair`: Description of stair node +* `desc_slab`: Description of slab node +* `double_description`: Description of double slab node +* `corner_stair_texture_override`: Optional, see `register_stair` + +## `mcl_stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, hardness, double_description, corner_stair_texture_override)` +Register a simple stair and a slab, plus crafting recipes. In this function, you need to specify most things explicitly. + +### Parameters +* `desc_stair`: Description of stair node +* `desc_slab`: Description of slab node +* Other parameters: Same as for `register_stair` and `register_slab` + +## `mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, hardness, corner_stair_texture_override)` +Registers a stair. This also includes the inner and outer corner stairs, they are added automatically. Also adds crafting recipes. + +The itemstrings for the registered nodes will be of the form: + +* `mcl_stairs:stair_`: Normal stair +* `mcl_stairs:stair__inner`: Inner stair +* `mcl_stairs:stair__outer`: Outer stair + +### Parameters +* `subname`: Name fragment for node itemstrings (see above) +* `recipeitem`: Item for crafting recipe. Use `group:` prefix to use a group instead +* `groups`: Groups used for stair +* `images`: Textures +* `description`: Stair description/tooltip +* `sounds`: Sounds table +* `hardness`: MCL2 block hardness value +* `corner_stair_texture_override`: Optional. Custom textures for corner stairs, see below + +`groups`, `images`, `sounds` or `hardness` can be `nil`, in which case the value is inhereted from the `recipeitem`. + +#### `corner_stair_texture_override` +This optional parameter specifies the textures to be used for corner stairs. + +It can be one of the following data types: + +* string: one of: + * "default": Use same textures as original node + * "woodlike": Take first frame of the original tiles, then take a triangle piece + of the texture, rotate it by 90° and overlay it over the original texture +* table: Specify textures explicitly. Table of tiles to override textures for + inner and outer stairs. Table format: + { tiles_def_for_outer_stair, tiles_def_for_inner_stair } +* nil: Equivalent to "default" + +## `mcl_stairs.register_slab(subname, recipeitem, groups, images, description, sounds, hardness, double_description)` +Registers a slab and a corresponding double slab. Also adds crafting recipe. + +The itemstrings for the registered nodes will be of the form: + +* `mcl_stairs:slab_`: Slab +* `mcl_stairs:slab__top`: Upper slab, used internally +* `mcl_stairs:slab__double`: Double slab + +### Parameters +* `double_description`: Node description/tooltip for double slab +* Other parameters: Same as for `register_stair` + diff --git a/mods/ITEMS/mcl_stairs/README.txt b/mods/ITEMS/mcl_stairs/README.txt index d336e4a2..9607b5d0 100644 --- a/mods/ITEMS/mcl_stairs/README.txt +++ b/mods/ITEMS/mcl_stairs/README.txt @@ -15,3 +15,4 @@ Jean-Patrick G. (kilbith) (CC BY-SA 3.0): stairs_stair.obj + diff --git a/mods/ITEMS/mcl_stairs/alias.lua b/mods/ITEMS/mcl_stairs/alias.lua index 1b2d9384..1865b577 100644 --- a/mods/ITEMS/mcl_stairs/alias.lua +++ b/mods/ITEMS/mcl_stairs/alias.lua @@ -11,7 +11,7 @@ for m=1, #materials do minetest.register_alias("stairs:slab_"..mat, "mcl_stairs:slab_"..mat) minetest.register_alias("stairs:stair_"..mat, "mcl_stairs:stair_"..mat) - -- mcstair + -- corner stairs minetest.register_alias("stairs:stair_"..mat.."_inner", "mcl_stairs:stair_"..mat.."_inner") minetest.register_alias("stairs:stair_"..mat.."_outer", "mcl_stairs:stair_"..mat.."_outer") end diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 77a0e225..9f396473 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -1,3 +1,13 @@ +local S = minetest.get_translator("mcl_stairs") + +-- Core mcl_stairs API + +-- Wrapper around mintest.pointed_thing_to_face_pos. +local function get_fpos(placer, pointed_thing) + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + return finepos.y % 1 +end + local function place_slab_normal(itemstack, placer, pointed_thing) -- Use pointed node's on_rightclick function first, if present local node = minetest.get_node(pointed_thing.under) @@ -10,10 +20,9 @@ local function place_slab_normal(itemstack, placer, pointed_thing) local p0 = pointed_thing.under local p1 = pointed_thing.above - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() - local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) - local fpos = finepos.y % 1 + local fpos = get_fpos(placer, pointed_thing) local place = ItemStack(itemstack) local origname = itemstack:get_name() @@ -39,13 +48,12 @@ local function place_stair(itemstack, placer, pointed_thing) local p1 = pointed_thing.above local param2 = 0 - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() if placer_pos then param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) end - local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) - local fpos = finepos.y % 1 + local fpos = get_fpos(placer, pointed_thing) if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) or (fpos < -0.5 and fpos > -0.999999999) then @@ -59,21 +67,36 @@ local function place_stair(itemstack, placer, pointed_thing) return minetest.item_place(itemstack, placer, pointed_thing, param2) end --- Register mcl_stairs. +-- Register stairs. -- Node will be called mcl_stairs:stair_ -function mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, hardness) +function mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, hardness, corner_stair_texture_override) groups.stair = 1 groups.building_block = 1 + + if recipeitem then + if not images then + images = minetest.registered_items[recipeitem].tiles + end + if not groups then + groups = minetest.registered_items[recipeitem].groups + end + if not sounds then + sounds = minetest.registered_items[recipeitem].sounds + end + if not hardness then + hardness = minetest.registered_items[recipeitem]._mcl_hardness + end + end + minetest.register_node(":mcl_stairs:stair_" .. subname, { description = description, - _doc_items_longdesc = "Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the bottom or at the upper half of the side of a block will be placed upside down.", + _doc_items_longdesc = S("Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down."), drawtype = "mesh", mesh = "stairs_stair.obj", tiles = images, paramtype = "light", paramtype2 = "facedir", - sunlight_propagates = false, is_ground_content = false, groups = groups, sounds = sounds, @@ -98,6 +121,31 @@ function mcl_stairs.register_stair(subname, recipeitem, groups, images, descript return place_stair(itemstack, placer, pointed_thing) end, + on_rotate = function(pos, node, user, mode, param2) + -- Flip stairs vertically + if mode == screwdriver.ROTATE_AXIS then + local minor = node.param2 + if node.param2 >= 20 then + minor = node.param2 - 20 + if minor == 3 then + minor = 1 + elseif minor == 1 then + minor = 3 + end + node.param2 = minor + else + if minor == 3 then + minor = 1 + elseif minor == 1 then + minor = 3 + end + node.param2 = minor + node.param2 = node.param2 + 20 + end + minetest.set_node(pos, node) + return true + end + end, _mcl_hardness = hardness, }) @@ -121,6 +169,8 @@ function mcl_stairs.register_stair(subname, recipeitem, groups, images, descript }, }) end + + mcl_stairs.cornerstair.add("mcl_stairs:stair_"..subname, corner_stair_texture_override) end @@ -137,15 +187,30 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti local upper_slab = lower_slab.."_top" local double_slab = lower_slab.."_double" + if recipeitem then + if not images then + images = minetest.registered_items[recipeitem].tiles + end + if not groups then + groups = minetest.registered_items[recipeitem].groups + end + if not sounds then + sounds = minetest.registered_items[recipeitem].sounds + end + if not hardness then + hardness = minetest.registered_items[recipeitem]._mcl_hardness + end + end + -- Automatically generate double slab description if not double_description then - double_description = string.format("Double %s", description) + double_description = S("Double @1", description) minetest.log("warning", "[stairs] No explicit description for double slab '"..double_slab.."' added. Using auto-generated description.") end groups.slab = 1 groups.building_block = 1 - local longdesc = "Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created." + local longdesc = S("Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.") local slabdef = { description = description, @@ -154,7 +219,6 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti tiles = images, paramtype = "light", -- Facedir intentionally left out (see below) - sunlight_propagates = false, is_ground_content = false, groups = groups, sounds = sounds, @@ -178,9 +242,6 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti not ((dir.y >= 0 and minetest.get_item_group(under.name, "slab_top") == 1) or (dir.y <= 0 and minetest.get_item_group(under.name, "slab_top") == 0)) then - if not recipeitem then - return itemstack - end local player_name = placer:get_player_name() if minetest.is_protected(pointed_thing.under, player_name) and not minetest.check_player_privs(placer, "protection_bypass") then @@ -201,6 +262,15 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti end, _mcl_hardness = hardness, _mcl_other_slab_half = upper_slab, + on_rotate = function(pos, node, user, mode, param2) + -- Flip slab + if mode == screwdriver.ROTATE_AXIS then + node.name = upper_slab + minetest.set_node(pos, node) + return true + end + return false + end, } minetest.register_node(":"..lower_slab, slabdef) @@ -213,12 +283,21 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti topdef.groups.slab_top = 1 topdef.groups.not_in_creative_inventory = 1 topdef.groups.not_in_craft_guide = 1 - topdef.description = string.format("Upper %s", description) + topdef.description = S("Upper @1", description) topdef._doc_items_create_entry = false topdef._doc_items_longdesc = nil topdef._doc_items_usagehelp = nil topdef.drop = lower_slab topdef._mcl_other_slab_half = lower_slab + topdef.on_rotate = function(pos, node, user, mode, param2) + -- Flip slab + if mode == screwdriver.ROTATE_AXIS then + node.name = lower_slab + minetest.set_node(pos, node) + return true + end + return false + end topdef.node_box = { type = "fixed", fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, @@ -238,7 +317,7 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti dgroups.double_slab = 1 minetest.register_node(":"..double_slab, { description = double_description, - _doc_items_longdesc = "Double slabs are full blocks which are created by placing two slabs of the same kind on each other.", + _doc_items_longdesc = S("Double slabs are full blocks which are created by placing two slabs of the same kind on each other."), tiles = images, is_ground_content = false, groups = dgroups, @@ -269,14 +348,14 @@ end function mcl_stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, hardness, - double_description) - mcl_stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds, hardness) + double_description, corner_stair_texture_override) + mcl_stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds, hardness, corner_stair_texture_override) mcl_stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds, hardness, double_description) end -- Very simple registration function -- Makes stair and slab out of a source node -function mcl_stairs.register_stair_and_slab_simple(subname, sourcenode, desc_stair, desc_slab, desc_double_slab) +function mcl_stairs.register_stair_and_slab_simple(subname, sourcenode, desc_stair, desc_slab, desc_double_slab, corner_stair_texture_override) local def = minetest.registered_nodes[sourcenode] local groups = {} -- Only allow a strict set of groups to be added to stairs and slabs for more predictable results @@ -286,6 +365,6 @@ function mcl_stairs.register_stair_and_slab_simple(subname, sourcenode, desc_sta groups[allowed_groups[a]] = def.groups[allowed_groups[a]] end end - mcl_stairs.register_stair_and_slab(subname, sourcenode, groups, def.tiles, desc_stair, desc_slab, def.sounds, def._mcl_hardness, desc_double_slab) + mcl_stairs.register_stair_and_slab(subname, sourcenode, groups, def.tiles, desc_stair, desc_slab, def.sounds, def._mcl_hardness, desc_double_slab, corner_stair_texture_override) end diff --git a/mods/ITEMS/mcstair/init.lua b/mods/ITEMS/mcl_stairs/cornerstair.lua similarity index 91% rename from mods/ITEMS/mcstair/init.lua rename to mods/ITEMS/mcl_stairs/cornerstair.lua index f0411980..2d5f214e 100644 --- a/mods/ITEMS/mcstair/init.lua +++ b/mods/ITEMS/mcl_stairs/cornerstair.lua @@ -1,4 +1,9 @@ -mcstair = {} +-- Corner stairs handling + +-- This code originally copied from the [mcstair] mod and merged into this mod. +-- This file is licensed under CC0. + +mcl_stairs.cornerstair = {} local get_stair_param = function(node) local stair = minetest.get_item_group(node.name, "stair") @@ -179,16 +184,53 @@ local stair_connect_to_param = function(connect, ceiling) return param end -function mcstair.add(name, stairtiles) +--[[ +mcl_stairs.cornerstair.add(name, stairtiles) + +NOTE: This function is used internally. If you register a stair, this function is already called, no +need to call it again! + +Usage: +* name is the name of the node to make corner stairs for. +* stairtiles is optional, can specify textures for inner and outer stairs. 3 data types are accepted: + * string: one of: + * "default": Use same textures as original node + * "woodlike": Take first frame of the original tiles, then take a triangle piece + of the texture, rotate it by 90° and overlay it over the original texture + * table: Specify textures explicitly. Table of tiles to override textures for + inner and outer stairs. Table format: + { tiles_def_for_outer_stair, tiles_def_for_inner_stair } + * nil: Equivalent to "default" +]] + +function mcl_stairs.cornerstair.add(name, stairtiles) local node_def = minetest.registered_nodes[name] local outer_tiles local inner_tiles - if stairtiles then - outer_tiles = stairtiles[1] - inner_tiles = stairtiles[2] - else + if stairtiles == "woodlike" then + outer_tiles = table.copy(node_def.tiles) + inner_tiles = table.copy(node_def.tiles) + for i=2,6 do + if outer_tiles[i] == nil then + outer_tiles[i] = outer_tiles[i-1] + end + if inner_tiles[i] == nil then + inner_tiles[i] = inner_tiles[i-1] + end + end + local t = node_def.tiles[1] + outer_tiles[1] = t.."^("..t.."^[transformR90^mcl_stairs_turntexture.png^[makealpha:255,0,255)" + outer_tiles[2] = t.."^("..t.."^mcl_stairs_turntexture.png^[transformR270^[makealpha:255,0,255)" + outer_tiles[3] = t + inner_tiles[1] = t.."^("..t.."^[transformR90^(mcl_stairs_turntexture.png^[transformR180)^[makealpha:255,0,255)" + inner_tiles[2] = t.."^("..t.."^[transformR270^(mcl_stairs_turntexture.png^[transformR90)^[makealpha:255,0,255)" + inner_tiles[3] = t + elseif stairtiles == nil or stairtiles == "default" then outer_tiles = node_def.tiles inner_tiles = node_def.tiles + else + outer_tiles = stairtiles[1] + inner_tiles = stairtiles[2] end local outer_groups = table.copy(node_def.groups) outer_groups.not_in_creative_inventory = 1 @@ -609,7 +651,6 @@ function mcstair.add(name, stairtiles) paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - sunlight_propagates = false, groups = outer_groups, sounds = node_def.sounds, node_box = { @@ -623,6 +664,7 @@ function mcstair.add(name, stairtiles) stairs = {name, name.."_outer", name.."_inner"}, after_dig_node = function(pos, oldnode) after_dig_node(pos, oldnode) end, _mcl_hardness = node_def._mcl_hardness, + on_rotate = false, }) minetest.register_node(":"..name.."_inner", { description = node_def.description, @@ -632,7 +674,6 @@ function mcstair.add(name, stairtiles) paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - sunlight_propagates = false, groups = inner_groups, sounds = node_def.sounds, node_box = { @@ -647,6 +688,7 @@ function mcstair.add(name, stairtiles) stairs = {name, name.."_outer", name.."_inner"}, after_dig_node = function(pos, oldnode) after_dig_node(pos, oldnode) end, _mcl_hardness = node_def._mcl_hardness, + on_rotate = false, }) if minetest.get_modpath("doc") then @@ -655,38 +697,4 @@ function mcstair.add(name, stairtiles) end end -for _,v in ipairs({ - "wood", - "junglewood", - "sprucewood", - "acaciawood", - "birchwood", - "darkwood" -}) do - local t = minetest.registered_nodes["mcl_core:"..v].tiles[1] - mcstair.add("mcl_stairs:stair_"..v, { - { - t.."^("..t.."^[transformR90^mcstair_turntexture.png^[makealpha:255,0,255)", - t.."^("..t.."^mcstair_turntexture.png^[transformR270^[makealpha:255,0,255)", - t - }, - { - t.."^("..t.."^[transformR90^(mcstair_turntexture.png^[transformR180)^[makealpha:255,0,255)", - t.."^("..t.."^[transformR270^(mcstair_turntexture.png^[transformR90)^[makealpha:255,0,255)", - t - } - }) -end -for _,v in ipairs({ - "cobble", - "brick_block", - "sandstone", - "redsandstone", - "stonebrick", - "quartzblock", - "purpur_block", - "nether_brick", -}) do - mcstair.add("mcl_stairs:stair_"..v) -end diff --git a/mods/ITEMS/mcl_stairs/depends.txt b/mods/ITEMS/mcl_stairs/depends.txt index e49f5a7a..96e184bd 100644 --- a/mods/ITEMS/mcl_stairs/depends.txt +++ b/mods/ITEMS/mcl_stairs/depends.txt @@ -2,3 +2,4 @@ mcl_core mcl_sounds mcl_nether mcl_end +mcl_ocean diff --git a/mods/ITEMS/mcl_stairs/init.lua b/mods/ITEMS/mcl_stairs/init.lua index ca6f5755..a5ca820b 100644 --- a/mods/ITEMS/mcl_stairs/init.lua +++ b/mods/ITEMS/mcl_stairs/init.lua @@ -8,6 +8,7 @@ mcl_stairs = {} -- Load other files dofile(minetest.get_modpath("mcl_stairs").."/api.lua") +dofile(minetest.get_modpath("mcl_stairs").."/cornerstair.lua") dofile(minetest.get_modpath("mcl_stairs").."/register.lua") dofile(minetest.get_modpath("mcl_stairs").."/crafting.lua") dofile(minetest.get_modpath("mcl_stairs").."/alias.lua") diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr new file mode 100644 index 00000000..8b53d8d1 --- /dev/null +++ b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr @@ -0,0 +1,101 @@ +# textdomain: mcl_stairs +Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Treppen sind nützlich, um auf höheres Gelände nur mit Gehen zu kommen, man muss nicht springen. Wenn Treppen in einem Eckmuster platziert werden, werden Ecktreppen erzeugt. Treppen, die an die Decke oder der oberen Hälfte eines Blocks platziert werden, werden verkehrt herum platziert. +Double @1=@1 (doppelt) +Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Eine Platte ist halb so hoch wie ihr Vollblock-Gegenstück und belegt entweder den unteren oder unteren Teil eines Blocks, je nach dem, wie er platziert wurde. Platten können leicht betreten werden, ohne springen zu müssen. Wird eine Platte auf einer anderen gleichen Platte platziert, ergibt das eine Doppelplatte. +Upper @1=@1 (oben) +Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Doppelplatten sind ganze Blöcke, die entstehen, wenn zwei gleiche Platten aufeinander gestapelt werden. +Oak Wood Stairs=Eichenholztreppe +Oak Wood Slab=Eichenholzplatte +Double Oak Wood Slab=Doppeleichenholzplatte +Jungle Wood Stairs=Dschungelholztreppe +Jungle Wood Slab=Dschungelholzplatte +Double Jungle Wood Slab=Doppeldschungelholzplatte +Acacia Wood Stairs=Akazienholztreppe +Acacia Wood Slab=Akazienholzplatte +Double Acacia Wood Slab=Doppelakazienholzplatte +Spruce Wood Stairs=Fichtenholztreppe +Spruce Wood Slab=Fichtenholzplatte +Double Spruce Wood Slab=Doppelfichtenholzplatte +Birch Wood Stairs=Birkenholztreppe +Birch Wood Slab=Birkenholzplatte +Double Birch Wood Slab=Doppelbirkenholzplatte +Dark Oak Wood Stairs=Schwarzeichenholzstreppe +Dark Oak Wood Slab=Schwarzeichenholzplatte +Double Dark Oak Wood Slab=Doppelschwarzeichenholzplatte +Stone Stairs=Steintreppe +Stone Slab=Steinplatte +Double Stone Slab=Doppelsteinplatte +Polished Stone Slab=Polierte Steinplatte +Double Polished Stone Slab=Doppelte polierte Steinplatte +Andesite Stairs=Andesittreppe +Andesite Slab=Andesitplatte +Double Andesite Slab=Doppelandesitplatte +Granite Stairs=Granittreppe +Granite Slab=Granitplatte +Double Granite Slab=Doppelgranitplatte +Diorite Stairs=Diorittreppe +Diorite Slab=Dioritplatte +Double Diorite Slab=Doppeldioritplatte +Cobblestone Stairs=Kopfsteinpflastertreppe +Cobblestone Slab=Kopfsteinpflasterplatte +Double Cobblestone Slab=Doppelkopfsteinpflasterplatte +Mossy Cobblestone Slab=Moosige Kopfsteinpflasterplatte +Mossy Cobblestone Stairs=Moosige Kopfsteinpflastertreppe +Double Mossy Cobblestone Slab=Doppelte moosige Kopfsteinpflasterplatte +Brick Stairs=Ziegeltreppe +Brick Slab=Ziegelplatte +Double Brick Slab=Doppelziegelplatte +Sandstone Stairs=Sandsteintreppe +Sandstone Slab=Sandsteinplatte +Double Sandstone Slab=Doppelsandsteinplatte +Smooth Sandstone Stairs=Glatte Sandsteintreppe +Smooth Sandstone Slab=Glatte Sandsteinplatte +Double Smooth Sandstone Slab=Doppelte glatte Sandsteinplatte +Red Sandstone Stairs=Rote Sandsteintreppe +Red Sandstone Slab=Rote Sandsteinplatte +Double Red Sandstone Slab=Doppelte rote Sandsteinplatte +Smooth Red Sandstone Stairs=Glatte rote Sandsteintreppe +Smooth Red Sandstone Slab=Glatte rote Sandsteinplatte +Double Smooth Red Sandstone Slab=Doppelte glatte rote Sandsteinplatte +Stone Bricks Stairs=Steinziegeltreppe +Stone Bricks Slab=Steinziegelplatte +Double Stone Bricks Slab=Doppelsteinziegelplatte +Quartz Stairs=Quarztreppe +Quartz Slab=Quarzplatte +Double Quartz Slab=Doppelquarzplatte +Smooth Quartz Stairs=Glatte Quarztreppe +Smooth Quartz Slab=Glatte Quarzplatte +Double Smooth Quartz Slab=Doppelte glatte Quarzplatte +Nether Brick Stairs=Netherziegeltreppe +Nether Brick Slab=Netherziegelplatte +Double Nether Brick Slab=Doppelte Netherziegelplatte +Red Nether Brick Stairs=Rote Netherbricktreppe +Red Nether Brick Slab=Rote Netherbrickplatte +Double Red Nether Brick Slab=Doppelte rote Netherbricktreppe +End Stone Brick Stairs=Endsteinziegeltreppe +End Stone Brick Slab=Endsteinziegelplatte +Double End Stone Brick Slab=Doppelte Endsteinziegelplatte +Purpur Stairs=Purpurtreppe +Purpur Slab=Purpurplatte +Double Purpur Slab=Doppelte Purpurplatte +Prismarine Stairs=Prismarintreppe +Prismarine Slab=Prismarinplatte +Double Prismarine Slab=Doppelte Prismarinplatte +Prismarine Brick Stairs=Prismarinziegeltreppe +Prismarine Brick Slab=Prismarinziegelplatte +Double Prismarine Brick Slab=Doppelte Prismarinziegelplatte +Dark Prismarine Stairs=Dunkelprismarintreppe +Dark Prismarine Slab=Dunkelprismarinplatte +Double Dark Prismarine Slab=Doppeldunkelprismarinplatte +Polished Andesite Slab=Polierte Andesitplatte +Double Polished Andesite Slab=Doppelte polierte Andesitplatte +Polished Andesite Stairs=Polierte Andesittreppe +Polished Granite Slab=Polierte Granitplatte +Double Polished Granite Slab=Doppelte polierte Granitplatte +Polished Granite Stairs=Polierte Granittreppe +Polished Diorite Slab=Polierte Dioritplatte +Double Polished Diorite Slab=Doppelte polierte Dioritplatte +Polished Diorite Stairs=Polierte Diorittreppe +Mossy Stone Brick Stairs=Moosige Steinziegeltreppe +Mossy Stone Brick Slab=Moosige Steinziegelplatte +Double Mossy Stone Brick Slab=Doppelte moosige Steinziegelplatte diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.es.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.es.tr new file mode 100644 index 00000000..1a17a816 --- /dev/null +++ b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.es.tr @@ -0,0 +1,101 @@ +# textdomain: mcl_stairs +Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Las escaleras son útiles para llegar a lugares más altos al caminar sobre ellas; No se requiere saltar. Colocar escaleras en un patrón de esquina creará escaleras de esquina. Las escaleras colocadas en el techo o en la mitad superior del lado de un bloque se colocarán boca abajo. +Double @1=@1 (Doble) +Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Las losas son la mitad de altas que sus contrapartes de bloque completo y ocupan la parte inferior o superior de un bloque, dependiendo de cómo se haya colocado. Las losas se pueden pisar fácilmente sin necesidad de saltar. Cuando se coloca una losa en otra losa del mismo tipo, se crea una losa doble. +Upper @1=@1 (Superior) +Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Las losas dobles son bloques completos que se crean colocando dos losas del mismo tipo entre sí +Oak Wood Stairs=Escaleras de roble +Oak Wood Slab=Losa de roble +Double Oak Wood Slab=Losa doble de roble +Jungle Wood Stairs=Escaleras de la selva +Jungle Wood Slab=Losa de la selva +Double Jungle Wood Slab=Losa doble de la selva +Acacia Wood Stairs=Escaleras de acacia +Acacia Wood Slab=Losa de acacia +Double Acacia Wood Slab=Losa doble de acacia +Spruce Wood Stairs=Escaleras de abeto +Spruce Wood Slab=Losa de abeto +Double Spruce Wood Slab=Losa doble de abeto +Birch Wood Stairs=Escaleras de abedul +Birch Wood Slab=Losa de abedul +Double Birch Wood Slab=Losa doble de abedul +Dark Oak Wood Stairs=Escaleras de roble oscuro +Dark Oak Wood Slab=Losa de roble oscuro +Double Dark Oak Wood Slab=Losa doble de roble oscuro +Stone Stairs=Escaleras de piedra +Stone Slab=Losa de piedra +Double Stone Slab=Losa doble de piedra +Polished Stone Slab=Losa de piedra pulida +Double Polished Stone Slab=Losa doble de piedra pulida +Andesite Stairs=Escaleras de andesita +Andesite Slab=Losa de andesita +Double Andesite Slab=Losa doble de andesita +Granite Stairs=Escaleras de granito +Granite Slab=Losa de granito +Double Granite Slab=Losa doble de granito +Diorite Stairs=Escaleras de diorita +Diorite Slab=Losa de diorita +Double Diorite Slab=Losa doble de diorita +Cobblestone Stairs=Escaleras de roca +Cobblestone Slab=Losa de roca +Double Cobblestone Slab=Losa doble de roca +Mossy Cobblestone Slab=Losa de roca musgosa +Mossy Cobblestone Stairs=Escaleras de roca musgosa +Double Mossy Cobblestone Slab=Losa doble de roca musgosa +Brick Stairs=Escaleras de ladrillos +Brick Slab=Losa de ladrillos +Double Brick Slab=Losa doble de ladrillos +Sandstone Stairs=Escaleras de arenisca +Sandstone Slab=Losa de arenisca +Double Sandstone Slab=Losa doble de arenisca +Smooth Sandstone Stairs=Escaleras de arenisca lisa +Smooth Sandstone Slab=Losa de arenisca lisa +Double Smooth Sandstone Slab=Losa doble de arenisca lisa +Red Sandstone Stairs=Escaleras de arenisca roja +Red Sandstone Slab=Losa de arenisca roja +Double Red Sandstone Slab=Losa doble de arenisca roja +Smooth Red Sandstone Stairs=Escaleras de arenisca roja lisa +Smooth Red Sandstone Slab=Losa de arenisca roja lisa +Double Smooth Red Sandstone Slab=Losa doble de arenisca roja lisa +Stone Bricks Stairs=Escaleras de ladrillos de piedra +Stone Bricks Slab=Losa de ladrillos de piedra +Double Stone Bricks Slab=Losa doble de ladrillos de piedra +Quartz Stairs=Escaleras de cuarzo +Quartz Slab=Losa de cuarzo +Double Quartz Slab=Losa doble de cuarzo +Smooth Quartz Stairs=Escaleras de cuarzo liso +Smooth Quartz Slab=Losa de cuarzo liso +Double Smooth Quartz Slab=Losa doble de cuarzo liso +Nether Brick Stairs=Escaleras de ladrillos del Nether +Nether Brick Slab=Losa de ladrillos del Nether +Double Nether Brick Slab=Losa doble de ladrillos del Nether +Red Nether Brick Stairs=Escaleras de ladrillos del Nether rojos +Red Nether Brick Slab=Losa de ladrillos del Nether roja +Double Red Nether Brick Slab=Losa doble de ladrillos del Nether roja +End Stone Brick Stairs=Escaleras de ladrillos de piedra del End +End Stone Brick Slab=Losa de ladrillos de piedra del End +Double End Stone Brick Slab=Losa doble de ladrillos de piedra del End +Purpur Stairs=Escaleras de púrpur +Purpur Slab=Losa de púrpur +Double Purpur Slab=Losa doble de púrpur +Prismarine Stairs=Escaleras de prismarina +Prismarine Slab=Losa de prismarina +Double Prismarine Slab=Losa doble de prismarina +Prismarine Brick Stairs=Escaleras de ladrillos de prismarina +Prismarine Brick Slab=Losa de ladrillos de prismarina +Double Prismarine Brick Slab=Losa doble de ladrillos de prismarina +Dark Prismarine Stairs=Escaleras de prismarina oscura +Dark Prismarine Slab=Losa de prismarina oscura +Double Dark Prismarine Slab=Losa doble de prismarina oscura +Polished Andesite Slab=Losa de andesita pulida +Double Polished Andesite Slab=Losa doble de andesita pulida +Polished Andesite Stairs=Escaleras de andesita pulida +Polished Granite Slab=Losa de granito pulido +Double Polished Granite Slab=Losa doble de granito pulido +Polished Granite Stairs=Escaleras de granito pulido +Polished Diorite Slab=Losa de diorita pulida +Double Polished Diorite Slab=Losa doble de diorita pulida +Polished Diorite Stairs=Escaleras de diorita pulida +Mossy Stone Brick Stairs=Escaleras de ladrillos de piedra musgosos +Mossy Stone Brick Slab=Losa de ladrillos de piedra musgosos +Double Mossy Stone Brick Slab=Losa de ladrillo de piedra doble musgo diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr new file mode 100644 index 00000000..9c6684fc --- /dev/null +++ b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr @@ -0,0 +1,101 @@ +# textdomain: mcl_stairs +Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Les escaliers sont utiles pour atteindre des endroits plus élevés en marchant dessus; le saut n'est pas obligatoire. Placer les escaliers dans un motif d'angle créera des escaliers d'angle. Les escaliers placés au plafond ou dans la moitié supérieure du côté d'un bloc seront placés à l'envers. +Double @1=Double @1 +Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Les dalles sont deux fois moins hautes que leurs homologues de bloc complet et occupent la partie inférieure ou supérieure d'un bloc, selon la façon dont il a été placé. Les dalles peuvent être facilement franchies sans avoir à sauter. Lorsqu'une dalle est placée sur une autre dalle du même type, une double dalle est créée. +Upper @1=@1 Supérieur +Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Les dalles doubles sont des blocs entiers qui sont créés en plaçant deux dalles du même type l'une sur l'autre. +Oak Wood Stairs=Escalier en Bois de Chêne +Oak Wood Slab=Dalle en Bois de Chêne +Double Oak Wood Slab=Double Dalle en Bois de Chêne +Jungle Wood Stairs=Escalier en Bois d'Acajou +Jungle Wood Slab=Dalle en Bois d'Acajou +Double Jungle Wood Slab=Double Dalle en Bois d'Acajou +Acacia Wood Stairs=Escalier en Bois d'Acacia +Acacia Wood Slab=Dalle en Bois d'Acacia +Double Acacia Wood Slab=Double Dalle en Bois d'Acacia +Spruce Wood Stairs=Escalier en Bois de Sapin +Spruce Wood Slab=Dalle en Bois de Sapin +Double Spruce Wood Slab=Double Dalle en Bois de Sapin +Birch Wood Stairs=Escalier en Bois de Bouleau +Birch Wood Slab=Dalle en Bois de Bouleau +Double Birch Wood Slab=Double Dalle en Bois de Bouleau +Dark Oak Wood Stairs=Escalier en Bois de Chêne Noir +Dark Oak Wood Slab=Dalle en Bois de Chêne Noir +Double Dark Oak Wood Slab=Double Dalle en Bois de Chêne Noir +Stone Stairs=Escalier en Roche +Stone Slab=Dalle en Roche +Double Stone Slab=Double Dalle en Roche +Polished Stone Slab=Dalle en Pierre Polie +Double Polished Stone Slab=Double Dalle en Pierre Polie +Andesite Stairs=Escalier en Andésite +Andesite Slab=Dalle en Andésite +Double Andesite Slab=Double Dalle en Andésite +Granite Stairs=Escalier en Granite +Granite Slab=Dalle en Granite +Double Granite Slab=Double Dalle en Granite +Diorite Stairs=Escalier en Diorite +Diorite Slab=Dalle en Diorite +Double Diorite Slab=Double Dalle en Diorite +Cobblestone Stairs=Escalier en Pierre +Cobblestone Slab=Dalle en Pierre +Double Cobblestone Slab=Double Dalle en Pierre +Mossy Cobblestone Stairs=Escalier en Pierre Moussue +Mossy Cobblestone Slab=Dalle en Pierre Moussue +Double Mossy Cobblestone Slab=Double Dalle en Pierre Moussue +Brick Stairs=Escalier de Brique +Brick Slab=Dalle en Brique +Double Brick Slab=Double Dalle en Brique +Sandstone Stairs=Escalier en Grès +Sandstone Slab=Dalle en Grès +Double Sandstone Slab=Double Dalle en Grès +Smooth Sandstone Stairs=Escalier en Grès Poli +Smooth Sandstone Slab=Dalle en Grès Poli +Double Smooth Sandstone Slab=Double Dalle en Grès Poli +Red Sandstone Stairs=Escalier en Grès Rouge +Red Sandstone Slab=Dalle en Grès Rouge +Double Red Sandstone Slab=Double Dalle en Grès Rouge +Smooth Red Sandstone Stairs=Escalier en Grès Rouge Poli +Smooth Red Sandstone Slab=Dalle en Grès Rouge Poli +Double Smooth Red Sandstone Slab=Double Dalle en Grès Rouge Poli +Stone Bricks Stairs=Escalier en Pierre Taillée +Stone Bricks Slab=Dalle en Pierre Taillée +Double Stone Bricks Slab=Double Dalle en Pierre Taillée +Quartz Stairs=Escalier en Quartz +Quartz Slab=Dalle en Quartz +Double Quartz Slab=Double Dalle en Quartz +Smooth Quartz Stairs=Escalier en Quartz Poli +Smooth Quartz Slab=Dallle en Quartz Poli +Double Smooth Quartz Slab=Double Dalle en Quartz Poli +Nether Brick Stairs=Escalier en Brique du Nether +Nether Brick Slab=Dalle en Brique du Nether +Double Nether Brick Slab=Double Dalle en Brique du Nether +Red Nether Brick Stairs=Escalier en Brique Rouge du Nether +Red Nether Brick Slab=Dalle en Brique Rouge du Nether +Double Red Nether Brick Slab=Double Dalle en Brique Rouge du Nether +End Stone Brick Stairs=Escalier en Pierre de l'End +End Stone Brick Slab=Dalle en Pierre de l'End +Double End Stone Brick Slab=Double Dalle en Pierre de l'End +Purpur Stairs=Escalier en Purpur +Purpur Slab=Dalle en Purpur +Double Purpur Slab=Double Dalle en Purpur +Prismarine Stairs=Escalier en Prismarine +Prismarine Slab=Dalle en Prismarine +Double Prismarine Slab=Double Dalle en Prismarine +Prismarine Brick Stairs=Escalier en Brique Prismarine +Prismarine Brick Slab=Dalle en Brique Prismarine +Double Prismarine Brick Slab=Double Dalle en Brique Prismarine +Dark Prismarine Stairs=Escalier en Prismarine Sombre +Dark Prismarine Slab=Dalle en Prismarine Sombre +Double Dark Prismarine Slab=Double Dalle en Prismarine Sombre +Polished Andesite Slab=Dalle en Andésite Polie +Double Polished Andesite Slab=Double Dalle en Andésite Polie +Polished Andesite Stairs=Escalier en Andésite Polie +Polished Granite Slab=Dalle en Granit Poli +Double Polished Granite Slab=Double Dalle en Granit Poli +Polished Granite Stairs=Escalier en Granit Poli +Polished Diorite Slab=Dalle en Diorite Polie +Double Polished Diorite Slab=Double Dalle en Diorite Polie +Polished Diorite Stairs=Escalier en Diorite Polie +Mossy Stone Brick Stairs=Escalier en Pierre Taillée Moussue +Mossy Stone Brick Slab=Dalle en Pierre Taillée Moussue +Double Mossy Stone Brick Slab=Double Dalle en Pierre Taillée Moussue diff --git a/mods/ITEMS/mcl_stairs/locale/template.txt b/mods/ITEMS/mcl_stairs/locale/template.txt new file mode 100644 index 00000000..0638af3d --- /dev/null +++ b/mods/ITEMS/mcl_stairs/locale/template.txt @@ -0,0 +1,101 @@ +# textdomain: mcl_stairs +Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.= +Double @1= +Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.= +Upper @1= +Double slabs are full blocks which are created by placing two slabs of the same kind on each other.= +Oak Wood Stairs= +Oak Wood Slab= +Double Oak Wood Slab= +Jungle Wood Stairs= +Jungle Wood Slab= +Double Jungle Wood Slab= +Acacia Wood Stairs= +Acacia Wood Slab= +Double Acacia Wood Slab= +Spruce Wood Stairs= +Spruce Wood Slab= +Double Spruce Wood Slab= +Birch Wood Stairs= +Birch Wood Slab= +Double Birch Wood Slab= +Dark Oak Wood Stairs= +Dark Oak Wood Slab= +Double Dark Oak Wood Slab= +Stone Stairs= +Stone Slab= +Double Stone Slab= +Polished Stone Slab= +Double Polished Stone Slab= +Andesite Stairs= +Andesite Slab= +Double Andesite Slab= +Granite Stairs= +Granite Slab= +Double Granite Slab= +Diorite Stairs= +Diorite Slab= +Double Diorite Slab= +Cobblestone Stairs= +Cobblestone Slab= +Double Cobblestone Slab= +Mossy Cobblestone Stairs= +Mossy Cobblestone Slab= +Double Mossy Cobblestone Slab= +Brick Stairs= +Brick Slab= +Double Brick Slab= +Sandstone Stairs= +Sandstone Slab= +Double Sandstone Slab= +Smooth Sandstone Stairs= +Smooth Sandstone Slab= +Double Smooth Sandstone Slab= +Red Sandstone Stairs= +Red Sandstone Slab= +Double Red Sandstone Slab= +Smooth Red Sandstone Stairs= +Smooth Red Sandstone Slab= +Double Smooth Red Sandstone Slab= +Stone Bricks Stairs= +Stone Bricks Slab= +Double Stone Bricks Slab= +Quartz Stairs= +Quartz Slab= +Double Quartz Slab= +Smooth Quartz Stairs= +Smooth Quartz Slab= +Double Smooth Quartz Slab= +Nether Brick Stairs= +Nether Brick Slab= +Double Nether Brick Slab= +Red Nether Brick Stairs= +Red Nether Brick Slab= +Double Red Nether Brick Slab= +End Stone Brick Stairs= +End Stone Brick Slab= +Double End Stone Brick Slab= +Purpur Stairs= +Purpur Slab= +Double Purpur Slab= +Prismarine Stairs= +Prismarine Slab= +Double Prismarine Slab= +Prismarine Brick Stairs= +Prismarine Brick Slab= +Double Prismarine Brick Slab= +Dark Prismarine Stairs= +Dark Prismarine Slab= +Double Dark Prismarine Slab= +Polished Andesite Slab= +Double Polished Andesite Slab= +Polished Andesite Stairs= +Polished Granite Slab= +Double Polished Granite Slab= +Polished Granite Stairs= +Polished Diorite Slab= +Double Polished Diorite Slab= +Polished Diorite Stairs= +Mossy Stone Brick Stairs= +Mossy Stone Brick Slab= +Double Mossy Stone Brick Slab= diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 7082d74e..e545836e 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -3,166 +3,161 @@ -- slabs actually take slightly longer to be dug than their stair counterparts. -- Note sure if it is a good idea to preserve this oddity. -mcl_stairs.register_stair("wood", "mcl_core:wood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"default_wood.png"}, - "Oak Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("wood", "mcl_core:wood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"default_wood.png"}, - "Oak Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Oak Wood Slab") +local S = minetest.get_translator("mcl_stairs") -mcl_stairs.register_stair("junglewood", "mcl_core:junglewood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"default_junglewood.png"}, - "Jungle Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("junglewood", "mcl_core:junglewood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"default_junglewood.png"}, - "Jungle Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Jungle Wood Slab") +local woods = { + { "wood", "default_wood.png", S("Oak Wood Stairs"), S("Oak Wood Slab"), S("Double Oak Wood Slab") }, + { "junglewood", "default_junglewood.png", S("Jungle Wood Stairs"), S("Jungle Wood Slab"), S("Double Jungle Wood Slab") }, + { "acaciawood", "default_acacia_wood.png", S("Acacia Wood Stairs"), S("Acacia Wood Slab"), S("Double Acacia Wood Slab") }, + { "sprucewood", "mcl_core_planks_spruce.png", S("Spruce Wood Stairs"), S("Spruce Wood Slab"), S("Double Spruce Wood Slab") }, + { "birchwood", "mcl_core_planks_birch.png", S("Birch Wood Stairs"), S("Birch Wood Slab"), S("Double Birch Wood Slab") }, + { "darkwood", "mcl_core_planks_big_oak.png", S("Dark Oak Wood Stairs"), S("Dark Oak Wood Slab"), S("Double Dark Oak Wood Slab") }, +} -mcl_stairs.register_stair("acaciawood", "mcl_core:acaciawood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"default_acacia_wood.png"}, - "Acacia Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) +for w=1, #woods do + local wood = woods[w] + mcl_stairs.register_stair(wood[1], "mcl_core:"..wood[1], + {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + {wood[2]}, + wood[3], + mcl_sounds.node_sound_wood_defaults(), + 2, + "woodlike") + mcl_stairs.register_slab(wood[1], "mcl_core:"..wood[1], + {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + {wood[2]}, + wood[4], + mcl_sounds.node_sound_wood_defaults(), + 2, + wood[5]) +end -mcl_stairs.register_slab("acaciawood", "mcl_core:acaciawood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"default_acacia_wood.png"}, - "Acacia Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Acacia Wood Slab") +mcl_stairs.register_stair_and_slab_simple("stone_rough", "mcl_core:stone", S("Stone Stairs"), S("Stone Slab"), S("Double Stone Slab")) -mcl_stairs.register_stair("sprucewood", "mcl_core:sprucewood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"mcl_core_planks_spruce.png"}, - "Spruce Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("sprucewood", "mcl_core:sprucewood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"mcl_core_planks_spruce.png"}, - "Spruce Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Spruce Wood Slab") - -mcl_stairs.register_stair("birchwood", "mcl_core:birchwood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"mcl_core_planks_birch.png"}, - "Birch Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("birchwood", "mcl_core:birchwood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"mcl_core_planks_birch.png"}, - "Birch Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Birch Wood Slab") - -mcl_stairs.register_stair("darkwood", "mcl_core:darkwood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"mcl_core_planks_big_oak.png"}, - "Dark Oak Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("darkwood", "mcl_core:darkwood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"mcl_core_planks_big_oak.png"}, - "Dark Oak Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Dark Oak Wood Slab") - -mcl_stairs.register_slab("stone", "mcl_core:stone", +mcl_stairs.register_slab("stone", "mcl_core:stone_smooth", {pickaxey=1, material_stone=1}, {"mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_side.png"}, - "Stone Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Stone Slab") + S("Polished Stone Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Polished Stone Slab")) -mcl_stairs.register_stair_and_slab_simple("cobble", "mcl_core:cobble", "Cobblestone Stairs", "Cobblestone Slab", "Double Cobblestone Slab") +mcl_stairs.register_stair_and_slab_simple("andesite", "mcl_core:andesite", S("Andesite Stairs"), S("Andesite Slab"), S("Double Andesite Slab")) +mcl_stairs.register_stair_and_slab_simple("granite", "mcl_core:granite", S("Granite Stairs"), S("Granite Slab"), S("Double Granite Slab")) +mcl_stairs.register_stair_and_slab_simple("diorite", "mcl_core:diorite", S("Diorite Stairs"), S("Diorite Slab"), S("Double Diorite Slab")) -mcl_stairs.register_stair_and_slab_simple("brick_block", "mcl_core:brick_block", "Brick Stairs", "Brick Slab", "Double Brick Slab") +mcl_stairs.register_stair_and_slab_simple("cobble", "mcl_core:cobble", S("Cobblestone Stairs"), S("Cobblestone Slab"), S("Double Cobblestone Slab")) +mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", S("Mossy Cobblestone Stairs"), S("Mossy Cobblestone Slab"), S("Double Mossy Cobblestone Slab")) + +mcl_stairs.register_stair_and_slab_simple("brick_block", "mcl_core:brick_block", S("Brick Stairs"), S("Brick Slab"), S("Double Brick Slab")) -mcl_stairs.register_stair("sandstone", "group:sandstone", +mcl_stairs.register_stair("sandstone", "group:normal_sandstone", {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, - "Sandstone Stairs", + S("Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, nil, "mcl_core:sandstone") -mcl_stairs.register_slab("sandstone", "group:sandstone", +mcl_stairs.register_slab("sandstone", "group:normal_sandstone", {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, - "Sandstone Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Sandstone Slab", "mcl_core:sandstone") + S("Sandstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Sandstone Slab"), "mcl_core:sandstone") +mcl_stairs.register_stair_and_slab_simple("sandstonesmooth2", "mcl_core:sandstonesmooth2", S("Smooth Sandstone Stairs"), S("Smooth Sandstone Slab"), S("Double Smooth Sandstone Slab")) -mcl_stairs.register_stair("redsandstone", "group:redsandstone", +mcl_stairs.register_stair("redsandstone", "group:red_sandstone", {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, - "Red Sandstone Stairs", + S("Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, nil, "mcl_core:redsandstone") -mcl_stairs.register_slab("redsandstone", "group:redsandstone", +mcl_stairs.register_slab("redsandstone", "group:red_sandstone", {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, - "Red Sandstone Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Red Sandstone Slab", "mcl_core:redsandstone") + S("Red Sandstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Red Sandstone Slab"), "mcl_core:redsandstone") +mcl_stairs.register_stair_and_slab_simple("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", S("Smooth Red Sandstone Stairs"), S("Smooth Red Sandstone Slab"), S("Double Smooth Red Sandstone Slab")) -mcl_stairs.register_stair("stonebrick", "group:stonebrick", +-- Intentionally not group:stonebrick because of mclx_stairs +mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", {pickaxey=1, material_stone=1}, {"default_stone_brick.png"}, - "Stone Bricks Stairs", + S("Stone Bricks Stairs"), mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrick") -mcl_stairs.register_slab("stonebrick", "group:stonebrick", +mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", {pickaxey=1, material_stone=1}, {"default_stone_brick.png"}, - "Stone Bricks Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Stone Bricks Slab", "mcl_core:stonebrick") + S("Stone Bricks Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Stone Bricks Slab"), "mcl_core:stonebrick") mcl_stairs.register_stair("quartzblock", "group:quartz_block", {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - "Quartz Stairs", + S("Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, nil, "mcl_nether:quartz_block") mcl_stairs.register_slab("quartzblock", "group:quartz_block", {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - "Quartz Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Quarzt Slab", "mcl_nether:quartz_block") + S("Quartz Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Quartz Slab"), "mcl_nether:quartz_block") + +mcl_stairs.register_stair_and_slab_simple("quartz_smooth", "mcl_nether:quartz_smooth", S("Smooth Quartz Stairs"), S("Smooth Quartz Slab"), S("Double Smooth Quartz Slab")) mcl_stairs.register_stair_and_slab("nether_brick", "mcl_nether:nether_brick", {pickaxey=1, material_stone=1}, {"mcl_nether_nether_brick.png"}, - "Nether Brick Stairs", - "Nether Brick Slab", + S("Nether Brick Stairs"), + S("Nether Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 2, - "Double Nether Brick Slab") + S("Double Nether Brick Slab")) +mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_brick", + {pickaxey=1, material_stone=1}, + {"mcl_nether_red_nether_brick.png"}, + S("Red Nether Brick Stairs"), + S("Red Nether Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), + 2, + S("Double Red Nether Brick Slab")) -mcl_stairs.register_stair("purpur_block", "mcl_end:purpur_block", +mcl_stairs.register_stair_and_slab_simple("end_bricks", "mcl_end:end_bricks", S("End Stone Brick Stairs"), S("End Stone Brick Slab"), S("Double End Stone Brick Slab")) + +mcl_stairs.register_stair("purpur_block", "group:purpur_block", {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, - "Purpur Stairs", + S("Purpur Stairs"), mcl_sounds.node_sound_stone_defaults(), 1.5) -mcl_stairs.register_slab("purpur_block", "mcl_end:purpur_block", +mcl_stairs.register_slab("purpur_block", "group:purpur_block", {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, - "Purpur Slab", + S("Purpur Slab"), mcl_sounds.node_sound_stone_defaults(), 2, - "Double Purpur Slab") + S("Double Purpur Slab")) + +mcl_stairs.register_stair_and_slab_simple("prismarine", "mcl_ocean:prismarine", S("Prismarine Stairs"), S("Prismarine Slab"), S("Double Prismarine Slab")) + +mcl_stairs.register_stair_and_slab_simple("prismarine_brick", "mcl_ocean:prismarine_brick", S("Prismarine Brick Stairs"), S("Prismarine Brick Slab"), S("Double Prismarine Brick Slab")) +mcl_stairs.register_stair_and_slab_simple("prismarine_dark", "mcl_ocean:prismarine_dark", S("Dark Prismarine Stairs"), S("Dark Prismarine Slab"), S("Double Dark Prismarine Slab")) + +mcl_stairs.register_slab("andesite_smooth", "mcl_core:andesite_smooth", {pickaxey=1}, {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Slab"), nil, nil, S("Double Polished Andesite Slab")) +mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", {pickaxey=1}, {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Stairs"), nil, nil, "woodlike") + +mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", {pickaxey=1}, {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Slab"), nil, nil, S("Double Polished Granite Slab")) +mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", {pickaxey=1}, {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Stairs"), nil, nil, "woodlike") + +mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", {pickaxey=1}, {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Slab"), nil, nil, S("Double Polished Diorite Slab")) +mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", {pickaxey=1}, {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Stairs"), nil, nil, "woodlike") + +mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", + {pickaxey=1}, + {"mcl_core_stonebrick_mossy.png"}, + S("Mossy Stone Brick Stairs"), + mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrickmossy") + +mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", + {pickaxey=1}, + {"mcl_core_stonebrick_mossy.png"}, + S("Mossy Stone Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Mossy Stone Brick Slab"), "mcl_core:stonebrickmossy") + + + diff --git a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png b/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png index 8e5a355b..8570ff38 100644 Binary files a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png and b/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png differ diff --git a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_turntexture.png b/mods/ITEMS/mcl_stairs/textures/mcl_stairs_turntexture.png new file mode 100644 index 00000000..d59ff892 Binary files /dev/null and b/mods/ITEMS/mcl_stairs/textures/mcl_stairs_turntexture.png differ diff --git a/mods/ITEMS/mcl_throwing/README.md b/mods/ITEMS/mcl_throwing/README.md new file mode 100644 index 00000000..c91a537e --- /dev/null +++ b/mods/ITEMS/mcl_throwing/README.md @@ -0,0 +1,26 @@ +# `mcl_throwing` + +It's a MineClone 2 mod containing throwable items like snowballs. + +## License of code + +- MIT License + +## License of media + +- `mcl_throwing_snowball_impact_soft.ogg`: + - License: CC BY 3.0 + - Author: YleArkisto (freesound.org) + - Source: + - Original title: `sfx_snowball_hit-03.wav` (file was edited) +- `mcl_throwing_snowball_impact_hard.ogg`: + - License: CC0 + - Author: Julien Matthey (freesound.org) + - Source: + - Original title: `JM_IMPACT_01c - Snow on cement.wav` (file was edited) +- `mcl_throwing_egg_impact.ogg`: + - License: CC0 + - Author: dav0r (freesound.org) + - Source: + - Original title: `d0_step_on_egg_04` (file was edited) +- Everything else: See MineClone 2 license infos diff --git a/mods/ITEMS/mcl_throwing/README.txt b/mods/ITEMS/mcl_throwing/README.txt deleted file mode 100644 index 06894cd2..00000000 --- a/mods/ITEMS/mcl_throwing/README.txt +++ /dev/null @@ -1,50 +0,0 @@ -=== THROWING-MOD for MINETEST-C55 === -by PilzAdam - -Inroduction: -This mod adds bows and arrows to Minetest. - -How to install: -Unzip the archive an place it in minetest-base-directory/mods/minetest/ -if you have a windows client or a linux run-in-place client. If you have -a linux system-wide instalation place it in ~/.minetest/mods/minetest/. -If you want to install this mod only in one world create the folder -worldmods/ in your worlddirectory. -For further information or help see: -http://wiki.minetest.com/wiki/Installing_Mods - -How to use the mod: -Craft a bow with strings: - stick string -stick string - stick string - -Craft arrows with: -flint -stick -paper - -Select the bow and shoot with left mouse click. Every shoot will take 1 -arrow from your inventory and wears out the bow (you have around 385 -shots). - -License: -This mod was originally published by Jeija. -Sourcecode: WTFPL (see below) - -See also: -http://minetest.net/ - - 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. diff --git a/mods/ITEMS/mcl_throwing/arrow.lua b/mods/ITEMS/mcl_throwing/arrow.lua deleted file mode 100644 index 0bf12375..00000000 --- a/mods/ITEMS/mcl_throwing/arrow.lua +++ /dev/null @@ -1,142 +0,0 @@ -local mod_mcl_hunger = minetest.get_modpath("mcl_hunger") -local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") - -minetest.register_craftitem("mcl_throwing:arrow", { - description = "Arrow", - _doc_items_longdesc = "Arrows are ammunition for bows and dispensers.", - _doc_items_usagehelp = "To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory.", - inventory_image = "mcl_throwing_arrow_inv.png", - groups = { ammo=1, ammo_bow=1 }, -}) - -minetest.register_node("mcl_throwing:arrow_box", { - drawtype = "nodebox", - is_ground_content = false, - node_box = { - type = "fixed", - fixed = { - -- Shaft - {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, - --Spitze - {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, - {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, - --Federn - {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, - {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, - {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, - {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, - - {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, - {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, - {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, - {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, - } - }, - tiles = {"mcl_throwing_arrow.png^[transformFX", "mcl_throwing_arrow.png^[transformFX", "mcl_throwing_arrow_back.png", "mcl_throwing_arrow_front.png", "mcl_throwing_arrow.png", "mcl_throwing_arrow.png^[transformFX"}, - groups = {not_in_creative_inventory=1}, -}) - -local THROWING_ARROW_ENTITY={ - physical = false, - visual = "wielditem", - visual_size = {x=0.4, y=0.4}, - textures = {"mcl_throwing:arrow_box"}, - collisionbox = {0,0,0,0,0,0}, - - _lastpos={}, - _startpos=nil, - _damage=1, -- Damage on impact - _shooter=nil, -- ObjectRef of player or mob who shot it -} - -THROWING_ARROW_ENTITY.on_step = function(self, dtime) - local pos = self.object:getpos() - local node = minetest.get_node(pos) - - -- Check for object collision. Done every tick (hopefully this is not too stressing) - do - local objs = minetest.get_objects_inside_radius(pos, 2) - local closest_object - local closest_distance - local ok = false - - -- Iterate through all objects and remember the closest attackable object - for k, obj in pairs(objs) do - -- Arrows can only damage players and mobs - if obj ~= self._shooter and obj:is_player() then - ok = true - elseif obj:get_luaentity() ~= nil then - if obj ~= self._shooter and obj:get_luaentity()._cmi_is_mob then - ok = true - end - end - - if ok then - local dist = vector.distance(pos, obj:getpos()) - if not closest_object or not closest_distance then - closest_object = obj - closest_distance = dist - elseif dist < closest_distance then - closest_object = obj - closest_distance = dist - end - end - end - - -- If an attackable object was found, we will damage the closest one only - if closest_object ~= nil then - local obj = closest_object - local is_player = obj:is_player() - local lua = obj:get_luaentity() - if obj ~= self._shooter and (is_player or (lua and lua._cmi_is_mob)) then - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=self._damage}, - }, nil) - if mod_mcl_hunger and is_player then - mcl_hunger.exhaust(obj:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end - - if lua then - local entity_name = lua.name - -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away - -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> - -- TODO: This achievement should be given for the kill, not just a hit - if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then - if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then - awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") - end - end - end - self.object:remove() - end - end - end - - -- Check for node collision - if self._lastpos.x~=nil then - local def = minetest.registered_nodes[node.name] - if (def and def.walkable) or not def then - if not minetest.settings:get_bool("creative_mode") then - minetest.add_item(self._lastpos, 'mcl_throwing:arrow') - end - self.object:remove() - end - end - - -- Update internal variable - self._lastpos={x=pos.x, y=pos.y, z=pos.z} -end - -minetest.register_entity("mcl_throwing:arrow_entity", THROWING_ARROW_ENTITY) - -if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then - minetest.register_craft({ - output = 'mcl_throwing:arrow 4', - recipe = { - {'mcl_core:flint'}, - {'mcl_core:stick'}, - {'mcl_mobitems:feather'} - } - }) -end diff --git a/mods/ITEMS/mcl_throwing/depends.txt b/mods/ITEMS/mcl_throwing/depends.txt index 32b32db0..2787220e 100644 --- a/mods/ITEMS/mcl_throwing/depends.txt +++ b/mods/ITEMS/mcl_throwing/depends.txt @@ -1,6 +1,4 @@ -awards? -mcl_achievements? -mcl_hunger? mcl_core? mcl_mobitems? doc? +mcl_fishing diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index f5841e77..e588363f 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -1,226 +1,455 @@ mcl_throwing = {} -dofile(minetest.get_modpath("mcl_throwing").."/arrow.lua") -dofile(minetest.get_modpath("mcl_throwing").."/throwable.lua") +local S = minetest.get_translator("mcl_throwing") +local mod_death_messages = minetest.get_modpath("mcl_death_messages") +local mod_fishing = minetest.get_modpath("mcl_fishing") -local arrows = { - ["mcl_throwing:arrow"] = "mcl_throwing:arrow_entity", +-- +-- Snowballs and other throwable items +-- + +local GRAVITY = tonumber(minetest.settings:get("movement_gravity")) + +local entity_mapping = { + ["mcl_throwing:flying_bobber"] = "mcl_throwing:flying_bobber_entity", + ["mcl_throwing:snowball"] = "mcl_throwing:snowball_entity", + ["mcl_throwing:egg"] = "mcl_throwing:egg_entity", + ["mcl_throwing:ender_pearl"] = "mcl_throwing:ender_pearl_entity", } -local GRAVITY = 9.81 +local velocities = { + ["mcl_throwing:flying_bobber_entity"] = 5, + ["mcl_throwing:snowball_entity"] = 22, + ["mcl_throwing:egg_entity"] = 22, + ["mcl_throwing:ender_pearl_entity"] = 22, +} -local bow_durability = 385 +mcl_throwing.throw = function(throw_item, pos, dir, velocity, thrower) + if velocity == nil then + velocity = velocities[throw_item] + end + if velocity == nil then + velocity = 22 + end -mcl_throwing.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damage) - local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrows[arrow_item]) - if power == nil then - power = 19 - end - if damage == nil then - damage = 3 - end - obj:setvelocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) - obj:setacceleration({x=dir.x*-3, y=-GRAVITY, z=dir.z*-3}) - obj:setyaw(yaw-math.pi/2) - local le = obj:get_luaentity() - le._shooter = shooter - le._damage = damage - le._startpos = pos - minetest.sound_play("mcl_throwing_bow_shoot", {pos=pos}) - if shooter ~= nil then - if obj:get_luaentity().player == "" then - obj:get_luaentity().player = shooter - end - obj:get_luaentity().node = shooter:get_inventory():get_stack("main", 1):get_name() + local itemstring = ItemStack(throw_item):get_name() + local obj = minetest.add_entity(pos, entity_mapping[itemstring]) + obj:set_velocity({x=dir.x*velocity, y=dir.y*velocity, z=dir.z*velocity}) + obj:set_acceleration({x=dir.x*-3, y=-GRAVITY, z=dir.z*-3}) + if thrower then + obj:get_luaentity()._thrower = thrower end return obj end -local get_arrow = function(player) - local inv = player:get_inventory() - local arrow_stack, arrow_stack_id - for i=1, inv:get_size("main") do - local it = inv:get_stack("main", i) - if not it:is_empty() and minetest.get_item_group(it:get_name(), "ammo_bow") ~= 0 then - arrow_stack = it - arrow_stack_id = i - break +-- Throw item +local player_throw_function = function(entity_name, velocity) + local func = function(item, player, pointed_thing) + local playerpos = player:get_pos() + local dir = player:get_look_dir() + local obj = mcl_throwing.throw(item, {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, velocity, player:get_player_name()) + if not minetest.settings:get_bool("creative_mode") then + item:take_item() end + return item end - return arrow_stack, arrow_stack_id + return func end -local player_shoot_arrow = function(itemstack, player, power, damage) - local arrow_stack, arrow_stack_id = get_arrow(player) - local arrow_itemstring - if not minetest.settings:get_bool("creative_mode") then - if not arrow_stack then - return false - end - arrow_itemstring = arrow_stack:get_name() - arrow_stack:take_item() - local inv = player:get_inventory() - inv:set_stack("main", arrow_stack_id, arrow_stack) - end - local playerpos = player:getpos() - local dir = player:get_look_dir() - local yaw = player:get_look_horizontal() - - if not arrow_itemstring then - arrow_itemstring = "mcl_throwing:arrow" - end - mcl_throwing.shoot_arrow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage) - return true +local dispense_function = function(stack, dispenserpos, droppos, dropnode, dropdir) + -- Launch throwable item + local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) + mcl_throwing.throw(stack:get_name(), shootpos, dropdir) end -local powerup_function = function(nextbow) - return function(itemstack, placer, pointed_thing) - -- Use pointed node's on_rightclick function first, if present - if pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) - if placer and not placer: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, placer, itemstack) or itemstack +-- Staticdata handling because objects may want to be reloaded +local get_staticdata = function(self) + local thrower + -- Only save thrower if it's a player name + if type(self._thrower) == "string" then + thrower = self._thrower + end + local data = { + _lastpos = self._lastpos, + _thrower = thrower, + } + return minetest.serialize(data) +end + +local on_activate = function(self, staticdata, dtime_s) + local data = minetest.deserialize(staticdata) + if data then + self._lastpos = data._lastpos + self._thrower = data._thrower + end +end + +-- The snowball entity +local snowball_ENTITY={ + physical = false, + timer=0, + textures = {"mcl_throwing_snowball.png"}, + visual_size = {x=0.5, y=0.5}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + + get_staticdata = get_staticdata, + on_activate = on_activate, + _thrower = nil, + + _lastpos={}, +} +local egg_ENTITY={ + physical = false, + timer=0, + textures = {"mcl_throwing_egg.png"}, + visual_size = {x=0.45, y=0.45}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + + get_staticdata = get_staticdata, + on_activate = on_activate, + _thrower = nil, + + _lastpos={}, +} +-- Ender pearl entity +local pearl_ENTITY={ + physical = false, + timer=0, + textures = {"mcl_throwing_ender_pearl.png"}, + visual_size = {x=0.9, y=0.9}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + + get_staticdata = get_staticdata, + on_activate = on_activate, + + _lastpos={}, + _thrower = nil, -- Player ObjectRef of the player who threw the ender pearl +} + +local flying_bobber_ENTITY={ + physical = false, + timer=0, + textures = {"mcl_fishing_bobber.png"}, --FIXME: Replace with correct texture. + visual_size = {x=0.5, y=0.5}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + + get_staticdata = get_staticdata, + on_activate = on_activate, + + _lastpos={}, + _thrower = nil, + objtype="fishing", +} + +local check_object_hit = function(self, pos, dmg) + for _,object in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do + + local entity = object:get_luaentity() + + if entity + and entity.name ~= self.object:get_luaentity().name then + + if object:is_player() and self._thrower ~= object:get_player_name() then + -- TODO: Deal knockback + self.object:remove() + return true + elseif entity._cmi_is_mob == true and (self._thrower ~= object) then + -- FIXME: Knockback is broken + object:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = dmg, + }, nil) + return true + end + end + end + return false +end + +local snowball_particles = function(pos, vel) + local vel = vector.normalize(vector.multiply(vel, -1)) + minetest.add_particlespawner({ + amount = 20, + time = 0.001, + minpos = pos, + maxpos = pos, + minvel = vector.add({x=-2, y=3, z=-2}, vel), + maxvel = vector.add({x=2, y=5, z=2}, vel), + minacc = {x=0, y=-9.81, z=0}, + maxacc = {x=0, y=-9.81, z=0}, + minexptime = 1, + maxexptime = 3, + minsize = 0.7, + maxsize = 0.7, + collisiondetection = true, + collision_removal = true, + object_collision = false, + texture = "weather_pack_snow_snowflake"..math.random(1,2)..".png", + }) +end + +-- Snowball on_step()--> called when snowball is moving. +local snowball_on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + + -- Destroy when hitting a solid node + if self._lastpos.x~=nil then + if (def and def.walkable) or not def then + minetest.sound_play("mcl_throwing_snowball_impact_hard", { pos = self.object:get_pos(), max_hear_distance=16, gain=0.7 }, true) + snowball_particles(self._lastpos, self.object:get_velocity()) + self.object:remove() + return + end + end + + if check_object_hit(self, pos, {snowball_vulnerable = 3}) then + minetest.sound_play("mcl_throwing_snowball_impact_soft", { pos = self.object:get_pos(), max_hear_distance=16, gain=0.7 }, true) + snowball_particles(pos, self.object:get_velocity()) + self.object:remove() + return + end + + self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set _lastpos-->Node will be added at last pos outside the node +end + +-- Movement function of egg +local egg_on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + + -- Destroy when hitting a solid node with chance to spawn chicks + if self._lastpos.x~=nil then + if (def and def.walkable) or not def then + -- 1/8 chance to spawn a chick + -- FIXME: Chicks have a quite good chance to spawn in walls + local r = math.random(1,8) + + -- Turn given object into a child + local make_child= function(object) + local ent = object:get_luaentity() + object:set_properties({ + visual_size = { x = ent.base_size.x/2, y = ent.base_size.y/2 }, + collisionbox = { + ent.base_colbox[1]/2, + ent.base_colbox[2]/2, + ent.base_colbox[3]/2, + ent.base_colbox[4]/2, + ent.base_colbox[5]/2, + ent.base_colbox[6]/2, + } + }) + ent.child = true + end + if r == 1 then + make_child(minetest.add_entity(self._lastpos, "mobs_mc:chicken")) + + -- BONUS ROUND: 1/32 chance to spawn 3 additional chicks + local r = math.random(1,32) + if r == 1 then + local offsets = { + { x=0.7, y=0, z=0 }, + { x=-0.7, y=0, z=-0.7 }, + { x=-0.7, y=0, z=0.7 }, + } + for o=1, 3 do + local pos = vector.add(self._lastpos, offsets[o]) + make_child(minetest.add_entity(pos, "mobs_mc:chicken")) + end end end + minetest.sound_play("mcl_throwing_egg_impact", { pos = self.object:get_pos(), max_hear_distance=10, gain=0.5 }, true) + self.object:remove() + return end - - -- Check for arrow or Creative Mode - if minetest.settings:get_bool("creative_mode") or get_arrow(placer) ~= nil then - local wear = itemstack:get_wear() - itemstack:replace(nextbow) - itemstack:set_wear(wear) - end - return itemstack end + + -- Destroy when hitting a mob or player (no chick spawning) + if check_object_hit(self, pos) then + minetest.sound_play("mcl_throwing_egg_impact", { pos = self.object:get_pos(), max_hear_distance=10, gain=0.5 }, true) + self.object:remove() + return + end + + self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node end -minetest.register_tool("mcl_throwing:bow", { - description = "Bow", - _doc_items_longdesc = "Bows are ranged weapons to shoot arrows at your foes.", - _doc_items_usagehelp = [[To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Rightclick one to three times to charge the bow. Leftclick to shoot. +-- Movement function of ender pearl +local pearl_on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:get_pos() + pos.y = math.floor(pos.y) + local node = minetest.get_node(pos) + local nn = node.name + local def = minetest.registered_nodes[node.name] -The arrow speed and damage increase with the charge level: -• Low charge: 1 damage -• Medium charge: 2 damage -• High charge: 4-5 damage (20% chance for 5 damage)]], - _doc_items_durability = bow_durability, - inventory_image = "mcl_throwing_bow.png", - stack_max = 1, - -- Trick to disable melee damage to entities. - -- Range not set to 0 (unlike the others) so it can be placed into item frames - range = 1, - -- Trick to disable digging as well - on_use = function() end, - on_place = powerup_function("mcl_throwing:bow_0"), - on_secondary_use = powerup_function("mcl_throwing:bow_0"), - groups = {weapon=1,weapon_ranged=1}, -}) + -- Destroy when hitting a solid node + if self._lastpos.x~=nil then + local walkable = (def and def.walkable) + + -- No teleport for hitting ignore for now. Otherwise the player could get stuck. + -- FIXME: This also means the player loses an ender pearl for throwing into unloaded areas + if node.name == "ignore" then + self.object:remove() + -- Activate when hitting a solid node or a plant + elseif walkable or nn == "mcl_core:vine" or nn == "mcl_core:deadbush" or minetest.get_item_group(nn, "flower") ~= 0 or minetest.get_item_group(nn, "sapling") ~= 0 or minetest.get_item_group(nn, "plant") ~= 0 or minetest.get_item_group(nn, "mushroom") ~= 0 or not def then + local player = minetest.get_player_by_name(self._thrower) + if player then + -- Teleport and hurt player + + -- First determine good teleport position + local dir = {x=0, y=0, z=0} + + local v = self.object:get_velocity() + if walkable then + local vc = table.copy(v) -- vector for calculating + -- Node is walkable, we have to find a place somewhere outside of that node + vc = vector.normalize(vc) + + -- Zero-out the two axes with a lower absolute value than + -- the axis with the strongest force + local lv, ld + lv, ld = math.abs(vc.y), "y" + if math.abs(vc.x) > lv then + lv, ld = math.abs(vc.x), "x" + end + if math.abs(vc.z) > lv then + lv, ld = math.abs(vc.z), "z" + end + if ld ~= "x" then vc.x = 0 end + if ld ~= "y" then vc.y = 0 end + if ld ~= "z" then vc.z = 0 end + + -- Final tweaks to the teleporting pos, based on direction + -- Impact from the side + dir.x = vc.x * -1 + dir.z = vc.z * -1 + + -- Special case: top or bottom of node + if vc.y > 0 then + -- We need more space when impact is from below + dir.y = -2.3 + elseif vc.y < 0 then + -- Standing on top + dir.y = 0.5 + end + end + -- If node was not walkable, no modification to pos is made. + + -- Final teleportation position + local telepos = vector.add(pos, dir) + local telenode = minetest.get_node(telepos) + + --[[ It may be possible that telepos is walkable due to the algorithm. + Especially when the ender pearl is faster horizontally than vertical. + This applies final fixing, just to be sure we're not in a walkable node ]] + if not minetest.registered_nodes[telenode.name] or minetest.registered_nodes[telenode.name].walkable then + if v.y < 0 then + telepos.y = telepos.y + 0.5 + else + telepos.y = telepos.y - 2.3 + end + end + + local oldpos = player:get_pos() + -- Teleport and hurt player + player:set_pos(telepos) + player:set_hp(player:get_hp() - 5, { type = "fall", from = "mod" }) + + -- 5% chance to spawn endermite at the player's origin + local r = math.random(1,20) + if r == 1 then + minetest.add_entity(oldpos, "mobs_mc:endermite") + end -minetest.register_tool("mcl_throwing:bow_0", { - description = "Bow", - _doc_items_create_entry = false, - inventory_image = "mcl_throwing_bow_0.png", - stack_max = 1, - range = 0, -- Pointing range to 0 to prevent punching with bow :D - groups = {not_in_creative_inventory=1, not_in_craft_guide=1}, - on_place = powerup_function("mcl_throwing:bow_1"), - on_secondary_use = powerup_function("mcl_throwing:bow_1"), - on_use = function(itemstack, user, pointed_thing) - local wear = itemstack:get_wear() - itemstack:replace("mcl_throwing:bow") - itemstack:set_wear(wear) - if player_shoot_arrow(itemstack, user, 4, 1) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/bow_durability) end + self.object:remove() + return end - return itemstack - end, -}) - -minetest.register_tool("mcl_throwing:bow_1", { - description = "Bow", - _doc_items_create_entry = false, - inventory_image = "mcl_throwing_bow_1.png", - stack_max = 1, - range = 0, - groups = {not_in_creative_inventory=1, not_in_craft_guide=1}, - on_place = powerup_function("mcl_throwing:bow_2"), - on_secondary_use = powerup_function("mcl_throwing:bow_2"), - on_use = function(itemstack, user, pointed_thing) - local wear = itemstack:get_wear() - itemstack:replace("mcl_throwing:bow") - itemstack:set_wear(wear) - if player_shoot_arrow(itemstack, user, 16, 2) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/bow_durability) - end - end - return itemstack - end, -}) - -minetest.register_tool("mcl_throwing:bow_2", { - description = "Bow", - _doc_items_create_entry = false, - inventory_image = "mcl_throwing_bow_2.png", - stack_max = 1, - range = 0, - groups = {not_in_creative_inventory=1, not_in_craft_guide=1}, - on_use = function(itemstack, user, pointed_thing) - local wear = itemstack:get_wear() - itemstack:replace("mcl_throwing:bow") - itemstack:set_wear(wear) - local r = math.random(1,5) - local damage - -- Damage and range have been nerfed because the arrow charges very quickly - -- TODO: Use Minecraft damage and range (9-10 @ ca. 53 m/s) - if r == 1 then - -- 20% chance to do more damage - damage = 5 - else - damage = 4 - end - if player_shoot_arrow(itemstack, user, 26, damage) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/bow_durability) - end - end - return itemstack - end, -}) - -if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then - minetest.register_craft({ - output = 'mcl_throwing:bow', - recipe = { - {'', 'mcl_core:stick', 'mcl_mobitems:string'}, - {'mcl_core:stick', '', 'mcl_mobitems:string'}, - {'', 'mcl_core:stick', 'mcl_mobitems:string'}, - } - }) - minetest.register_craft({ - output = 'mcl_throwing:bow', - recipe = { - {'mcl_mobitems:string', 'mcl_core:stick', ''}, - {'mcl_mobitems:string', '', 'mcl_core:stick'}, - {'mcl_mobitems:string', 'mcl_core:stick', ''}, - } - }) + end + self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node end -minetest.register_craft({ - type = "fuel", - recipe = "mcl_throwing:bow", - burntime = 15, -}) +-- Movement function of flying bobber +local flying_bobber_on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + --local player = minetest.get_player_by_name(self._thrower) --- Add entry aliases for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("tools", "mcl_throwing:bow", "tools", "mcl_throwing:bow_0") - doc.add_entry_alias("tools", "mcl_throwing:bow", "tools", "mcl_throwing:bow_1") - doc.add_entry_alias("tools", "mcl_throwing:bow", "tools", "mcl_throwing:bow_2") + -- Destroy when hitting a solid node + if self._lastpos.x~=nil then + if (def and (def.walkable or def.liquidtype == "flowing" or def.liquidtype == "source")) or not def then + local make_child= function(object) + local ent = object:get_luaentity() + ent.player = self._thrower + ent.child = true + end + make_child(minetest.add_entity(self._lastpos, "mcl_fishing:bobber_entity")) + self.object:remove() + return + end + end + self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node end +snowball_ENTITY.on_step = snowball_on_step +egg_ENTITY.on_step = egg_on_step +pearl_ENTITY.on_step = pearl_on_step +flying_bobber_ENTITY.on_step = flying_bobber_on_step + +minetest.register_entity("mcl_throwing:snowball_entity", snowball_ENTITY) +minetest.register_entity("mcl_throwing:egg_entity", egg_ENTITY) +minetest.register_entity("mcl_throwing:ender_pearl_entity", pearl_ENTITY) +minetest.register_entity("mcl_throwing:flying_bobber_entity", flying_bobber_ENTITY) + +local how_to_throw = S("Use the punch key to throw.") + +-- Snowball +minetest.register_craftitem("mcl_throwing:snowball", { + description = S("Snowball"), + _tt_help = S("Throwable"), + _doc_items_longdesc = S("Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing."), + _doc_items_usagehelp = how_to_throw, + inventory_image = "mcl_throwing_snowball.png", + stack_max = 16, + groups = { weapon_ranged = 1 }, + on_use = player_throw_function("mcl_throwing:snowball_entity"), + _on_dispense = dispense_function, +}) + +-- Egg +minetest.register_craftitem("mcl_throwing:egg", { + description = S("Egg"), + _tt_help = S("Throwable").."\n"..S("Chance to hatch chicks when broken"), + _doc_items_longdesc = S("Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg."), + _doc_items_usagehelp = how_to_throw, + inventory_image = "mcl_throwing_egg.png", + stack_max = 16, + on_use = player_throw_function("mcl_throwing:egg_entity"), + _on_dispense = dispense_function, + groups = { craftitem = 1 }, +}) + +-- Ender Pearl +minetest.register_craftitem("mcl_throwing:ender_pearl", { + description = S("Ender Pearl"), + _tt_help = S("Throwable").."\n"..minetest.colorize("#FFFF00", S("Teleports you on impact for cost of 5 HP")), + _doc_items_longdesc = S("An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points."), + _doc_items_usagehelp = how_to_throw, + wield_image = "mcl_throwing_ender_pearl.png", + inventory_image = "mcl_throwing_ender_pearl.png", + stack_max = 16, + on_use = player_throw_function("mcl_throwing:ender_pearl_entity"), + groups = { transport = 1 }, +}) diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr new file mode 100644 index 00000000..f896c2ed --- /dev/null +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_throwing +@1 used the ender pearl too often.=@1 benutzte die Enderperle zu oft. +Use the punch key to throw.=Benutzen Sie die Schlagtaste zum Werfen. +Snowball=Schneeball +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Schneebälle können geworfen werden oder zum Spaß aus einem Werfer abgefeuert werden. Bei einem Treffer mit einem Schneeball passiert nichts. +Egg=Ei +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Eier können geworfen werden oder aus einem Werfer abgefeuert werden. Sie zerbrechen beim Einschlag. Mit etwas Glück werden aus dem Ei eines oder sogar 4 Küken hinausfallen. +Ender Pearl=Enderperle +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Eine Enderperle ist ein Gegenstand, der zur Teleportation benutzt werden kann auf Kosten der Gesundheit. Sie kann geworfen werden und teleportiert den Werfer zur Einschlagsstelle, wenn sie einen Block oder eine Pflanze trifft. Jede Teleportation verletzt den Werfer um 5 Trefferpunkte. +Throwable=Wurfgeschoss +Chance to hatch chicks when broken=Chance, dass beim Aufprall Küken schlüpfen +Teleports you on impact for cost of 5 HP=Teleportiert Sie beim Aufprall, kostet 5 TP diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.es.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.es.tr new file mode 100644 index 00000000..35d0bbd6 --- /dev/null +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.es.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_throwing +@1 used the ender pearl too often.=@1 usó la perla de ender con demasiada frecuencia. +Use the punch key to throw.=Usa la tecla de golpe para lanzar. +Snowball=Bola de nieve +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Las bolas de nieve se pueden lanzar o lanzar desde un dispensador por diversión. Golpear algo con una bola de nieve no hace nada. +Egg=Huevo +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Los huevos pueden ser arrojados o lanzados desde un dispensador y se rompen al impactar. Hay una pequeña posibilidad de que 1 o incluso 4 pollitos salgan del huevo. +Ender Pearl=Perla de ender +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Una perla ender es un artículo que se puede usar para teletransportarse a costa de la salud. Se puede lanzar y teletransportar al lanzador a su ubicación de impacto cuando golpea un bloque sólido o una planta. Cada teletransportación perjudica al usuario por 5 puntos de daño. diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.fr.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.fr.tr new file mode 100644 index 00000000..bd78c031 --- /dev/null +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.fr.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_throwing +@1 used the ender pearl too often.=@1 a utilisé la perle ender trop souvent. +Use the punch key to throw.=Utilisez la touche frapper pour lancer. +Snowball=Boule de Neige +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Les boules de neige peuvent être lancées ou lancées à partir d'un distributeur pour le plaisir. Toucher quelque chose avec une boule de neige ne fait rien. +Egg=Oeuf +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Les œufs peuvent être jetés ou lancés à partir d'un distributeur et se cassent à l'impact. Il y a une petite chance que 1 ou même 4 poussins sortent de l'oeuf. +Ender Pearl=Ender Perle +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Une Perle d'Ender est un objet qui peut être utilisé pour la téléportation au détriment de la santé. Il peut être lancé et téléporter le lanceur vers son emplacement d'impact lorsqu'il frappe un bloc solide ou une plante. Chaque téléportation blesse l'utilisateur de 5 points de vie. +Throwable=Jetable +Chance to hatch chicks when broken=Possibilité d'éclosion de poussins lorsqu'ils sont brisés +Teleports you on impact for cost of 5 HP=Vous téléporte sur l'impact pour un coût de 5 PV diff --git a/mods/ITEMS/mcl_throwing/locale/template.txt b/mods/ITEMS/mcl_throwing/locale/template.txt new file mode 100644 index 00000000..9bb4a581 --- /dev/null +++ b/mods/ITEMS/mcl_throwing/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: mcl_throwing +@1 used the ender pearl too often.= +Use the punch key to throw.= +Snowball= +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.= +Egg= +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.= +Ender Pearl= +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.= +Throwable= +Chance to hatch chicks when broken= +Teleports you on impact for cost of 5 HP= diff --git a/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_egg_impact.ogg b/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_egg_impact.ogg new file mode 100644 index 00000000..c4adf57a Binary files /dev/null and b/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_egg_impact.ogg differ diff --git a/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_snowball_impact_hard.ogg b/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_snowball_impact_hard.ogg new file mode 100644 index 00000000..a3e0a00a Binary files /dev/null and b/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_snowball_impact_hard.ogg differ diff --git a/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_snowball_impact_soft.ogg b/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_snowball_impact_soft.ogg new file mode 100644 index 00000000..260cdb91 Binary files /dev/null and b/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_snowball_impact_soft.ogg differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow.png b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow.png deleted file mode 100644 index 3dd99f46..00000000 Binary files a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow_back.png b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow_back.png deleted file mode 100644 index 205e4168..00000000 Binary files a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow_back.png and /dev/null differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow_front.png b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow_front.png deleted file mode 100644 index 8f784058..00000000 Binary files a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow_front.png and /dev/null differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow_inv.png b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow_inv.png deleted file mode 100644 index 8635d28a..00000000 Binary files a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_arrow_inv.png and /dev/null differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow.png b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow.png deleted file mode 100644 index 7d695bc9..00000000 Binary files a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow_0.png b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow_0.png deleted file mode 100644 index 8bb41ea4..00000000 Binary files a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow_0.png and /dev/null differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow_1.png b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow_1.png deleted file mode 100644 index f85304e4..00000000 Binary files a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_bow_1.png and /dev/null differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_ender_pearl.png b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_ender_pearl.png index 61e1786d..a73be694 100644 Binary files a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_ender_pearl.png and b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_ender_pearl.png differ diff --git a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_snowball.png b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_snowball.png index 5fcc76f2..d1216839 100644 Binary files a/mods/ITEMS/mcl_throwing/textures/mcl_throwing_snowball.png and b/mods/ITEMS/mcl_throwing/textures/mcl_throwing_snowball.png differ diff --git a/mods/ITEMS/mcl_throwing/throwable.lua b/mods/ITEMS/mcl_throwing/throwable.lua deleted file mode 100644 index 047b072d..00000000 --- a/mods/ITEMS/mcl_throwing/throwable.lua +++ /dev/null @@ -1,314 +0,0 @@ --- --- Snowballs and other throwable items --- - -local GRAVITY = tonumber(minetest.settings:get("movement_gravity")) - -local entity_mapping = { - ["mcl_throwing:snowball"] = "mcl_throwing:snowball_entity", - ["mcl_throwing:egg"] = "mcl_throwing:egg_entity", - ["mcl_throwing:ender_pearl"] = "mcl_throwing:ender_pearl_entity", -} - -local velocities = { - ["mcl_throwing:snowball_entity"] = 22, - ["mcl_throwing:egg_entity"] = 22, - ["mcl_throwing:ender_pearl_entity"] = 22, -} - -mcl_throwing.throw = function(throw_item, pos, dir, velocity) - if velocity == nil then - velocity = velocities[throw_item] - end - if velocity == nil then - velocity = 22 - end - - local itemstring = ItemStack(throw_item):get_name() - local obj = minetest.add_entity(pos, entity_mapping[itemstring]) - obj:setvelocity({x=dir.x*velocity, y=dir.y*velocity, z=dir.z*velocity}) - obj:setacceleration({x=dir.x*-3, y=-GRAVITY, z=dir.z*-3}) - return obj -end - --- Throw item -local throw_function = function(entity_name, velocity) - local func = function(item, player, pointed_thing) - local playerpos = player:getpos() - local dir = player:get_look_dir() - local obj = mcl_throwing.throw(item, {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, velocity) - obj:get_luaentity()._thrower = player:get_player_name() - if not minetest.settings:get_bool("creative_mode") then - item:take_item() - end - return item - end - return func -end - --- Staticdata handling because objects may want to be reloaded -local get_staticdata = function(self) - local data = { - _lastpos = self._lastpos, - _thrower = self._thrower, - } - return minetest.serialize(data) -end - -local on_activate = function(self, staticdata, dtime_s) - local data = minetest.deserialize(staticdata) - if data then - self._lastpos = data._lastpos - self._thrower = data._thrower - end -end - --- The snowball entity -local snowball_ENTITY={ - physical = false, - timer=0, - textures = {"mcl_throwing_snowball.png"}, - visual_size = {x=0.5, y=0.5}, - collisionbox = {0,0,0,0,0,0}, - - get_staticdata = get_staticdata, - on_activate = on_activate, - - _lastpos={}, -} -local egg_ENTITY={ - physical = false, - timer=0, - textures = {"mcl_throwing_egg.png"}, - visual_size = {x=0.45, y=0.45}, - collisionbox = {0,0,0,0,0,0}, - - get_staticdata = get_staticdata, - on_activate = on_activate, - - _lastpos={}, -} --- Ender pearl entity -local pearl_ENTITY={ - physical = false, - timer=0, - textures = {"mcl_throwing_ender_pearl.png"}, - visual_size = {x=0.9, y=0.9}, - collisionbox = {0,0,0,0,0,0}, - - get_staticdata = get_staticdata, - on_activate = on_activate, - - _lastpos={}, - _thrower = nil, -- Player ObjectRef of the player who threw the ender pearl -} - --- Snowball on_step()--> called when snowball is moving. -local snowball_on_step = function(self, dtime) - self.timer=self.timer+dtime - local pos = self.object:getpos() - local node = minetest.get_node(pos) - local def = minetest.registered_nodes[node.name] - - -- Destroy when hitting a solid node - if self._lastpos.x~=nil then - if (def and def.walkable) or not def then - self.object:remove() - return - end - end - self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set _lastpos-->Node will be added at last pos outside the node -end - --- Movement function of egg -local egg_on_step = function(self, dtime) - self.timer=self.timer+dtime - local pos = self.object:getpos() - local node = minetest.get_node(pos) - local def = minetest.registered_nodes[node.name] - - -- Destroy when hitting a solid node - if self._lastpos.x~=nil then - if (def and def.walkable) or not def then - -- 1/8 chance to spawn a chick - -- FIXME: Chicks have a quite good chance to spawn in walls - local r = math.random(1,8) - - -- Turn given object into a child - local make_child= function(object) - local ent = object:get_luaentity() - object:set_properties({ - visual_size = { x = ent.base_size.x/2, y = ent.base_size.y/2 }, - collisionbox = { - ent.base_colbox[1]/2, - ent.base_colbox[2]/2, - ent.base_colbox[3]/2, - ent.base_colbox[4]/2, - ent.base_colbox[5]/2, - ent.base_colbox[6]/2, - } - }) - ent.child = true - end - if r == 1 then - make_child(minetest.add_entity(self._lastpos, "mobs_mc:chicken")) - - -- BONUS ROUND: 1/32 chance to spawn 3 additional chicks - local r = math.random(1,32) - if r == 1 then - local offsets = { - { x=0.7, y=0, z=0 }, - { x=-0.7, y=0, z=-0.7 }, - { x=-0.7, y=0, z=0.7 }, - } - for o=1, 3 do - local pos = vector.add(self._lastpos, offsets[o]) - make_child(minetest.add_entity(pos, "mobs_mc:chicken")) - end - end - end - self.object:remove() - return - end - end - self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node -end - --- Movement function of ender pearl -local pearl_on_step = function(self, dtime) - self.timer=self.timer+dtime - local pos = self.object:getpos() - pos.y = math.floor(pos.y) - local node = minetest.get_node(pos) - local nn = node.name - local def = minetest.registered_nodes[node.name] - - -- Destroy when hitting a solid node - if self._lastpos.x~=nil then - local walkable = (def and def.walkable) - - -- No teleport for hitting ignore for now. Otherwise the player could get stuck. - -- FIXME: This also means the player loses an ender pearl for throwing into unloaded areas - if node.name == "ignore" then - self.object:remove() - -- Activate when hitting a solid node or a plant - elseif walkable or nn == "mcl_core:vine" or nn == "mcl_core:deadbush" or minetest.get_item_group(nn, "flower") ~= 0 or minetest.get_item_group(nn, "sapling") ~= 0 or minetest.get_item_group(nn, "plant") ~= 0 or minetest.get_item_group(nn, "mushroom") ~= 0 or not def then - local player = minetest.get_player_by_name(self._thrower) - if player then - -- Teleport and hurt player - - -- First determine good teleport position - local dir = {x=0, y=0, z=0} - - local v = self.object:getvelocity() - if walkable then - local vc = table.copy(v) -- vector for calculating - -- Node is walkable, we have to find a place somewhere outside of that node - vc = vector.normalize(vc) - - -- Zero-out the two axes with a lower absolute value than - -- the axis with the strongest force - local lv, ld - lv, ld = math.abs(vc.y), "y" - if math.abs(vc.x) > lv then - lv, ld = math.abs(vc.x), "x" - end - if math.abs(vc.z) > lv then - lv, ld = math.abs(vc.z), "z" - end - if ld ~= "x" then vc.x = 0 end - if ld ~= "y" then vc.y = 0 end - if ld ~= "z" then vc.z = 0 end - - -- Final tweaks to the teleporting pos, based on direction - -- Impact from the side - dir.x = vc.x * -1 - dir.z = vc.z * -1 - - -- Special case: top or bottom of node - if vc.y > 0 then - -- We need more space when impact is from below - dir.y = -2.3 - elseif vc.y < 0 then - -- Standing on top - dir.y = 0.5 - end - end - -- If node was not walkable, no modification to pos is made. - - -- Final teleportation position - local telepos = vector.add(pos, dir) - local telenode = minetest.get_node(telepos) - - --[[ It may be possible that telepos is walkable due to the algorithm. - Especially when the ender pearl is faster horizontally than vertical. - This applies final fixing, just to be sure we're not in a walkable node ]] - if not minetest.registered_nodes[telenode.name] or minetest.registered_nodes[telenode.name].walkable then - if v.y < 0 then - telepos.y = telepos.y + 0.5 - else - telepos.y = telepos.y - 2.3 - end - end - - local oldpos = player:getpos() - -- Teleport and hurt player - player:setpos(telepos) - player:set_hp(player:get_hp() - 5) - - -- 5% chance to spawn endermite at the player's origin - local r = math.random(1,20) - if r == 1 then - minetest.add_entity(oldpos, "mobs_mc:endermite") - end - - end - self.object:remove() - return - end - end - self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node -end - -snowball_ENTITY.on_step = snowball_on_step -egg_ENTITY.on_step = egg_on_step -pearl_ENTITY.on_step = pearl_on_step - -minetest.register_entity("mcl_throwing:snowball_entity", snowball_ENTITY) -minetest.register_entity("mcl_throwing:egg_entity", egg_ENTITY) -minetest.register_entity("mcl_throwing:ender_pearl_entity", pearl_ENTITY) - -local how_to_throw = "Hold it in your and and leftclick to throw." - --- Snowball -minetest.register_craftitem("mcl_throwing:snowball", { - description = "Snowball", - _doc_items_longdesc = "Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.", - _doc_items_usagehelp = how_to_throw, - inventory_image = "mcl_throwing_snowball.png", - stack_max = 16, - on_use = throw_function("mcl_throwing:snowball_entity"), -}) - --- Egg -minetest.register_craftitem("mcl_throwing:egg", { - description = "Egg", - _doc_items_longdesc = "Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chickens will pop out of the egg when it hits the ground.", - _doc_items_usagehelp = how_to_throw, - inventory_image = "mcl_throwing_egg.png", - stack_max = 16, - on_use = throw_function("mcl_throwing:egg_entity"), - groups = { craftitem = 1 }, -}) - --- Ender Pearl -minetest.register_craftitem("mcl_throwing:ender_pearl", { - description = "Ender Pearl", - _doc_items_longdesc = "An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block, a plant or vines. Each teleportation hurts the user by 5 hit points.", - _doc_items_usagehelp = how_to_throw, - wield_image = "mcl_throwing_ender_pearl.png", - inventory_image = "mcl_throwing_ender_pearl.png", - stack_max = 16, - on_use = throw_function("mcl_throwing:ender_pearl_entity"), -}) - diff --git a/mods/ITEMS/mcl_tnt/README.txt b/mods/ITEMS/mcl_tnt/README.txt index 14c73e07..5b1c1079 100644 --- a/mods/ITEMS/mcl_tnt/README.txt +++ b/mods/ITEMS/mcl_tnt/README.txt @@ -10,22 +10,10 @@ There are different ways to blow up TNT: 2. Activate it with redstone circuits Be aware of the damage radius! -License: -WTFPL (see below) +License of mod code and media: +MIT License -See also: -http://minetest.net/ +Sound credits: - 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. +* tnt_explode.ogg: Jose Ortiz 'MindChamber' (CC0) +* tnt_ignite.ogg: Own derivate work of sound by Ned Bouhalassa (CC0) created in 2005, source: diff --git a/mods/ITEMS/mcl_tnt/depends.txt b/mods/ITEMS/mcl_tnt/depends.txt index 0f49dddd..e4c208ea 100644 --- a/mods/ITEMS/mcl_tnt/depends.txt +++ b/mods/ITEMS/mcl_tnt/depends.txt @@ -1,5 +1,6 @@ +mcl_explosions mcl_sounds? mcl_mobitems? -mcl_hunger? mcl_death_messages? doc_identifier? +mesecons? diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index 3e9a3c01..90cb76d8 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -1,78 +1,93 @@ +local S = minetest.get_translator("mcl_tnt") +local tnt_griefing = minetest.settings:get_bool("mcl_tnt_griefing", true) + local mod_death_messages = minetest.get_modpath("mcl_death_messages") -local mod_hunger = minetest.get_modpath("mcl_hunger") local function spawn_tnt(pos, entname) - minetest.sound_play("tnt_ignite", {pos = pos,gain = 1.0,max_hear_distance = 15,}) + minetest.sound_play("tnt_ignite", {pos = pos,gain = 1.0,max_hear_distance = 15,}, true) local tnt = minetest.add_entity(pos, entname) tnt:set_armor_groups({immortal=1}) return tnt end -local function activate_if_tnt(nname, np, tnt_np, tntr) - if nname == "mcl_tnt:tnt" then - local e = spawn_tnt(np, nname) - e:setvelocity({x=(np.x - tnt_np.x)*5+(tntr / 4), y=(np.y - tnt_np.y)*5+(tntr / 3), z=(np.z - tnt_np.z)*5+(tntr / 4)}) - end -end - -local function do_tnt_physics(tnt_np,tntr) - local objs = minetest.get_objects_inside_radius(tnt_np, tntr) - for k, obj in pairs(objs) do - local oname = obj:get_entity_name() - local v = obj:getvelocity() - local p = obj:getpos() - if oname == "mcl_tnt:tnt" then - obj:setvelocity({x=(p.x - tnt_np.x) + (tntr / 2) + v.x, y=(p.y - tnt_np.y) + tntr + v.y, z=(p.z - tnt_np.z) + (tntr / 2) + v.z}) - else - if v ~= nil then - obj:setvelocity({x=(p.x - tnt_np.x) + (tntr / 4) + v.x, y=(p.y - tnt_np.y) + (tntr / 2) + v.y, z=(p.z - tnt_np.z) + (tntr / 4) + v.z}) - else - local dist = math.max(1, vector.distance(tnt_np, p)) - local damage = (4 / dist) * tntr - if obj:is_player() == true then - if mod_death_messages then - mcl_death_messages.player_damage(obj, string.format("%s was caught in an explosion.", obj:get_player_name())) - end - if mod_hunger then - mcl_hunger.exhaust(obj:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end - end - obj:set_hp(obj:get_hp() - damage) - end - end - end -end - tnt = {} tnt.ignite = function(pos) minetest.remove_node(pos) spawn_tnt(pos, "mcl_tnt:tnt") - core.check_for_falling(pos) + minetest.check_for_falling(pos) end +-- Add smoke particle of entity at pos. +-- Intended to be called every step +tnt.smoke_step = function(pos) + minetest.add_particle({ + pos = {x=pos.x,y=pos.y+0.5,z=pos.z}, + velocity = vector.new(math.random() * 0.2 - 0.1, 1.0 + math.random(), math.random() * 0.2 - 0.1), + acceleration = vector.new(0, -0.1, 0), + expirationtime = 0.15 + math.random() * 0.25, + size = 1.0 + math.random(), + collisiondetection = false, + texture = "tnt_smoke.png" + }) +end + +tnt.BOOMTIMER = 4 +tnt.BLINKTIMER = 0.25 + local TNT_RANGE = 3 local sounds if minetest.get_modpath("mcl_sounds") then sounds = mcl_sounds.node_sound_wood_defaults() end +local tnt_mesecons +if minetest.get_modpath("mesecons") then + tnt_mesecons = {effector = { + action_on = tnt.ignite, + rules = mesecon.rules.alldirs, + }} +end + +local longdesc +if tnt_griefing then + longdesc = S("An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.", TNT_RANGE) +else + longdesc = S("An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.", TNT_RANGE) +end + minetest.register_node("mcl_tnt:tnt", { tiles = {"default_tnt_top.png", "default_tnt_bottom.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png"}, is_ground_content = false, stack_max = 64, - description = "TNT", + description = S("TNT"), paramtype = "light", sunlight_propagates = true, - _doc_items_longdesc = string.format("An explosive device. When it explodes, it will hurt living beings, destroy blocks around it, throw blocks affected by gravity all over the place and light fires. A single TNT has an explosion radius of %d. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.", TNT_RANGE), - _doc_items_usagehelp = "Place the TNT on the ground and ignite it with one of the methods above. Quickly get in safe distance quickly. The TNT will start to be affected by gravity and explodes in 4 seconds.", - groups = { dig_immediate = 3, tnt = 1, enderman_takable=1 }, - mesecons = {effector = { - action_on = tnt.ignite - }}, + _tt_help = S("Ignited by tools, explosions, fire, lava, redstone power").."\n"..S("Explosion radius: @1", tostring(TNT_RANGE)), + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = S("Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds."), + groups = { dig_immediate = 3, tnt = 1, enderman_takable=1, flammable=-1 }, + mesecons = tnt_mesecons, + on_blast = function(pos) + local e = spawn_tnt(pos, "mcl_tnt:tnt") + e:get_luaentity().timer = tnt.BOOMTIMER - (0.5 + math.random()) + return true + end, _on_ignite = function(player, pointed_thing) tnt.ignite(pointed_thing.under) + return true + end, + _on_burn = function(pos) + tnt.ignite(pos) + return true + end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Place and ignite TNT + if minetest.registered_nodes[dropnode.name].buildable_to then + minetest.set_node(droppos, {name = stack:get_name()}) + tnt.ignite(droppos) + end end, sounds = sounds, }) @@ -89,12 +104,16 @@ local TNT = { -- Initial value for our timer timer = 0, blinktimer = 0, + tnt_knockback = true, blinkstatus = true,} function TNT:on_activate(staticdata) - self.object:setvelocity({x=0, y=4, z=0}) - self.object:setacceleration({x=0, y=-10, z=0}) - self.object:settexturemod("^mcl_tnt_blink.png") + local phi = math.random(0, 65535) / 65535 * 2*math.pi + local hdir_x = math.cos(phi) * 0.02 + local hdir_z = math.sin(phi) * 0.02 + self.object:set_velocity({x=hdir_x, y=2, z=hdir_z}) + self.object:set_acceleration({x=0, y=-10, z=0}) + self.object:set_texture_mod("^mcl_tnt_blink.png") end local function add_effects(pos, radius, drops) @@ -147,86 +166,25 @@ local function add_effects(pos, radius, drops) end function TNT:on_step(dtime) - local pos = self.object:getpos() - minetest.add_particle({ - pos = {x=pos.x,y=pos.y+0.5,z=pos.z}, - velocity = {x=math.random(-.1,.1),y=math.random(1,2),z=math.random(-.1,.1)}, - acceleration = {x=0,y=-0.1,z=0}, - expirationtime = math.random(.5,1), - size = math.random(1,2), - collisiondetection = false, - texture = "tnt_smoke.png" - }) + local pos = self.object:get_pos() + tnt.smoke_step(pos) self.timer = self.timer + dtime self.blinktimer = self.blinktimer + dtime - if self.blinktimer > 0.25 then - self.blinktimer = self.blinktimer - 0.25 + if self.blinktimer > tnt.BLINKTIMER then + self.blinktimer = self.blinktimer - tnt.BLINKTIMER if self.blinkstatus then - self.object:settexturemod("") + self.object:set_texture_mod("") else - self.object:settexturemod("^mcl_tnt_blink.png") + self.object:set_texture_mod("^mcl_tnt_blink.png") end self.blinkstatus = not self.blinkstatus end - if self.timer > 4 then - tnt.boom(self.object:getpos()) + if self.timer > tnt.BOOMTIMER then + mcl_explosions.explode(self.object:get_pos(), 4, { drop_chance = 1.0 }, self.object) self.object:remove() end end -tnt.boom = function(pos, info) - if not info then info = {} end - local range = info.radius or TNT_RANGE - local damage_range = info.damage_radius or TNT_RANGE - - pos.x = math.floor(pos.x+0.5) - pos.y = math.floor(pos.y+0.5) - pos.z = math.floor(pos.z+0.5) - do_tnt_physics(pos, range) - local meta = minetest.get_meta(pos) - local sound - if not info.sound then - sound = "tnt_explode" - else - sound = info.sound - end - minetest.sound_play(sound, {pos = pos,gain = 1.0,max_hear_distance = 16,}) - local node = minetest.get_node(pos) - if minetest.get_item_group("water") == 1 or minetest.get_item_group("lava") == 1 or minetest.is_protected(pos, "tnt") then - -- Cancel the Explosion - return - end - for x=-range,range do - for y=-range,range do - for z=-range,range do - if x*x+y*y+z*z <= range * range + range then - local np={x=pos.x+x,y=pos.y+y,z=pos.z+z} - local n = minetest.get_node(np) - local def = minetest.registered_nodes[n.name] - -- Simple blast resistance check (for now). This keeps the important blocks like bedrock, command block, etc. intact. - -- TODO: Implement the real blast resistance algorithm - if def and n.name ~= "air" and n.name ~= "ignore" and (def._mcl_blast_resistance == nil or def._mcl_blast_resistance < 1000) then - activate_if_tnt(n.name, np, pos, 3) - minetest.remove_node(np) - core.check_for_falling(np) - if n.name ~= "mcl_tnt:tnt" and math.random() > 0.9 then - local drop = minetest.get_node_drops(n.name, "") - for _,item in ipairs(drop) do - if type(item) == "string" then - if math.random(1,100) > 40 then - local obj = minetest.add_item(np, item) - end - end - end - end - end - end - end - end - add_effects(pos, range, {}) - end -end - minetest.register_entity("mcl_tnt:tnt", TNT) if minetest.get_modpath("mcl_mobitems") then diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr new file mode 100644 index 00000000..71c99cde --- /dev/null +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_tnt +@1 was caught in an explosion.=@1 wurde Opfer einer Explosion. +TNT=TNT +An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Ein Sprengstoff. Wenn er explodiert, wird er Lebewesen verletzen und Blöcke in der Nähe zerstören. TNT hat einen Explosionsradius von @1. Mit einer geringen Wahrscheinlichkeit werden Blöcke als Gegenstand abfallen (als ob sie abgebaut worden wären), anstatt völlig zerstört zu werden. TNT kann mit Werkzeugen, Explosionen, Feuer, Lava und Redstone-Signalen angezündet werden. +An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Ein Sprengstoff. Wenn er explodiert, wird er Lebewesen verletzen. TNT hat einen Explosionsradius von @1. TNT kann mit Werkzeugen, Explosionen, Feuer, Lava und Redstone-Signalen angezündet werden. +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=Platizeren sie das TNT und zünden Sie es mit einer der obigen Methoden an. Begeben Sie sich rasch in eine sichere Entfernung. Das TNT wird anfangen, von der Schwerkraft beeinflusst zu sein und explodiert in 4 Sekunden. +Ignited by tools, explosions, fire, lava, redstone power=Anzündbar von Werkzeugen, Explosionen, Feuer, Redstoneeergie +Explosion radius: @1=Explosionsradius: @1 diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.es.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.es.tr new file mode 100644 index 00000000..81d30dcd --- /dev/null +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.es.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_tnt +@1 was caught in an explosion.=@1 wurde Opfer einer Explosion. +TNT=Dinamita +An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Un artefacto explosivo. Cuando explota, dañará a los seres vivos y destruirá los bloques a su alrededor. La dinamita tiene un radio de explosión de @1. Con una pequeña posibilidad, los bloques pueden caer como un elemento (como si se extrajera) en lugar de ser destruidos. La dinamita puede encenderse con herramientas, explosiones, fuego, lava y señales de redstone. +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=Coloque el dinamita y enciéndalo con uno de los métodos anteriores. Aléjese rápidamente a una distancia segura. La dinamita comenzará a verse afectada por la gravedad y explotará en 4 segundos. diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.fr.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.fr.tr new file mode 100644 index 00000000..b5cba53b --- /dev/null +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.fr.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_tnt +@1 was caught in an explosion.=@1 a été pris dans une explosion. +TNT=TNT +An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Un engin explosif. Quand il explose, il blessera les êtres vivants et détruira les blocs autour de lui. La TNT a un rayon d'explosion de @1. Avec une petite chance, les blocs peuvent tomber comme un objet (comme s'ils étaient minés) plutôt que d'être détruits. La TNT peut être enflammée par des outils, des explosions, des feux d'incendie, de la lave et de la redstone. +An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Un engin explosif. Quand elle explose, elle blessera les êtres vivants. La TNT a un rayon d'explosion de @1. La TNT peut être enflammée par des outils, des explosions, des feux d'incendie, de la lave et de la redstone. +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=Placez la TNT et allumez-la avec l'une des méthodes ci-dessus. Déplacez-vous rapidement à une distance de sécurité. La TNT commencera à être affecté par la gravité et explose en 4 secondes. +Ignited by tools, explosions, fire, lava, redstone power=Enflammé par les outils, les explosions, le feu, la lave, la redstone +Explosion radius: @1=Rayon d'explosion: @1 diff --git a/mods/ITEMS/mcl_tnt/locale/template.txt b/mods/ITEMS/mcl_tnt/locale/template.txt new file mode 100644 index 00000000..0361b76b --- /dev/null +++ b/mods/ITEMS/mcl_tnt/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: mcl_tnt +@1 was caught in an explosion.= +TNT= +An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.= +An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.= +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.= +Ignited by tools, explosions, fire, lava, redstone power= +Explosion radius: @1= diff --git a/mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg b/mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg index a414ea04..1691a41b 100644 Binary files a/mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg and b/mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg differ diff --git a/mods/ITEMS/mcl_tnt/sounds/tnt_ignite.ogg b/mods/ITEMS/mcl_tnt/sounds/tnt_ignite.ogg index 199f2067..aa232f0d 100644 Binary files a/mods/ITEMS/mcl_tnt/sounds/tnt_ignite.ogg and b/mods/ITEMS/mcl_tnt/sounds/tnt_ignite.ogg differ diff --git a/mods/ITEMS/mcl_tnt/textures/default_tnt_bottom.png b/mods/ITEMS/mcl_tnt/textures/default_tnt_bottom.png index df411b68..4a097843 100644 Binary files a/mods/ITEMS/mcl_tnt/textures/default_tnt_bottom.png and b/mods/ITEMS/mcl_tnt/textures/default_tnt_bottom.png differ diff --git a/mods/ITEMS/mcl_tnt/textures/default_tnt_side.png b/mods/ITEMS/mcl_tnt/textures/default_tnt_side.png index 89fe3e09..e5aae141 100644 Binary files a/mods/ITEMS/mcl_tnt/textures/default_tnt_side.png and b/mods/ITEMS/mcl_tnt/textures/default_tnt_side.png differ diff --git a/mods/ITEMS/mcl_tnt/textures/default_tnt_top.png b/mods/ITEMS/mcl_tnt/textures/default_tnt_top.png index eb52ab5a..b55ad3d0 100644 Binary files a/mods/ITEMS/mcl_tnt/textures/default_tnt_top.png and b/mods/ITEMS/mcl_tnt/textures/default_tnt_top.png differ diff --git a/mods/ITEMS/mcl_tnt/textures/mcl_tnt_blink.png b/mods/ITEMS/mcl_tnt/textures/mcl_tnt_blink.png index b6739757..c0ba3641 100644 Binary files a/mods/ITEMS/mcl_tnt/textures/mcl_tnt_blink.png and b/mods/ITEMS/mcl_tnt/textures/mcl_tnt_blink.png differ diff --git a/mods/ITEMS/mcl_tnt/textures/tnt_smoke.png b/mods/ITEMS/mcl_tnt/textures/tnt_smoke.png index 6551db5b..cbb93730 100644 Binary files a/mods/ITEMS/mcl_tnt/textures/tnt_smoke.png and b/mods/ITEMS/mcl_tnt/textures/tnt_smoke.png differ diff --git a/mods/ITEMS/mcl_tools/depends.txt b/mods/ITEMS/mcl_tools/depends.txt index a28b023b..5ce101ed 100644 --- a/mods/ITEMS/mcl_tools/depends.txt +++ b/mods/ITEMS/mcl_tools/depends.txt @@ -1,2 +1,2 @@ mcl_sounds -mcl_autogroup +_mcl_autogroup diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 58901cac..ccca197e 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_tools") + -- mods/default/tools.lua -- @@ -11,12 +13,19 @@ - 3: Stone - 4: Iron - 5: Diamond + +dig_speed_class group: +- 1: Painfully slow +- 2: Very slow +- 3: Slow +- 4: Fast +- 5: Very fast +- 6: Extremely fast +- 7: Instantaneous ]] --- TODO: Add legacy support for Minetest Game groups like crumbly, snappy, cracky, etc. for all tools - -- The hand -local groupcaps +local groupcaps, hand_range, hand_groups if minetest.settings:get_bool("creative_mode") then -- Instant breaking in creative mode groupcaps = { @@ -26,43 +35,53 @@ if minetest.settings:get_bool("creative_mode") then for k,v in pairs(mcl_autogroup.creativetimes) do groupcaps[k] = { times = v, uses = 0 } end + hand_range = 10 + hand_groups = { dig_speed_class = 7 } else groupcaps = { handy_dig = {times=mcl_autogroup.digtimes.handy_dig, uses=0}, } + hand_range = 4 + hand_groups = { dig_speed_class = 1 } end minetest.register_item(":", { type = "none", - _doc_items_longdesc = "You use your bare hand whenever you are not wielding any item. With your hand you can mine the weakest blocks and deal minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are better than the hand. When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching. In Creative Mode, the hand is able to break all blocks instantly.", + _doc_items_longdesc = S("You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.").."\n".. + S("When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.").."\n".. + S("In Creative Mode, the hand is able to break all blocks instantly."), wield_image = "wieldhand.png", wield_scale = {x=1.0,y=1.0,z=2.0}, -- According to Minecraft Wiki, the exact range is 3.975. -- Minetest seems to only support whole numbers, so we use 4. - range = 4, + range = hand_range, tool_capabilities = { full_punch_interval = 0.25, max_drop_level = 0, groupcaps = groupcaps, damage_groups = {fleshy=1}, - } + }, + groups = hand_groups, }) -- Help texts -local pickaxe_longdesc = "Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient." -local axe_longdesc = "An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow." -local sword_longdesc = "Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs." -local shovel_longdesc = "Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak." -local shovel_use = "To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block." -local shears_longdesc = "Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from a grass, leaves and similar blocks." -local shears_use = "To shear a sheep and obtain its wool, rightclick it while holding the shears. Mining works are usual, but the drops are different for a few blocks." +local pickaxe_longdesc = S("Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.") +local axe_longdesc = S("An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.") +local sword_longdesc = S("Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.") +local shovel_longdesc = S("Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.") +local shovel_use = S("To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.") +local shears_longdesc = S("Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.") +local shears_use = S("To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.") + +local wield_scale = { x = 1.8, y = 1.8, z = 1 } -- Picks minetest.register_tool("mcl_tools:pick_wood", { - description = "Wooden Pickaxe", + description = S("Wooden Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodpick.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, pickaxe=1, dig_speed_class=2, }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -71,14 +90,17 @@ minetest.register_tool("mcl_tools:pick_wood", { pickaxey_dig_wood = {times=mcl_autogroup.digtimes.pickaxey_dig_wood, uses=60, maxlevel=0}, }, damage_groups = {fleshy=2}, + punch_attack_uses = 30, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "group:wood", }) minetest.register_tool("mcl_tools:pick_stone", { - description = "Stone Pickaxe", + description = S("Stone Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_stonepick.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, pickaxe=1, dig_speed_class=3, }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -87,14 +109,17 @@ minetest.register_tool("mcl_tools:pick_stone", { pickaxey_dig_stone = {times=mcl_autogroup.digtimes.pickaxey_dig_stone, uses=132, maxlevel=0}, }, damage_groups = {fleshy=3}, + punch_attack_uses = 66, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:cobble", }) minetest.register_tool("mcl_tools:pick_iron", { - description = "Iron Pickaxe", + description = S("Iron Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_steelpick.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, pickaxe=1, dig_speed_class=4, }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -103,14 +128,17 @@ minetest.register_tool("mcl_tools:pick_iron", { pickaxey_dig_iron = {times=mcl_autogroup.digtimes.pickaxey_dig_iron , uses=251, maxlevel=0}, }, damage_groups = {fleshy=4}, + punch_attack_uses = 126, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:iron_ingot", }) minetest.register_tool("mcl_tools:pick_gold", { - description = "Golden Pickaxe", + description = S("Golden Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_goldpick.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, pickaxe=1, dig_speed_class=6, }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -119,14 +147,17 @@ minetest.register_tool("mcl_tools:pick_gold", { pickaxey_dig_gold = {times=mcl_autogroup.digtimes.pickaxey_dig_gold , uses=33, maxlevel=0}, }, damage_groups = {fleshy=2}, + punch_attack_uses = 17, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:gold_ingot", }) minetest.register_tool("mcl_tools:pick_diamond", { - description = "Diamond Pickaxe", + description = S("Diamond Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_diamondpick.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, pickaxe=1, dig_speed_class=5, }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -135,8 +166,10 @@ minetest.register_tool("mcl_tools:pick_diamond", { pickaxey_dig_diamond = {times=mcl_autogroup.digtimes.pickaxey_dig_diamond, uses=1562, maxlevel=0}, }, damage_groups = {fleshy=5}, + punch_attack_uses = 781, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:diamond", }) local get_shovel_dig_group = function(itemstring) @@ -168,12 +201,18 @@ local make_grass_path = function(itemstack, placer, pointed_thing) -- Only make grass path if tool used on side or top of target node if pointed_thing.above.y < pointed_thing.under.y then - return + return itemstack end - if (node.name == "mcl_core:dirt_with_grass" or node.name == "mcl_core:dirt_with_grass_snow") then + + if (minetest.get_item_group(node.name, "grass_block") == 1) then local above = table.copy(pointed_thing.under) above.y = above.y + 1 if minetest.get_node(above).name == "air" then + if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) + return itemstack + end + if not minetest.settings:get_bool("creative_mode") then -- Add wear, as if digging a level 0 shovely node local toolname = itemstack:get_name() @@ -185,22 +224,60 @@ local make_grass_path = function(itemstack, placer, pointed_thing) local wear = math.ceil(65535 / uses) itemstack:add_wear(wear) end - minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}) + minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}, true) minetest.swap_node(pointed_thing.under, {name="mcl_core:grass_path"}) end end return itemstack end +local carve_pumpkin +if minetest.get_modpath("mcl_farming") then + carve_pumpkin = function(itemstack, placer, pointed_thing) + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if placer and not placer: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, placer, itemstack) or itemstack + end + end + + -- Only carve pumpkin if used on side + if pointed_thing.above.y ~= pointed_thing.under.y then + return + end + if node.name == "mcl_farming:pumpkin" then + if not minetest.settings:get_bool("creative_mode") then + -- Add wear (as if digging a shearsy node) + local toolname = itemstack:get_name() + local def = minetest.registered_items[toolname] + local group = get_shovel_dig_group(toolname) + local base_uses = def.tool_capabilities.groupcaps["shearsy_dig"].uses + local maxlevel = def.tool_capabilities.groupcaps["shearsy_dig"].maxlevel + local uses = base_uses * math.pow(3, maxlevel) + local wear = math.ceil(65535 / uses) + itemstack:add_wear(wear) + end + minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pointed_thing.above}, true) + local dir = vector.subtract(pointed_thing.under, pointed_thing.above) + local param2 = minetest.dir_to_facedir(dir) + minetest.swap_node(pointed_thing.under, {name="mcl_farming:pumpkin_face", param2 = param2}) + minetest.add_item(pointed_thing.above, "mcl_farming:pumpkin_seeds 4") + end + return itemstack + end +end + -- Shovels minetest.register_tool("mcl_tools:shovel_wood", { - description = "Wooden Shovel", + description = S("Wooden Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, _doc_items_hidden = false, inventory_image = "default_tool_woodshovel.png", wield_image = "default_tool_woodshovel.png^[transformR90", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, shovel=1, dig_speed_class=2, }, tool_capabilities = { full_punch_interval = 1, max_drop_level=1, @@ -208,17 +285,20 @@ minetest.register_tool("mcl_tools:shovel_wood", { shovely_dig_wood = {times=mcl_autogroup.digtimes.shovely_dig_wood, uses=60, maxlevel=0}, }, damage_groups = {fleshy=2}, + punch_attack_uses = 30, }, on_place = make_grass_path, sound = { breaks = "default_tool_breaks" }, + _repair_material = "group:wood", }) minetest.register_tool("mcl_tools:shovel_stone", { - description = "Stone Shovel", + description = S("Stone Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_stoneshovel.png", wield_image = "default_tool_stoneshovel.png^[transformR90", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, shovel=1, dig_speed_class=3, }, tool_capabilities = { full_punch_interval = 1, max_drop_level=3, @@ -226,17 +306,20 @@ minetest.register_tool("mcl_tools:shovel_stone", { shovely_dig_stone = {times=mcl_autogroup.digtimes.shovely_dig_stone, uses=132, maxlevel=0}, }, damage_groups = {fleshy=3}, + punch_attack_uses = 66, }, on_place = make_grass_path, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:cobble", }) minetest.register_tool("mcl_tools:shovel_iron", { - description = "Iron Shovel", + description = S("Iron Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_steelshovel.png", wield_image = "default_tool_steelshovel.png^[transformR90", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, shovel=1, dig_speed_class=4, }, tool_capabilities = { full_punch_interval = 1, max_drop_level=4, @@ -244,17 +327,20 @@ minetest.register_tool("mcl_tools:shovel_iron", { shovely_dig_iron = {times=mcl_autogroup.digtimes.shovely_dig_iron, uses=251, maxlevel=0}, }, damage_groups = {fleshy=4}, + punch_attack_uses = 126, }, on_place = make_grass_path, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:iron_ingot", }) minetest.register_tool("mcl_tools:shovel_gold", { - description = "Golden Shovel", + description = S("Golden Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_goldshovel.png", wield_image = "default_tool_goldshovel.png^[transformR90", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, shovel=1, dig_speed_class=6, }, tool_capabilities = { full_punch_interval = 1, max_drop_level=2, @@ -262,17 +348,20 @@ minetest.register_tool("mcl_tools:shovel_gold", { shovely_dig_gold = {times=mcl_autogroup.digtimes.shovely_dig_gold, uses=33, maxlevel=0}, }, damage_groups = {fleshy=2}, + punch_attack_uses = 17, }, on_place = make_grass_path, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:gold_ingot", }) minetest.register_tool("mcl_tools:shovel_diamond", { - description = "Diamond Shovel", + description = S("Diamond Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_diamondshovel.png", wield_image = "default_tool_diamondshovel.png^[transformR90", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, shovel=1, dig_speed_class=5, }, tool_capabilities = { full_punch_interval = 1, max_drop_level=5, @@ -280,18 +369,21 @@ minetest.register_tool("mcl_tools:shovel_diamond", { shovely_dig_diamond = {times=mcl_autogroup.digtimes.shovely_dig_diamond, uses=1562, maxlevel=0}, }, damage_groups = {fleshy=5}, + punch_attack_uses = 781, }, on_place = make_grass_path, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:diamond", }) -- Axes minetest.register_tool("mcl_tools:axe_wood", { - description = "Wooden Axe", + description = S("Wooden Axe"), _doc_items_longdesc = axe_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodaxe.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, axe=1, dig_speed_class=2, }, tool_capabilities = { full_punch_interval = 1.25, max_drop_level=1, @@ -299,14 +391,17 @@ minetest.register_tool("mcl_tools:axe_wood", { axey_dig_wood = {times=mcl_autogroup.digtimes.axey_dig_wood, uses=60, maxlevel=0}, }, damage_groups = {fleshy=7}, + punch_attack_uses = 30, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "group:wood", }) minetest.register_tool("mcl_tools:axe_stone", { - description = "Stone Axe", + description = S("Stone Axe"), _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_stoneaxe.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, axe=1, dig_speed_class=3, }, tool_capabilities = { full_punch_interval = 1.25, max_drop_level=3, @@ -314,14 +409,17 @@ minetest.register_tool("mcl_tools:axe_stone", { axey_dig_stone = {times=mcl_autogroup.digtimes.axey_dig_stone, uses=132, maxlevel=0}, }, damage_groups = {fleshy=9}, + punch_attack_uses = 66, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:cobble", }) minetest.register_tool("mcl_tools:axe_iron", { - description = "Iron Axe", + description = S("Iron Axe"), _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_steelaxe.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, axe=1, dig_speed_class=4, }, tool_capabilities = { -- 1/0.9 full_punch_interval = 1.11111111, @@ -330,14 +428,17 @@ minetest.register_tool("mcl_tools:axe_iron", { axey_dig_iron = {times=mcl_autogroup.digtimes.axey_dig_iron, uses=251, maxlevel=0}, }, damage_groups = {fleshy=9}, + punch_attack_uses = 126, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:iron_ingot", }) minetest.register_tool("mcl_tools:axe_gold", { - description = "Golden Axe", + description = S("Golden Axe"), _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_goldaxe.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, axe=1, dig_speed_class=6, }, tool_capabilities = { full_punch_interval = 1.0, max_drop_level=2, @@ -345,14 +446,17 @@ minetest.register_tool("mcl_tools:axe_gold", { axey_dig_gold= {times=mcl_autogroup.digtimes.axey_dig_gold, uses=33, maxlevel=0}, }, damage_groups = {fleshy=7}, + punch_attack_uses = 17, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:gold_ingot", }) minetest.register_tool("mcl_tools:axe_diamond", { - description = "Diamond Axe", + description = S("Diamond Axe"), _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_diamondaxe.png", - groups = { tool=1 }, + wield_scale = wield_scale, + groups = { tool=1, axe=1, dig_speed_class=5, }, tool_capabilities = { full_punch_interval = 1.0, max_drop_level=5, @@ -360,17 +464,20 @@ minetest.register_tool("mcl_tools:axe_diamond", { axey_dig_diamond = {times=mcl_autogroup.digtimes.axey_dig_diamond, uses=1562, maxlevel=0}, }, damage_groups = {fleshy=9}, + punch_attack_uses = 781, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:diamond", }) -- Swords minetest.register_tool("mcl_tools:sword_wood", { - description = "Wooden Sword", + description = S("Wooden Sword"), _doc_items_longdesc = sword_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodsword.png", - groups = { weapon=1 }, + wield_scale = wield_scale, + groups = { weapon=1, sword=1, dig_speed_class=2, }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=1, @@ -379,14 +486,17 @@ minetest.register_tool("mcl_tools:sword_wood", { swordy_cobweb_dig = {times=mcl_autogroup.digtimes.swordy_cobweb_dig , uses=60, maxlevel=0}, }, damage_groups = {fleshy=4}, + punch_attack_uses = 60, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "group:wood", }) minetest.register_tool("mcl_tools:sword_stone", { - description = "Stone Sword", + description = S("Stone Sword"), _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_stonesword.png", - groups = { weapon=1 }, + wield_scale = wield_scale, + groups = { weapon=1, sword=1, dig_speed_class=3, }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=3, @@ -395,14 +505,17 @@ minetest.register_tool("mcl_tools:sword_stone", { swordy_cobweb_dig = {times=mcl_autogroup.digtimes.swordy_cobweb_dig , uses=132, maxlevel=0}, }, damage_groups = {fleshy=5}, + punch_attack_uses = 132, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:cobble", }) minetest.register_tool("mcl_tools:sword_iron", { - description = "Iron Sword", + description = S("Iron Sword"), _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_steelsword.png", - groups = { weapon=1 }, + wield_scale = wield_scale, + groups = { weapon=1, sword=1, dig_speed_class=4, }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=4, @@ -411,14 +524,17 @@ minetest.register_tool("mcl_tools:sword_iron", { swordy_cobweb_dig = {times=mcl_autogroup.digtimes.swordy_cobweb_dig , uses=251, maxlevel=0}, }, damage_groups = {fleshy=6}, + punch_attack_uses = 251, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:iron_ingot", }) minetest.register_tool("mcl_tools:sword_gold", { - description = "Golden Sword", + description = S("Golden Sword"), _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_goldsword.png", - groups = { weapon=1 }, + wield_scale = wield_scale, + groups = { weapon=1, sword=1, dig_speed_class=6, }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=2, @@ -427,14 +543,17 @@ minetest.register_tool("mcl_tools:sword_gold", { swordy_cobweb_dig = {times=mcl_autogroup.digtimes.swordy_cobweb_dig, uses=33, maxlevel=0}, }, damage_groups = {fleshy=4}, + punch_attack_uses = 33, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:gold_ingot", }) minetest.register_tool("mcl_tools:sword_diamond", { - description = "Diamond Sword", + description = S("Diamond Sword"), _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_diamondsword.png", - groups = { weapon=1 }, + wield_scale = wield_scale, + groups = { weapon=1, sword=1, dig_speed_class=5, }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=5, @@ -443,19 +562,21 @@ minetest.register_tool("mcl_tools:sword_diamond", { swordy_cobweb_dig = {times=mcl_autogroup.digtimes.swordy_cobweb_dig, uses=1562, maxlevel=0}, }, damage_groups = {fleshy=7}, + punch_attack_uses = 1562, }, sound = { breaks = "default_tool_breaks" }, + _repair_material = "mcl_core:diamond", }) --Shears minetest.register_tool("mcl_tools:shears", { - description = "Shears", + description = S("Shears"), _doc_items_longdesc = shears_longdesc, _doc_items_usagehelp = shears_use, inventory_image = "default_tool_shears.png", wield_image = "default_tool_shears.png", stack_max = 1, - groups = { tool=1 }, + groups = { tool=1, shears=1, dig_speed_class=4, }, tool_capabilities = { full_punch_interval = 0.5, max_drop_level=1, @@ -464,6 +585,7 @@ minetest.register_tool("mcl_tools:shears", { shearsy_wool_dig = {times=mcl_autogroup.digtimes.shearsy_wool_dig, uses=238, maxlevel=0}, } }, + on_place = carve_pumpkin, sound = { breaks = "default_tool_breaks" }, }) diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr new file mode 100644 index 00000000..6c061dd0 --- /dev/null +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr @@ -0,0 +1,32 @@ +# textdomain: mcl_tools +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Sie benutzen Ihre nackte Hand, wenn Sie keinen Gegenstand halten. Mit Ihrer Hand können Sie die meisten Blöcke abbauen, aber dies ist die langsamste Methode und nur aus den schwächsten Blöcken werden ihre brauchbaren Gegenstände hinausfallen. Die Hand richtet auch geringfügigen Schaden mit Schlägen an. Die Hand ist oft die letzte Wahl, da richtige Grabewerkzeuge und Waffen viel besser sind. +When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Wenn Sie einen Gegenstand tragen, der kein Grabewerkzeug oder eine Waffe ist, wird sie sich verhalten, als ob Sie die Hand benutzen würden, wenn Sie etwas abbauen oder schlagen. +In Creative Mode, the hand is able to break all blocks instantly.=Im Kreativmodus kann die Hand alle Blöcke sofort zerstören. +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Spitzhacken sind Grabewerkzeuge, um harte Blöcke wie Stein abzubauen. Eine Spitzhacke kann auch als Waffe benutzt werden, aber das ist recht ineffizient. +An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Eine Axt ist das Werkzeug zum Abbauen von Bäumen, holzbasieren Blöcken und anderen Blöcken. Äxte richten auch viel Schaden an, aber sie sind ziemlich langsam. +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Schwerter sind großartig im Nahkampf, da sie schnell sind, hohen Schaden anrichten und viele Schlachten schlagen können. Schwerter können auch benutzt werden, um bestimmte Blöcke abzuschneiden, so wie Spinnenweben. +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Schaufeln sind Werkzeuge zum Ausgraben von groben Blöcken, wie Erde, Sand und Kies. Sie können auch benutzt werden, um Grasblöcke zu Graspfaden zu verwandeln. Schaufeln können als Waffen benutzt werden, aber sie sind sehr schwach. +To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Um einen Grasblock in einen Graspfad zu verwandeln, benutzen Sie sie auf der Oberseite oder einer Seite eines Grasblocks. Das funktioniert nur, wenn sich Luft über dem Grasblock befindet. +Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Eine Schere ist ein Werkzeug, um Schafe zu scheren und ein paar Blocktypen abzubauen. Sie ist ein besonderes Grabewerkzeug, das benutzt werden kann, um den ursprünglichen Gegenstand von Gras, Blättern und ähnlichen Blöcken, die abgeschnitten werden müssen, zu erhalten. +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Um Schafe zu scheren oder gesichtslose Kürbisse zu schnitzen, benutzen Sie die „Platzieren“-Taste auf ihnen. Gesichter können nur an der Seite von gesichtslosen Kürbissen eingeschnitzt werden. Das Abbauen funktioniert wie bei anderen Werkzeugen, nur, dass die Abwürfe für ein paar Blöcke anders sind. +Wooden Pickaxe=Holzspitzhacke +Stone Pickaxe=Steinspitzhacke +Iron Pickaxe=Eisenspitzhacke +Golden Pickaxe=Goldspitzhacke +Diamond Pickaxe=Diamantspitzhacke +Wooden Shovel=Holzschaufel +Stone Shovel=Steinschaufel +Iron Shovel=Eisenschaufel +Golden Shovel=Goldschaufel +Diamond Shovel=Diamantschaufel +Wooden Axe=Holzaxt +Stone Axe=Steinaxt +Iron Axe=Eisenaxt +Golden Axe=Goldaxt +Diamond Axe=Diamantaxt +Wooden Sword=Holzschwert +Stone Sword=Steinschwert +Iron Sword=Eisenschwert +Golden Sword=Goldschwert +Diamond Sword=Diamantschwert +Shears=Schere diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.es.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.es.tr new file mode 100644 index 00000000..40b1d709 --- /dev/null +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.es.tr @@ -0,0 +1,32 @@ +# textdomain: mcl_tools +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Utiliza tu mano desnuda siempre que no estés empuñando ningún objeto. Con tu mano puedes extraer la mayoría de los bloques, pero este es el método más lento y solo los bloques más débiles producirán su caída útil. La mano también causa daños menores al golpear. El uso de la mano es a menudo un último recurso, ya que las herramientas y armas de minería adecuadas son mucho mejores. +When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Cuando empuñas un objeto que no es una herramienta de minería o un arma, se comportará como si fuera la mano cuando comiences a minar o golpear. +In Creative Mode, the hand is able to break all blocks instantly.=En el modo creativo, la mano puede romper todos los bloques al instante. +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Los picos son herramientas de minería para extraer bloques duros, como la piedra. Un pico también se puede usar como arma, pero es bastante ineficiente. +An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Un hacha es su herramienta de elección para cortar árboles, bloques a base de madera y otros bloques. Las hachas también causan mucho daño, pero son bastante lentas. +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Las espadas son excelentes en el combate cuerpo a cuerpo, ya que son rápidas, infligen mucho daño y pueden soportar innumerables batallas. Las espadas también se pueden usar para cortar algunos bloques en particular, como telarañas. +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Las palas son herramientas para cavar bloques gruesos, como tierra, arena y grava. También se pueden usar para convertir bloques de hierba en senderos de hierba. Las palas pueden usarse como armas, pero son muy débiles. +To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Para convertir un bloque de hierba en un camino de hierba, sostenga la pala con la mano y luego use (clic derecho) en la parte superior o lateral de un bloque de hierba. Esto solo funciona cuando hay aire sobre el bloque de hierba. +Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Las tijeras son herramientas para esquilar ovejas y extraer algunos tipos de bloques. Las tijeras son una herramienta de minería especial y se pueden usar para obtener el artículo original de hierba, hojas y bloques similares que requieren corte. +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Para esquilar ovejas o tallar calabazas sin rostro, use la tecla "colocar" en ellas. Las caras solo se pueden tallar al lado de las calabazas sin rostro. La minería funciona como de costumbre, pero las gotas son diferentes para algunos bloques. +Wooden Pickaxe=Pico de madera +Stone Pickaxe=Pico de piedra +Iron Pickaxe=Pico de hierro +Golden Pickaxe=Pico de oro +Diamond Pickaxe=Pico de diamante +Wooden Shovel=Pala de madera +Stone Shovel=Pala de piedra +Iron Shovel=Pala de hierro +Golden Shovel=Pala de oro +Diamond Shovel=Pala de diamante +Wooden Axe=Hacha de madera +Stone Axe=Hacha de piedra +Iron Axe=Hacha de hierro +Golden Axe=Hacha de oro +Diamond Axe=Hacha de diamante +Wooden Sword=Espada de madera +Stone Sword=Espada de piedra +Iron Sword=Espada de hierro +Golden Sword=Espada de oro +Diamond Sword=Espada de diamante +Shears=Tijeras diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr new file mode 100644 index 00000000..02cd7f2b --- /dev/null +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr @@ -0,0 +1,32 @@ +# textdomain: mcl_tools +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Vous utilisez votre main nue lorsque vous ne portez aucun objet. Avec votre main, vous pouvez miner la plupart des blocs, mais c'est la méthode la plus lente et seuls les blocs les plus faibles produiront un élément utile. La main inflige également des dégâts mineurs en frappant. L'utilisation de la main est souvent un dernier recours, car les outils et les armes d'extraction appropriés sont bien meilleurs. +When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Lorsque vous maniez un objet qui n'est ni un outil d'extraction ni une arme, il se comportera comme s'il s'agissait de la main lorsque vous commencez à extraire ou à frapper. +In Creative Mode, the hand is able to break all blocks instantly.=En mode créatif, la main est capable de briser tous les blocs instantanément. +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Les pioches sont des outils d'extraction pour extraire des blocs durs, comme la pierre. Une pioche peut également être utilisée comme arme, mais elle est plutôt inefficace. +An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Une hache est votre outil de choix pour abattre des arbres, des blocs à base de bois et d'autres blocs. Les haches infligent également beaucoup de dégâts, mais elles sont plutôt lentes. +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Les épées sont excellentes en combat de mêlée, car elles sont rapides, infligent des dégâts élevés et peuvent supporter d'innombrables batailles. Les épées peuvent également être utilisées pour couper quelques blocs particuliers, tels que les toiles d'araignées. +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Les pelles sont des outils pour creuser des blocs grossiers, tels que la terre, le sable et le gravier. Ils peuvent également être utilisés pour transformer des blocs d'herbe en chemins de terre. Les pelles peuvent être utilisées comme armes, mais elles sont très faibles. +To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Pour transformer un bloc d'herbe en chemin de terre, tenez la pelle dans votre main, puis utilisez (clic droit) le haut ou le côté d'un bloc d'herbe. Cela ne fonctionne que lorsqu'il y a de l'air au-dessus du bloc d'herbe. +Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Les cisailles sont des outils pour tondre les moutons et pour extraire quelques types de blocs. Les cisailles sont un outil d'extraction spécial et peuvent être utilisées pour obtenir l'élément d'origine à partir d'herbe, de feuilles et de blocs similaires qui nécessitent une coupe. +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Pour tondre des moutons ou tailler des citrouilles sans visage, utilisez la touche "placer" dessus. Les visages ne peuvent être sculptés que sur le côté des citrouilles sans visage. L'exploitation minière fonctionne comme d'habitude, mais les éléments sont différentes pour quelques blocs. +Wooden Pickaxe=Pioche en Bois +Stone Pickaxe=Pioche en Pierre +Iron Pickaxe=Pioche en Fer +Golden Pickaxe=Pioche en Or +Diamond Pickaxe=Pioche en Diamant +Wooden Shovel=Pelle en Bois +Stone Shovel=Pelle en Pierre +Iron Shovel=Pelle en Fer +Golden Shovel=Pelle en Or +Diamond Shovel=Pelle en Diamant +Wooden Axe=Hache en Bois +Stone Axe=Hache en Pierre +Iron Axe=Hache en Fer +Golden Axe=Hache en Or +Diamond Axe=Hache en Diamant +Wooden Sword=Épée en Bois +Stone Sword=Épée en Pierre +Iron Sword=Épée en Fer +Golden Sword=Épée en Or +Diamond Sword=Épée en Diamant +Shears=Cisailles diff --git a/mods/ITEMS/mcl_tools/locale/template.txt b/mods/ITEMS/mcl_tools/locale/template.txt new file mode 100644 index 00000000..ecb94105 --- /dev/null +++ b/mods/ITEMS/mcl_tools/locale/template.txt @@ -0,0 +1,32 @@ +# textdomain: mcl_tools +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.= +When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.= +In Creative Mode, the hand is able to break all blocks instantly.= +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.= +An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.= +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.= +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.= +To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.= +Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.= +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.= +Wooden Pickaxe= +Stone Pickaxe= +Iron Pickaxe= +Golden Pickaxe= +Diamond Pickaxe= +Wooden Shovel= +Stone Shovel= +Iron Shovel= +Golden Shovel= +Diamond Shovel= +Wooden Axe= +Stone Axe= +Iron Axe= +Golden Axe= +Diamond Axe= +Wooden Sword= +Stone Sword= +Iron Sword= +Golden Sword= +Diamond Sword= +Shears= diff --git a/mods/ITEMS/mcl_tools/textures/default_tool_diamondshovel.png b/mods/ITEMS/mcl_tools/textures/default_tool_diamondshovel.png index 6cc56111..9763dcb2 100644 Binary files a/mods/ITEMS/mcl_tools/textures/default_tool_diamondshovel.png and b/mods/ITEMS/mcl_tools/textures/default_tool_diamondshovel.png differ diff --git a/mods/ITEMS/mcl_tools/textures/default_tool_woodshovel.png b/mods/ITEMS/mcl_tools/textures/default_tool_woodshovel.png index e1855b5a..90505056 100644 Binary files a/mods/ITEMS/mcl_tools/textures/default_tool_woodshovel.png and b/mods/ITEMS/mcl_tools/textures/default_tool_woodshovel.png differ diff --git a/mods/ITEMS/mcl_torches/README.txt b/mods/ITEMS/mcl_torches/README.txt index 17353c82..a1dd8eb7 100644 --- a/mods/ITEMS/mcl_torches/README.txt +++ b/mods/ITEMS/mcl_torches/README.txt @@ -31,9 +31,8 @@ License: ~~~~~~~~ (c) Copyright BlockMen (2013-2015) -Textures and Meshes/Models: -CC-BY 3.0 BlockMen -Note that the models were entirely done from scratch by sofar. +Models: +CC-BY 3.0 by 22i Code: Licensed under the GNU LGPL version 2.1 or higher. diff --git a/mods/ITEMS/mcl_torches/init.lua b/mods/ITEMS/mcl_torches/init.lua index 742cc0c0..86cb917b 100644 --- a/mods/ITEMS/mcl_torches/init.lua +++ b/mods/ITEMS/mcl_torches/init.lua @@ -1,15 +1,53 @@ +local S = minetest.get_translator("mcl_torches") -- -- 3d torch part -- +-- Check if placement at given node is allowed +local function check_placement_allowed(node, wdir) + -- Torch placement rules: Disallow placement on some nodes. General rule: Solid, opaque, full cube collision box nodes are allowed. + -- Special allowed nodes: + -- * soul sand + -- * mob spawner + -- * chorus flower + -- * glass, barrier, ice + -- * Fence, wall, end portal frame with ender eye: Only on top + -- * Slab, stairs: Only on top if upside down + + -- Special forbidden nodes: + -- * Piston, sticky piston + local def = minetest.registered_nodes[node.name] + if not def then + return false + -- No ceiling torches + elseif wdir == 0 then + return false + elseif not def.buildable_to then + if node.name ~= "mcl_core:ice" and node.name ~= "mcl_nether:soul_sand" and node.name ~= "mcl_mobspawners:spawner" and node.name ~= "mcl_core:barrier" and node.name ~= "mcl_end:chorus_flower" and node.name ~= "mcl_end:chorus_flower_dead" and (not def.groups.glass) and + ((not def.groups.solid) or (not def.groups.opaque)) then + -- Only allow top placement on these nodes + if node.name == "mcl_end:dragon_egg" or node.name == "mcl_portals:end_portal_frame_eye" or def.groups.fence == 1 or def.groups.wall or def.groups.slab_top == 1 or def.groups.anvil or def.groups.pane or (def.groups.stair == 1 and minetest.facedir_to_dir(node.param2).y ~= 0) then + if wdir ~= 1 then + return false + end + else + return false + end + elseif minetest.get_item_group(node.name, "piston") >= 1 then + return false + end + end + return true +end + mcl_torches = {} mcl_torches.register_torch = function(substring, description, doc_items_longdesc, doc_items_usagehelp, icon, mesh_floor, mesh_wall, tiles, light, groups, sounds, moredef) local itemstring = minetest.get_current_modname()..":"..substring local itemstring_wall = minetest.get_current_modname()..":"..substring.."_wall" - if light == nil then light = 14 end + if light == nil then light = minetest.LIGHT_MAX end if mesh_floor == nil then mesh_floor = "mcl_torches_torch_floor.obj" end if mesh_wall == nil then mesh_wall = "mcl_torches_torch_wall.obj" end if groups == nil then groups = {} end @@ -40,8 +78,8 @@ mcl_torches.register_torch = function(substring, description, doc_items_longdesc drop = itemstring, selection_box = { type = "wallmounted", - wall_top = {-1/16, -2/16, -1/16, 1/16, 0.5, 1/16}, - wall_bottom = {-1/16, -0.5, -1/16, 1/16, 2/16, 1/16}, + wall_top = {-1/16, -1/16, -1/16, 1/16, 0.5, 1/16}, + wall_bottom = {-1/16, -0.5, -1/16, 1/16, 1/16, 1/16}, }, sounds = sounds, node_placement_prediction = "", @@ -66,35 +104,8 @@ mcl_torches.register_torch = function(substring, description, doc_items_longdesc local above = pointed_thing.above local wdir = minetest.dir_to_wallmounted({x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}) - -- Torch placement rules: Disallow placement on some nodes. General rule: Solid, opaque, full cube collision box nodes are allowed. - -- Special allowed nodes: - -- * soul sand - -- * end portal frame (TODO) - -- * monster spawner - -- * Fence, wall, glass, hopper: Only on top - -- * Monster spawner - -- * Slab: Only on top if upside down - -- * Stairs: Only on top if upside down - - -- Special forbidden nodes: - -- * Piston - -- * Sticky piston - if not def.buildable_to then - if node.name ~= "mcl_nether:soul_sand" and node.name ~= "mcl_mobspawners:spawner" and - ((not def.groups.solid) or (not def.groups.opaque)) then - -- Only allow top placement on these nodes - if def.groups.glass or node.name == "mcl_hoppers:hopper" or node.name == "mcl_hoppers:hopper_side" or def.groups.fence == 1 or def.groups.wall or def.groups.slab_top == 1 or (def.groups.stair == 1 and minetest.facedir_to_dir(node.param2).y ~= 0) then - if wdir ~= 1 then - return itemstack - end - else - return itemstack - end - elseif node.name == "mesecons_pistons:piston_up_normal_off" or node.name == "mesecons_pistons:piston_up_sticky_off" or - node.name == "mesecons_pistons:piston_normal_off" or node.name == "mesecons_pistons:piston_sticky_off" or - node.name == "mesecons_pistons:piston_down_normal_off" or node.name == "mesecons_pistons:piston_down_sticky_off" then - return itemstack - end + if check_placement_allowed(node, wdir) == false then + return itemstack end local itemstring = itemstack:get_name() @@ -102,10 +113,7 @@ mcl_torches.register_torch = function(substring, description, doc_items_longdesc local idef = fakestack:get_definition() local retval - if wdir == 0 then - -- Prevent placement of ceiling torches - return itemstack - elseif wdir == 1 then + if wdir == 1 then retval = fakestack:set_name(itemstring) else retval = fakestack:set_name(itemstring_wall) @@ -119,10 +127,11 @@ mcl_torches.register_torch = function(substring, description, doc_items_longdesc itemstack:set_name(itemstring) if success and idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=under, gain=1}) + minetest.sound_play(idef.sounds.place, {pos=under, gain=1}, true) end return itemstack - end + end, + on_rotate = false, } if moredef ~= nil then for k,v in pairs(moredef) do @@ -153,6 +162,7 @@ mcl_torches.register_torch = function(substring, description, doc_items_longdesc wall_side = {-0.5, -0.5, -0.1, -0.2, 0.1, 0.1}, }, sounds = sounds, + on_rotate = false, } if moredef ~= nil then for k,v in pairs(moredef) do @@ -170,20 +180,16 @@ mcl_torches.register_torch = function(substring, description, doc_items_longdesc end mcl_torches.register_torch("torch", - "Torch", - "Torches are light sources which can be placed at the side or on the top of most blocks.", - [[Torches can generally be placed on full solid opaque blocks. The following exceptions apply: -• Glass, fence, wall, hopper: Can only be placed on top -• Upside-down slab/stair: Can only be placed on top -• Soul sand, monster spawner: Placement possible -• Glowstone and pistons: No placement possible]], + S("Torch"), + S("Torches are light sources which can be placed at the side or on the top of most blocks."), + nil, "default_torch_on_floor.png", "mcl_torches_torch_floor.obj", "mcl_torches_torch_wall.obj", {{ name = "default_torch_on_floor_animated.png", animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} }}, - 14, + minetest.LIGHT_MAX, {dig_immediate=3, torch=1, deco_block=1}, mcl_sounds.node_sound_wood_defaults(), {_doc_items_hidden = false}) diff --git a/mods/ITEMS/mcl_torches/locale/mcl_torches.de.tr b/mods/ITEMS/mcl_torches/locale/mcl_torches.de.tr new file mode 100644 index 00000000..224106ab --- /dev/null +++ b/mods/ITEMS/mcl_torches/locale/mcl_torches.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_torches +Torch=Fackel +Torches are light sources which can be placed at the side or on the top of most blocks.=Fackeln sind Lichtquellen, die an der Seite oder der Oberseite der meisten Blöcke platziert werden können. diff --git a/mods/ITEMS/mcl_torches/locale/mcl_torches.es.tr b/mods/ITEMS/mcl_torches/locale/mcl_torches.es.tr new file mode 100644 index 00000000..18a81f5c --- /dev/null +++ b/mods/ITEMS/mcl_torches/locale/mcl_torches.es.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_torches +Torch=Antorcha +Torches are light sources which can be placed at the side or on the top of most blocks.=Las antorchas son fuentes de luz que se pueden colocar a un lado, en el suelo, o en la parte superior de la mayoría de los bloques. \ No newline at end of file diff --git a/mods/ITEMS/mcl_torches/locale/mcl_torches.fr.tr b/mods/ITEMS/mcl_torches/locale/mcl_torches.fr.tr new file mode 100644 index 00000000..394d58d4 --- /dev/null +++ b/mods/ITEMS/mcl_torches/locale/mcl_torches.fr.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_torches +Torch=Torche +Torches are light sources which can be placed at the side or on the top of most blocks.=Les torches sont des sources lumineuses qui peuvent être placées sur le côté ou sur le dessus de la plupart des blocs. diff --git a/mods/ITEMS/mcl_torches/locale/template.txt b/mods/ITEMS/mcl_torches/locale/template.txt new file mode 100644 index 00000000..447fba74 --- /dev/null +++ b/mods/ITEMS/mcl_torches/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_torches +Torch= +Torches are light sources which can be placed at the side or on the top of most blocks.= diff --git a/mods/ITEMS/mcl_torches/models/mcl_torches_torch_floor.obj b/mods/ITEMS/mcl_torches/models/mcl_torches_torch_floor.obj index e2487efe..ac4234d3 100644 --- a/mods/ITEMS/mcl_torches/models/mcl_torches_torch_floor.obj +++ b/mods/ITEMS/mcl_torches/models/mcl_torches_torch_floor.obj @@ -1,23 +1,14 @@ -# Blender v2.76 (sub 11) OBJ File: 'torch_floor.blend' +# Blender v2.76 (sub 0) OBJ File: 'torch_on_floor_node.blend' # www.blender.org -mtllib torch_floor.mtl -o Cube_Cube.001 -v 0.062500 0.062500 -0.062500 -v 0.062500 -0.500000 -0.062500 +o torch_Cube_Cube.001_Cube_Cube.001_Material.001 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.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 +v 0.062500 -0.500000 0.062500 +v 0.062500 -0.500000 -0.062500 +v -0.062500 -0.500000 -0.062500 vt 0.562500 0.500000 vt 0.562500 0.625000 vt 0.437500 0.625000 @@ -26,25 +17,13 @@ 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 -g Cube_Cube.001_Cube_Cube.001_Material.001 -usemtl Material.001 -s off -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 -g Cube_Cube.001_Cube_Cube.001_Material.002 -usemtl Material.002 -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 +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/1 6/6/1 7/7/1 8/8/1 +f 1/2/2 6/6/2 5/5/2 4/3/2 +f 2/3/3 1/2/3 6/6/3 7/5/3 +f 3/2/2 2/3/2 7/5/2 8/6/2 +f 4/3/3 5/5/3 8/6/3 3/2/3 diff --git a/mods/ITEMS/mcl_torches/models/mcl_torches_torch_wall.obj b/mods/ITEMS/mcl_torches/models/mcl_torches_torch_wall.obj index 57baa9e6..824223e6 100644 --- a/mods/ITEMS/mcl_torches/models/mcl_torches_torch_wall.obj +++ b/mods/ITEMS/mcl_torches/models/mcl_torches_torch_wall.obj @@ -1,31 +1,14 @@ -# Blender v2.76 (sub 11) OBJ File: 'torch_wall.blend' +# Blender v2.76 (sub 0) OBJ File: 'torch_on_wall_node.blend' # www.blender.org -mtllib torch_wall.mtl -o Cube_Cube.001 -v 0.062469 -0.195248 0.023570 -v 0.062469 -0.476498 -0.463570 +o torch_wall_Cube_Cube.001_Cube_Cube.001_Material.001 v 0.062469 -0.303502 0.086070 -v 0.062469 -0.584752 -0.401070 +v 0.062469 -0.195248 0.023570 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 +v 0.062469 -0.584752 -0.401070 +v 0.062469 -0.476498 -0.463570 +v -0.062531 -0.476498 -0.463570 vt 0.562500 0.500000 vt 0.562500 0.625000 vt 0.437500 0.625000 @@ -34,31 +17,13 @@ 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 -g Cube_Cube.001_Cube_Cube.001_Material.001 -usemtl Material.001 -s off -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 -g Cube_Cube.001_Cube_Cube.001_Material.002 -usemtl Material.002 -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 +vn 0.000000 0.500000 0.866000 +vn 0.000000 0.866000 -0.500000 +vn 1.000000 -0.000000 0.000000 +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/1 6/6/1 7/7/1 8/8/1 +f 1/2/2 6/6/2 5/5/2 4/3/2 +f 2/3/3 1/2/3 6/6/3 7/5/3 +f 3/2/2 2/3/2 7/5/2 8/6/2 +f 4/3/3 5/5/3 8/6/3 3/2/3 diff --git a/mods/ITEMS/mcl_torches/textures/default_torch_on_floor.png b/mods/ITEMS/mcl_torches/textures/default_torch_on_floor.png index cb0ce15f..d216c722 100644 Binary files a/mods/ITEMS/mcl_torches/textures/default_torch_on_floor.png and b/mods/ITEMS/mcl_torches/textures/default_torch_on_floor.png differ diff --git a/mods/ITEMS/mcl_totems/depends.txt b/mods/ITEMS/mcl_totems/depends.txt new file mode 100644 index 00000000..9b7650e0 --- /dev/null +++ b/mods/ITEMS/mcl_totems/depends.txt @@ -0,0 +1 @@ +mobs_mc diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua new file mode 100644 index 00000000..b4ec3eb8 --- /dev/null +++ b/mods/ITEMS/mcl_totems/init.lua @@ -0,0 +1,5 @@ +-- Node is currently defined in mobs_mc. +-- TODO: Add full item definition here when status effects become a thing. + +-- Add group for Creative Mode. +minetest.override_item("mobs_mc:totem", {groups = { combat_item=1}}) diff --git a/mods/ITEMS/mcl_walls/API.md b/mods/ITEMS/mcl_walls/API.md index 9efb8ce2..e6956ac4 100644 --- a/mods/ITEMS/mcl_walls/API.md +++ b/mods/ITEMS/mcl_walls/API.md @@ -20,9 +20,9 @@ If `craft_material` is not `nil` it also adds a crafting recipe of the following ### Parameters * `nodename`: Full itemstring of the new wall node (base node only). ***Must not have an underscore!*** * `description`: Item description of item (tooltip), visible to user -* `craft_material`: Item to be used in the crafting recipe. If `nil`, no crafting recipe will be added -* `tiles`: Wall textures table, same syntax as for `minetest.register_node` -* `inventory_image`: Inventory image (optional, default is an ugly 3D image) +* `source`: Node on which the wall is based off, use for texture and crafting recipe (optional) +* `tiles`: Wall textures table, same syntax as for `minetest.register_node` (optional if `source` is set) +* `inventory_image`: Inventory image (optional if `source` is set) * `groups`: Base group memberships (optional, default is `{pickaxey=1}`) * `sounds`: Sound table (optional, by default default uses stone sounds) diff --git a/mods/ITEMS/mcl_walls/depends.txt b/mods/ITEMS/mcl_walls/depends.txt index cbc0405c..de1f8a39 100644 --- a/mods/ITEMS/mcl_walls/depends.txt +++ b/mods/ITEMS/mcl_walls/depends.txt @@ -1,3 +1,6 @@ mcl_core +mcl_end +mcl_ocean +mcl_nether mcl_sounds doc? diff --git a/mods/ITEMS/mcl_walls/init.lua b/mods/ITEMS/mcl_walls/init.lua index c8aea25d..5704309d 100644 --- a/mods/ITEMS/mcl_walls/init.lua +++ b/mods/ITEMS/mcl_walls/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_walls") + mcl_walls = {} local function rshift(x, by) @@ -12,6 +14,10 @@ local directions = { {x = 0, y = -1, z = 0}, } +local function connectable(itemstring) + return (minetest.get_item_group(itemstring, "wall") == 1) or (minetest.get_item_group(itemstring, "solid") == 1) +end + local function update_wall(pos) local thisnode = minetest.get_node(pos) @@ -40,8 +46,7 @@ local function update_wall(pos) for i = 1, 4 do local dir = directions[i] local node = minetest.get_node({x = pos.x + dir.x, y = pos.y + dir.y, z = pos.z + dir.z}) - local def = minetest.registered_nodes[node.name] - if def and def.walkable then + if connectable(node.name) then sum = sum + 2 ^ (i - 1) end end @@ -49,8 +54,7 @@ local function update_wall(pos) -- Torches or walkable nodes above the wall local upnode = minetest.get_node({x = pos.x, y = pos.y+1, z = pos.z}) if sum == 5 or sum == 10 then - local def = minetest.registered_nodes[upnode.name] - if (def and def.walkable) or upnode.name == "mcl_torches:torch" then + if (connectable(upnode.name)) or (minetest.get_item_group(upnode.name, "torch") == 1) then sum = sum + 11 end end @@ -86,13 +90,13 @@ local full_blocks = { --[[ Adds a new wall type. * nodename: Itemstring of base node to add. Must not contain an underscore * description: Item description (tooltip), visible to user -* craft_material: Material for the default crafting recipe (optional) +* source: Source block to craft this thing, for graphics, tiles and crafting (optional) * tiles: Wall textures table * inventory_image: Inventory image (optional) * groups: Base group memberships (optional, default is {pickaxey=1}) * sounds: Sound table (optional, default is stone) ]] -function mcl_walls.register_wall(nodename, description, craft_material, tiles, inventory_image, groups, sounds) +function mcl_walls.register_wall(nodename, description, source, tiles, inventory_image, groups, sounds) local base_groups = groups if not base_groups then @@ -112,6 +116,12 @@ function mcl_walls.register_wall(nodename, description, craft_material, tiles, i sounds = mcl_sounds.node_sound_stone_defaults() end + if (not tiles) and source then + if minetest.registered_nodes[source] then + tiles = minetest.registered_nodes[source].tiles + end + end + for i = 0, 15 do local need = {} local need_pillar = false @@ -156,7 +166,7 @@ function mcl_walls.register_wall(nodename, description, craft_material, tiles, i fixed = take }, sounds = sounds, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) @@ -183,7 +193,7 @@ function mcl_walls.register_wall(nodename, description, craft_material, tiles, i fixed = {pillar, full_blocks[1]} }, sounds = sounds, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) -- Add entry alias for the Help @@ -208,7 +218,7 @@ function mcl_walls.register_wall(nodename, description, craft_material, tiles, i fixed = {pillar, full_blocks[2]} }, sounds = sounds, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) -- Add entry alias for the Help @@ -219,7 +229,7 @@ function mcl_walls.register_wall(nodename, description, craft_material, tiles, i -- Inventory item minetest.register_node(nodename, { description = description, - _doc_items_longdesc = "A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.", + _doc_items_longdesc = S("A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure."), paramtype = "light", sunlight_propagates = true, is_ground_content = false, @@ -239,26 +249,21 @@ function mcl_walls.register_wall(nodename, description, craft_material, tiles, i collisionbox = {-0.2, 0, -0.2, 0.2, 1.4, 0.2}, on_construct = update_wall, sounds = sounds, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 2, }) - if craft_material then + if source then minetest.register_craft({ output = nodename .. " 6", recipe = { - {craft_material, craft_material, craft_material}, - {craft_material, craft_material, craft_material}, + {source, source, source}, + {source, source, source}, } }) end end --- Cobblestone wall -mcl_walls.register_wall("mcl_walls:cobble", "Cobblestone Wall", "mcl_core:cobble", {"default_cobble.png"}) - --- Mossy wall - -mcl_walls.register_wall("mcl_walls:mossycobble", "Mossy Cobblestone Wall", "mcl_core:mossycobble", {"default_mossycobble.png"}) +dofile(minetest.get_modpath("mcl_walls") .. "/register.lua") minetest.register_on_placenode(update_wall_global) minetest.register_on_dignode(update_wall_global) diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr new file mode 100644 index 00000000..d4e7a640 --- /dev/null +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_walls +A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Ein Stück Mauer. Mit einem einfachen Sprung kann es nicht übersprungen werden. Wenn mehrere von diesen Blöcken nebeneinander platziert werden, werden sie automatisch ein nettes Mauerbauwerk ergeben. +Cobblestone Wall=Kopfsteinpflastermauer +Mossy Cobblestone Wall=Moosige Kopfsteinpflastermauer +Andesite Wall=Andesitmauer +Granite Wall=Granitmauer +Diorite Wall=Dioritmauer +Brick Wall=Ziegelmauer +Sandstone Wall=Sandsteinmauer +Red Sandstone Wall=Rote Sandsteinmauer +Stone Brick Wall=Steinziegelmauer +Mossy Stone Brick Wall=Moosige Steinziegelmauer +Prismarine Wall=Prismarinmauer +End Stone Brick Wall=Endsteinziegelmauer +Nether Brick Wall=Netherziegelmauer +Red Nether Brick Wall=Rote Netherziegelmauer diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.es.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.es.tr new file mode 100644 index 00000000..3fb3d6ad --- /dev/null +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.es.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_walls +A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Un pedazo de pared. No se puede saltar con un simple salto. Cuando varios de estos se colocan uno al lado del otro, construirán automáticamente una bonita estructura de pared. +Cobblestone Wall=Muro de roca +Mossy Cobblestone Wall=Muro de roca musgosa +Andesite Wall=Muro de andesita +Granite Wall=Muro de granito +Diorite Wall=Muro de diorita +Brick Wall=Muro de ladrillos +Sandstone Wall=Muro de arenisca +Red Sandstone Wall=Muro de arenisca roja +Stone Brick Wall=Muro de ladrillos de piedra +Mossy Stone Brick Wall=Muro de ladrillos de piedra musgosos +Prismarine Wall=Muro de prismarina +End Stone Brick Wall=Muro de ladrillos de piedra del End +Nether Brick Wall=Muro de ladrillos del Nether +Red Nether Brick Wall=Muro de ladrillos del Nether rojos diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr new file mode 100644 index 00000000..e4bbfd0d --- /dev/null +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_walls +A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Un morceau de mur. Il ne peut pas être sauté par un simple saut. Lorsque plusieurs d'entre eux sont placés les uns à côté des autres, ils construiront automatiquement une belle structure de mur. +Cobblestone Wall=Muret de Pierres +Mossy Cobblestone Wall=Muret de Pierres Moussu +Andesite Wall=Muret d'Andésite +Granite Wall=Muret de Granite +Diorite Wall=Muret de Diorite +Brick Wall=Muret en Brique +Sandstone Wall=Muret de Grès +Red Sandstone Wall=Muret de Grès Rouge +Stone Brick Wall=Muret de Pierre Taillé +Mossy Stone Brick Wall=Muret de Pierre Taillé Moussue +Prismarine Wall=Muret de Prismarine +End Stone Brick Wall=Muret de Brique de l'End +Nether Brick Wall=Muret de Brique du Nether +Red Nether Brick Wall=Muret de Brique Rouge du Nether diff --git a/mods/ITEMS/mcl_walls/locale/template.txt b/mods/ITEMS/mcl_walls/locale/template.txt new file mode 100644 index 00000000..76536599 --- /dev/null +++ b/mods/ITEMS/mcl_walls/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: mcl_walls +A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.= +Cobblestone Wall= +Mossy Cobblestone Wall= +Andesite Wall= +Granite Wall= +Diorite Wall= +Brick Wall= +Sandstone Wall= +Red Sandstone Wall= +Stone Brick Wall= +Mossy Stone Brick Wall= +Prismarine Wall= +End Stone Brick Wall= +Nether Brick Wall= +Red Nether Brick Wall= diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua new file mode 100644 index 00000000..0ccefd62 --- /dev/null +++ b/mods/ITEMS/mcl_walls/register.lua @@ -0,0 +1,16 @@ +local S = minetest.get_translator("mcl_walls") + +mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}) +mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}) +mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite") +mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite") +mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite") +mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block") +mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone") +mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone") +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick") +mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy") +mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine") +mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks") +mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick") +mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick") diff --git a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_side.png b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_side.png new file mode 100644 index 00000000..cb10162c Binary files /dev/null and b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_side.png differ diff --git a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_top.png b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_top.png new file mode 100644 index 00000000..df7ff940 Binary files /dev/null and b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_top.png differ diff --git a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_side.png b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_side.png new file mode 100644 index 00000000..a827c3a4 Binary files /dev/null and b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_side.png differ diff --git a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_top.png b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_top.png new file mode 100644 index 00000000..ce77d202 Binary files /dev/null and b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_top.png differ diff --git a/mods/ITEMS/mcl_wool/depends.txt b/mods/ITEMS/mcl_wool/depends.txt index 3d96266d..9699080a 100644 --- a/mods/ITEMS/mcl_wool/depends.txt +++ b/mods/ITEMS/mcl_wool/depends.txt @@ -1 +1,2 @@ mcl_sounds +doc? diff --git a/mods/ITEMS/mcl_wool/init.lua b/mods/ITEMS/mcl_wool/init.lua index 6aed9589..22648efc 100644 --- a/mods/ITEMS/mcl_wool/init.lua +++ b/mods/ITEMS/mcl_wool/init.lua @@ -1,3 +1,6 @@ +local S = minetest.get_translator("mcl_wool") +local mod_doc = minetest.get_modpath("doc") + -- minetest/wool/init.lua -- Backwards compatibility with jordach's 16-color wool mod @@ -9,52 +12,72 @@ local wool = {} -- colors, and then some recipes using more specific colors for a few non-base -- colors available. When crafting, the last recipes will be checked first. wool.dyes = { - {"white", "white", "White", nil, "basecolor_white"}, - {"grey", "dark_grey", "Grey", "dark_grey", "unicolor_darkgrey"}, - {"silver", "grey", "Light Grey", "grey", "basecolor_grey"}, - {"black", "black", "Black", "black", "basecolor_black"}, - {"red", "red", "Red", "red", "basecolor_red"}, - {"yellow", "yellow", "Yellow", "yellow", "basecolor_yellow"}, - {"green", "green", "Green", "dark_green", "unicolor_dark_green"}, - {"cyan", "cyan", "Cyan", "cyan", "basecolor_cyan"}, - {"blue", "blue", "Blue", "blue", "basecolor_blue"}, - {"magenta", "magenta", "Magenta", "magenta", "basecolor_magenta"}, - {"orange", "orange", "Orange", "orange", "excolor_orange"}, - {"purple", "violet", "Purple", "violet", "excolor_violet"}, - {"brown", "brown", "Brown", "brown", "unicolor_dark_orange"}, - {"pink", "pink", "Pink", "pink", "unicolor_light_red"}, - {"lime", "lime", "Lime", "green", "basecolor_green"}, - {"light_blue", "light_blue", "Light Blue", "lightblue", "unicolor_light_blue"}, + -- name, texture, wool desc., carpet desc., dye, color_group + {"white", "wool_white", S("White Wool"), S("White Carpet"), nil, "unicolor_white"}, + {"grey", "wool_dark_grey", S("Grey Wool"), S("Grey Carpet"), "dark_grey", "unicolor_darkgrey"}, + {"silver", "wool_grey", S("Light Grey Wool"), S("Light Grey Carpet"), "grey", "unicolor_grey"}, + {"black", "wool_black", S("Black Wool"), S("Black Carpet"), "black", "unicolor_black"}, + {"red", "wool_red", S("Red Wool"), S("Red Carpet"), "red", "unicolor_red"}, + {"yellow", "wool_yellow", S("Yellow Wool"), S("Yellow Carpet"), "yellow", "unicolor_yellow"}, + {"green", "wool_dark_green", S("Green Wool"), S("Green Carpet"), "dark_green", "unicolor_dark_green"}, + {"cyan", "wool_cyan", S("Cyan Wool"), S("Cyan Carpet"), "cyan", "unicolor_cyan"}, + {"blue", "wool_blue", S("Blue Wool"), S("Blue Carpet"), "blue", "unicolor_blue"}, + {"magenta", "wool_magenta", S("Magenta Wool"), S("Magenta Carpet"), "magenta", "unicolor_red_violet"}, + {"orange", "wool_orange", S("Orange Wool"), S("Orange Carpet"), "orange", "unicolor_orange"}, + {"purple", "wool_violet", S("Purple Wool"), S("Purple Carpet"), "violet", "unicolor_violet"}, + {"brown", "wool_brown", S("Brown Wool"), S("Brown Carpet"), "brown", "unicolor_dark_orange"}, + {"pink", "wool_pink", S("Pink Wool"), S("Pink Carpet"), "pink", "unicolor_light_red"}, + {"lime", "mcl_wool_lime", S("Lime Wool"), S("Lime Carpet"), "green", "unicolor_green"}, + {"light_blue", "mcl_wool_light_blue", S("Light Blue Wool"), S("Light Blue Carpet"), "lightblue", "unicolor_light_blue"}, } +local canonical_color = "white" for _, row in ipairs(wool.dyes) do local name = row[1] local texture = row[2] - local desc = row[3] - local dye = row[4] - local color_group = row[5] + local desc_wool = row[3] + local desc_carpet = row[4] + local dye = row[5] + local color_group = row[6] + local longdesc_wool, longdesc_carpet, create_entry, name_wool, name_carpet + local is_canonical = name == canonical_color + if mod_doc then + if is_canonical then + longdesc_wool = S("Wool is a decorative block which comes in many different colors.") + longdesc_carpet = S("Carpets are thin floor covers which come in many different colors.") + name_wool = S("Wool") + name_carpet = S("Carpet") + else + create_entry = false + end + end -- Node Definition minetest.register_node("mcl_wool:"..name, { - description = desc.." Wool", - _doc_items_longdesc = "Wool is a decorational block which comes in many different colors.", + description = desc_wool, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = name_wool, + _doc_items_longdesc = longdesc_wool, stack_max = 64, is_ground_content = false, - tiles = {"wool_"..texture..".png"}, - groups = {handy=1,shearsy_wool=1, flammable=1,wool=1,building_block=1}, - sounds = mcl_sounds.node_sound_defaults(), + tiles = {texture..".png"}, + groups = {handy=1,shearsy_wool=1, flammable=1,fire_encouragement=30, fire_flammability=60, wool=1,building_block=1,[color_group]=1}, + sounds = mcl_sounds.node_sound_wool_defaults(), _mcl_hardness = 0.8, - _mcl_blast_resistance = 4, + _mcl_blast_resistance = 0.8, }) minetest.register_node("mcl_wool:"..name.."_carpet", { - description = desc.." Carpet", - _doc_items_longdesc = "Carpets are thin floor covers which come in many different colors.", - walkable = false, + description = desc_carpet, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = name_carpet, + _doc_items_longdesc = longdesc_carpet, + + walkable = false, -- See is_ground_content = false, - tiles = {"wool_"..texture..".png"}, - wield_image = "wool_"..texture..".png", + tiles = {texture..".png"}, + wield_image = texture..".png", wield_scale = { x=1, y=1, z=0.5 }, - groups = {handy=1, carpet=1,attached_node=1,dig_by_water=1,deco_block=1}, - sounds = mcl_sounds.node_sound_defaults(), + groups = {handy=1, carpet=1,attached_node=1,flammable=1,fire_encouragement=60, fire_flammability=20, dig_by_water=1,deco_block=1,[color_group]=1}, + sounds = mcl_sounds.node_sound_wool_defaults(), paramtype = "light", sunlight_propagates = true, stack_max = 64, @@ -66,8 +89,12 @@ for _, row in ipairs(wool.dyes) do }, }, _mcl_hardness = 0.1, - _mcl_blast_resistance = 0.5, + _mcl_blast_resistance = 0.1, }) + if mod_doc and not is_canonical then + doc.add_entry_alias("nodes", "mcl_wool:"..canonical_color, "nodes", "mcl_wool:"..name) + doc.add_entry_alias("nodes", "mcl_wool:"..canonical_color.."_carpet", "nodes", "mcl_wool:"..name.."_carpet") + end if dye then -- Crafting from dye and white wool minetest.register_craft({ diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr new file mode 100644 index 00000000..5b979d51 --- /dev/null +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_wool +Wool=Wolle +Carpet=Teppich +White Wool=Weiße Wolle +White Carpet=Weißer Teppich +Grey Wool=Graue Wolle +Grey Carpet=Grauer Teppich +Light Grey Wool=Hellgraue Wolle +Light Grey Carpet=Hellgrauer Teppich +Black Wool=Schwarze Wolle +Black Carpet=Schwarzer Teppich +Red Wool=Rote Wolle +Red Carpet=Roter Teppich +Yellow Wool=Gelbe Wolle +Yellow Carpet=Gelber Teppich +Green Wool=Grüne Wolle +Green Carpet=Grüner Teppich +Cyan Wool=Türkise Wolle +Cyan Carpet=Türkiser Teppich +Blue Wool=Blaue Wolle +Blue Carpet=Blauer Teppich +Magenta Wool=Magenta Wolle +Magenta Carpet=Magenta Teppich +Orange Wool=Orange Wolle +Orange Carpet=Orange Teppich +Purple Wool=Violette Wolle +Purple Carpet=Violetter Teppich +Brown Wool=Braune Wolle +Brown Carpet=Brauner Teppich +Pink Wool=Rosa Wolle +Pink Carpet=Rosa Teppich +Lime Wool=Lindgrüne Wolle +Lime Carpet=Lindgrüner Teppich +Light Blue Wool=Hellblaue Wolle +Light Blue Carpet=Hellblauer Teppich +Wool is a decorative block which comes in many different colors.=Wolle ist ein dekorativer Block, den es in vielen verschiedenen Farben gibt. +Carpets are thin floor covers which come in many different colors.=Teppiche sind dünne Bodenbeläge, die es in vielen verschiedenen Farben gibt. diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.es.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.es.tr new file mode 100644 index 00000000..fa9253ee --- /dev/null +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.es.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_wool +Wool=Lana +Carpet=Alfombra +White Wool=Lana blanca +White Carpet=Alfombra blanca +Grey Wool=Lana gris +Grey Carpet=Alfombra gris +Light Grey Wool=Lana gris claro +Light Grey Carpet=Alfombra gris claro +Black Wool=Lana negra +Black Carpet=Alfombra negra +Red Wool=Lana roja +Red Carpet=Alfombra roja +Yellow Wool=Lana amarilla +Yellow Carpet=Alfombra amarilla +Green Wool=Lana verde +Green Carpet=Alfombra verde +Cyan Wool=Lana cian +Cyan Carpet=Alfombra cian +Blue Wool=Lana azul +Blue Carpet=Alfombra azul +Magenta Wool=Lana magenta +Magenta Carpet=Alfombra magenta +Orange Wool=Lana naranja +Orange Carpet=Alfombra naranja +Purple Wool=Lana morada +Purple Carpet=Alfombra morada +Brown Wool=Lana marrón +Brown Carpet=Alfombra marrón +Pink Wool=Lana rosa +Pink Carpet=Alfombra rosa +Lime Wool=Lana verde lima +Lime Carpet=Alfombra verde lima +Light Blue Wool=Lana azul claro +Light Blue Carpet=Alfombra azul claro +Wool is a decorative block which comes in many different colors.=WLa lana es un bloque decorativo que viene en muchos colores diferentes. +Carpets are thin floor covers which come in many different colors.=Las alfombras son finas cubiertas para el suelo que vienen en muchos colores diferentes. diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.fr.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.fr.tr new file mode 100644 index 00000000..6b93eab0 --- /dev/null +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.fr.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_wool +Wool=Laine +Carpet=Tapis +White Wool=Laine Blanche +White Carpet=Tapis Blanc +Grey Wool=Laine Grise +Grey Carpet=Tapis Gris +Light Grey Wool=Laine Gris Clair +Light Grey Carpet=Tapis Gris Clair +Black Wool=Laine Noire +Black Carpet=Tapis Noir +Red Wool=Laine Rouge +Red Carpet=Tapis Rouge +Yellow Wool=Laine Jaune +Yellow Carpet=Tapis Jaune +Green Wool=Laine Verte +Green Carpet=Tapis Vert +Cyan Wool=Lain Cyan +Cyan Carpet=Tapis Cyan +Blue Wool=Laine Bleue +Blue Carpet=Tapis Bleu +Magenta Wool=Laine Magenta +Magenta Carpet=Tapis Magenta +Orange Wool=Laine Orange +Orange Carpet=Tapis Orange +Purple Wool=Laine Violette +Purple Carpet=Tapis Violet +Brown Wool=Laine Marron +Brown Carpet=Tapis Marron +Pink Wool=Laine Rose +Pink Carpet=Tapis Rose +Lime Wool=Laine Vert Clair +Lime Carpet=Tapis Vert Clair +Light Blue Wool=Laine Bleu Clair +Light Blue Carpet=Tapis Bleu Clair +Wool is a decorative block which comes in many different colors.=La laine est un bloc décoratif disponible en différentes couleurs. +Carpets are thin floor covers which come in many different colors.=Les tapis sont des revêtements de sol minces qui viennent dans de nombreuses couleurs différentes. diff --git a/mods/ITEMS/mcl_wool/locale/template.txt b/mods/ITEMS/mcl_wool/locale/template.txt new file mode 100644 index 00000000..26de1ec7 --- /dev/null +++ b/mods/ITEMS/mcl_wool/locale/template.txt @@ -0,0 +1,37 @@ +# textdomain: mcl_wool +Wool= +Carpet= +White Wool= +White Carpet= +Grey Wool= +Grey Carpet= +Light Grey Wool= +Light Grey Carpet= +Black Wool= +Black Carpet= +Red Wool= +Red Carpet= +Yellow Wool= +Yellow Carpet= +Green Wool= +Green Carpet= +Cyan Wool= +Cyan Carpet= +Blue Wool= +Blue Carpet= +Magenta Wool= +Magenta Carpet= +Orange Wool= +Orange Carpet= +Purple Wool= +Purple Carpet= +Brown Wool= +Brown Carpet= +Pink Wool= +Pink Carpet= +Lime Wool= +Lime Carpet= +Light Blue Wool= +Light Blue Carpet= +Wool is a decorative block which comes in many different colors.= +Carpets are thin floor covers which come in many different colors.= diff --git a/mods/ITEMS/mcl_wool/textures/mcl_wool_light_blue.png b/mods/ITEMS/mcl_wool/textures/mcl_wool_light_blue.png new file mode 100644 index 00000000..010b8a8c Binary files /dev/null and b/mods/ITEMS/mcl_wool/textures/mcl_wool_light_blue.png differ diff --git a/mods/ITEMS/mcl_wool/textures/mcl_wool_lime.png b/mods/ITEMS/mcl_wool/textures/mcl_wool_lime.png new file mode 100644 index 00000000..e9de9a36 Binary files /dev/null and b/mods/ITEMS/mcl_wool/textures/mcl_wool_lime.png differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_brown.png b/mods/ITEMS/mcl_wool/textures/wool_brown.png index 04cf6eb8..fac3ceff 100644 Binary files a/mods/ITEMS/mcl_wool/textures/wool_brown.png and b/mods/ITEMS/mcl_wool/textures/wool_brown.png differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_cyan.png b/mods/ITEMS/mcl_wool/textures/wool_cyan.png index d4e48d6a..25d3e2f0 100644 Binary files a/mods/ITEMS/mcl_wool/textures/wool_cyan.png and b/mods/ITEMS/mcl_wool/textures/wool_cyan.png differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_dark_green.png b/mods/ITEMS/mcl_wool/textures/wool_dark_green.png new file mode 100644 index 00000000..9d17bfdc Binary files /dev/null and b/mods/ITEMS/mcl_wool/textures/wool_dark_green.png differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_dark_grey.png b/mods/ITEMS/mcl_wool/textures/wool_dark_grey.png index e2af0870..aa0be74b 100644 Binary files a/mods/ITEMS/mcl_wool/textures/wool_dark_grey.png and b/mods/ITEMS/mcl_wool/textures/wool_dark_grey.png differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_green.png b/mods/ITEMS/mcl_wool/textures/wool_green.png deleted file mode 100644 index 9e3c29f2..00000000 Binary files a/mods/ITEMS/mcl_wool/textures/wool_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_grey.png b/mods/ITEMS/mcl_wool/textures/wool_grey.png index 69273bfe..e604a914 100644 Binary files a/mods/ITEMS/mcl_wool/textures/wool_grey.png and b/mods/ITEMS/mcl_wool/textures/wool_grey.png differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_light_blue.png b/mods/ITEMS/mcl_wool/textures/wool_light_blue.png deleted file mode 100644 index 3d37d909..00000000 Binary files a/mods/ITEMS/mcl_wool/textures/wool_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_lime.png b/mods/ITEMS/mcl_wool/textures/wool_lime.png deleted file mode 100644 index 6d57a55d..00000000 Binary files a/mods/ITEMS/mcl_wool/textures/wool_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_magenta.png b/mods/ITEMS/mcl_wool/textures/wool_magenta.png index 6f727a97..f6889b44 100644 Binary files a/mods/ITEMS/mcl_wool/textures/wool_magenta.png and b/mods/ITEMS/mcl_wool/textures/wool_magenta.png differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_red.png b/mods/ITEMS/mcl_wool/textures/wool_red.png index 4c84133a..1602f0ea 100644 Binary files a/mods/ITEMS/mcl_wool/textures/wool_red.png and b/mods/ITEMS/mcl_wool/textures/wool_red.png differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_violet.png b/mods/ITEMS/mcl_wool/textures/wool_violet.png index 12fb3ebb..92a20df2 100644 Binary files a/mods/ITEMS/mcl_wool/textures/wool_violet.png and b/mods/ITEMS/mcl_wool/textures/wool_violet.png differ diff --git a/mods/ITEMS/mcl_wool/textures/wool_white.png b/mods/ITEMS/mcl_wool/textures/wool_white.png index 794cbb15..c3695550 100644 Binary files a/mods/ITEMS/mcl_wool/textures/wool_white.png and b/mods/ITEMS/mcl_wool/textures/wool_white.png differ diff --git a/mods/ITEMS/gemalde/depends.txt b/mods/ITEMS/mclx_core/depends.txt similarity index 64% rename from mods/ITEMS/gemalde/depends.txt rename to mods/ITEMS/mclx_core/depends.txt index 315237e0..870d9cb0 100644 --- a/mods/ITEMS/gemalde/depends.txt +++ b/mods/ITEMS/mclx_core/depends.txt @@ -1 +1,2 @@ mcl_core +doc? diff --git a/mods/ITEMS/mclx_core/description.txt b/mods/ITEMS/mclx_core/description.txt new file mode 100644 index 00000000..422e6da5 --- /dev/null +++ b/mods/ITEMS/mclx_core/description.txt @@ -0,0 +1 @@ +Core items not found in Minecraft diff --git a/mods/ITEMS/mclx_core/init.lua b/mods/ITEMS/mclx_core/init.lua new file mode 100644 index 00000000..bc17e007 --- /dev/null +++ b/mods/ITEMS/mclx_core/init.lua @@ -0,0 +1,54 @@ +local S = minetest.get_translator("mclx_core") + +-- Liquids: River Water + +local source = table.copy(minetest.registered_nodes["mcl_core:water_source"]) +source.description = S("River Water Source") +source.liquid_range = 2 +source.liquid_alternative_flowing = "mclx_core:river_water_flowing" +source.liquid_alternative_source = "mclx_core:river_water_source" +source.liquid_renewable = false +source._doc_items_longdesc = S("River water has the same properties as water, but has a reduced flowing distance and is not renewable.") +source._doc_items_entry_name = S("River Water") +-- Auto-expose entry only in valleys mapgen +source._doc_items_hidden = minetest.get_mapgen_setting("mg_name") ~= "valleys" +source.post_effect_color = {a=192, r=0x2c, g=0x88, b=0x8c} +source.tiles = { + {name="default_river_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}} +} +source.special_tiles = { + -- New-style water source material (mostly unused) + { + name="default_river_water_source_animated.png", + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}, + backface_culling = false, + } +} + +local flowing = table.copy(minetest.registered_nodes["mcl_core:water_flowing"]) +flowing.description = S("Flowing River Water") +flowing.liquid_range = 2 +flowing.liquid_alternative_flowing = "mclx_core:river_water_flowing" +flowing.liquid_alternative_source = "mclx_core:river_water_source" +flowing.liquid_renewable = false +flowing.tiles = {"default_river_water_flowing_animated.png^[verticalframe:64:0"} +flowing.post_effect_color = {a=192, r=0x2c, g=0x88, b=0x8c} +flowing.special_tiles = { + { + image="default_river_water_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, + { + image="default_river_water_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, +} + +minetest.register_node("mclx_core:river_water_source", source) +minetest.register_node("mclx_core:river_water_flowing", flowing) + +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mclx_core:river_water_source", "nodes", "mclx_core:river_water_flowing") +end diff --git a/mods/ITEMS/mclx_core/locale/mclx_core.de.tr b/mods/ITEMS/mclx_core/locale/mclx_core.de.tr new file mode 100644 index 00000000..f4591810 --- /dev/null +++ b/mods/ITEMS/mclx_core/locale/mclx_core.de.tr @@ -0,0 +1,5 @@ +# textdomain: mclx_core +River Water Source=Flusswasserquelle +River water has the same properties as water, but has a reduced flowing distance and is not renewable.=Flusswasser hat die gleichen Eigenschaften wie Wasser, aber es hat eine reduzierte Fließweite und ist nicht erneuerbar. +River Water=Flusswasser +Flowing River Water=Fließendes Flusswasser diff --git a/mods/ITEMS/mclx_core/locale/mclx_core.es.tr b/mods/ITEMS/mclx_core/locale/mclx_core.es.tr new file mode 100644 index 00000000..0f50a08c --- /dev/null +++ b/mods/ITEMS/mclx_core/locale/mclx_core.es.tr @@ -0,0 +1,5 @@ +# textdomain: mclx_core +River Water Source=Fuente de agua de río +River water has the same properties as water, but has a reduced flowing distance and is not renewable.=El agua del río tiene las mismas propiedades que el agua, pero tiene una distancia de flujo reducida y no es renovable. +River Water=Agua de rio +Flowing River Water=Agua de río que fluye diff --git a/mods/ITEMS/mclx_core/locale/mclx_core.fr.tr b/mods/ITEMS/mclx_core/locale/mclx_core.fr.tr new file mode 100644 index 00000000..eaabebec --- /dev/null +++ b/mods/ITEMS/mclx_core/locale/mclx_core.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mclx_core +River Water Source=Source d'eau de rivière +River water has the same properties as water, but has a reduced flowing distance and is not renewable.=L'eau de rivière a les mêmes propriétés que l'eau, mais a une distance d'écoulement réduite et n'est pas renouvelable. +River Water=L'eau de rivière +Flowing River Water=Eau de rivière qui coule diff --git a/mods/ITEMS/mclx_core/locale/template.txt b/mods/ITEMS/mclx_core/locale/template.txt new file mode 100644 index 00000000..1486ee30 --- /dev/null +++ b/mods/ITEMS/mclx_core/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mclx_core +River Water Source= +River water has the same properties as water, but has a reduced flowing distance and is not renewable.= +River Water= +Flowing River Water= diff --git a/mods/ITEMS/mclx_core/mod.conf b/mods/ITEMS/mclx_core/mod.conf new file mode 100644 index 00000000..235cf6d3 --- /dev/null +++ b/mods/ITEMS/mclx_core/mod.conf @@ -0,0 +1 @@ +name = mclx_core diff --git a/mods/ITEMS/mclx_core/textures/default_river_water_flowing_animated.png b/mods/ITEMS/mclx_core/textures/default_river_water_flowing_animated.png new file mode 100644 index 00000000..9e126d3c Binary files /dev/null and b/mods/ITEMS/mclx_core/textures/default_river_water_flowing_animated.png differ diff --git a/mods/ITEMS/mclx_core/textures/default_river_water_source_animated.png b/mods/ITEMS/mclx_core/textures/default_river_water_source_animated.png new file mode 100644 index 00000000..fb8ae17b Binary files /dev/null and b/mods/ITEMS/mclx_core/textures/default_river_water_source_animated.png differ diff --git a/mods/ITEMS/mclx_fences/README.txt b/mods/ITEMS/mclx_fences/README.txt new file mode 100644 index 00000000..784e8b6c --- /dev/null +++ b/mods/ITEMS/mclx_fences/README.txt @@ -0,0 +1,18 @@ +## Extra fences +This mod adds a few extra fences to MCL2. + +## Licensing +The sound files + + mcl_fences_nether_brick_fence_gate_open.ogg + +and + + mcl_fences_nether_brick_fence_gate_close.ogg + +were derived from sounds made by Freesound.org user Slanesh. +The license is CC BY 3.0 . + +Source: + +Everything else is under the MIT License. diff --git a/mods/ITEMS/mclx_fences/depends.txt b/mods/ITEMS/mclx_fences/depends.txt new file mode 100644 index 00000000..640669f2 --- /dev/null +++ b/mods/ITEMS/mclx_fences/depends.txt @@ -0,0 +1 @@ +mcl_fences diff --git a/mods/ITEMS/mclx_fences/description.txt b/mods/ITEMS/mclx_fences/description.txt new file mode 100644 index 00000000..57005b4c --- /dev/null +++ b/mods/ITEMS/mclx_fences/description.txt @@ -0,0 +1 @@ +Additional fences and fence gates diff --git a/mods/ITEMS/mclx_fences/init.lua b/mods/ITEMS/mclx_fences/init.lua new file mode 100644 index 00000000..08c3d91a --- /dev/null +++ b/mods/ITEMS/mclx_fences/init.lua @@ -0,0 +1,66 @@ +local S = minetest.get_translator("mclx_fences") + +-- Red Nether Brick Fence + +mcl_fences.register_fence_and_fence_gate( + "red_nether_brick_fence", + S("Red Nether Brick Fence"), S("Red Nether Brick Fence Gate"), + "mcl_fences_fence_red_nether_brick.png", + {pickaxey=1, deco_block=1, fence_nether_brick=1}, + minetest.registered_nodes["mcl_nether:red_nether_brick"]._mcl_hardness, + minetest.registered_nodes["mcl_nether:red_nether_brick"]._mcl_blast_resistance, + {"group:fence_nether_brick"}, + mcl_sounds.node_sound_stone_defaults(), "mcl_fences_nether_brick_fence_gate_open", "mcl_fences_nether_brick_fence_gate_close", 1, 1, + "mcl_fences_fence_gate_red_nether_brick.png") + +mcl_fences.register_fence_gate( + "nether_brick_fence", + S("Nether Brick Fence Gate"), + "mcl_fences_fence_gate_nether_brick.png", + {pickaxey=1, deco_block=1, fence_nether_brick=1}, + minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_hardness, + minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_blast_resistance, + mcl_sounds.node_sound_stone_defaults(), "mcl_fences_nether_brick_fence_gate_open", "mcl_fences_nether_brick_fence_gate_close", 1, 1) + +-- Crafting + +minetest.register_craft({ + output = 'mclx_fences:red_nether_brick_fence 6', + recipe = { + {"mcl_nether:red_nether_brick", "mcl_nether:netherbrick", "mcl_nether:red_nether_brick"}, + {"mcl_nether:red_nether_brick", "mcl_nether:netherbrick", "mcl_nether:red_nether_brick"}, + } +}) + +minetest.register_craft({ + output = 'mclx_fences:red_nether_brick_fence_gate', + recipe = { + {"mcl_nether:nether_wart_item", "mcl_nether:red_nether_brick", "mcl_nether:netherbrick"}, + {"mcl_nether:netherbrick", "mcl_nether:red_nether_brick", "mcl_nether:nether_wart_item"}, + } +}) +minetest.register_craft({ + output = 'mclx_fences:red_nether_brick_fence_gate', + recipe = { + {"mcl_nether:netherbrick", "mcl_nether:red_nether_brick", "mcl_nether:nether_wart_item"}, + {"mcl_nether:nether_wart_item", "mcl_nether:red_nether_brick", "mcl_nether:netherbrick"}, + } +}) + +minetest.register_craft({ + output = 'mclx_fences:nether_brick_fence_gate 2', + recipe = { + {"mcl_nether:netherbrick", "mcl_nether:nether_brick", "mcl_nether:netherbrick"}, + {"mcl_nether:netherbrick", "mcl_nether:nether_brick", "mcl_nether:netherbrick"}, + } +}) + + +-- Aliases for mcl_supplemental +minetest.register_alias("mcl_supplemental:red_nether_brick_fence", "mclx_fences:red_nether_brick_fence") + +minetest.register_alias("mcl_supplemental:nether_brick_fence_gate", "mclx_fences:nether_brick_fence_gate") +minetest.register_alias("mcl_supplemental:nether_brick_fence_gate_open", "mclx_fences:nether_brick_fence_gate_open") + +minetest.register_alias("mcl_supplemental:red_nether_brick_fence_gate", "mclx_fences:red_nether_brick_fence_gate") +minetest.register_alias("mcl_supplemental:red_nether_brick_fence_gate_open", "mclx_fences:red_nether_brick_fence_gate_open") diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr new file mode 100644 index 00000000..9aab0264 --- /dev/null +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr @@ -0,0 +1,4 @@ +# textdomain: mclx_fences +Red Nether Brick Fence=Roter Netherziegelzaun +Red Nether Brick Fence Gate=Rotes Netherziegelzauntor +Nether Brick Fence Gate=Netherziegelzauntor diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.es.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.es.tr new file mode 100644 index 00000000..4531435b --- /dev/null +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.es.tr @@ -0,0 +1,4 @@ +# textdomain: mclx_fences +Red Nether Brick Fence=Valla de ladrillo abisal rojo +Red Nether Brick Fence Gate=Puerta de ladrillo abisal rojo +Nether Brick Fence Gate=Puerta de ladrillo abisal diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr new file mode 100644 index 00000000..244b588c --- /dev/null +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mclx_fences +Red Nether Brick Fence=Barrière en Brique Rouge du Nether +Red Nether Brick Fence Gate=Porte de Barrière en Brique Rouge du Nether +Nether Brick Fence Gate=Porte de Barrière en Brique du Nether diff --git a/mods/ITEMS/mclx_fences/locale/template.txt b/mods/ITEMS/mclx_fences/locale/template.txt new file mode 100644 index 00000000..e6c05c7f --- /dev/null +++ b/mods/ITEMS/mclx_fences/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mclx_fences +Red Nether Brick Fence= +Red Nether Brick Fence Gate= +Nether Brick Fence Gate= diff --git a/mods/ITEMS/mclx_fences/mod.conf b/mods/ITEMS/mclx_fences/mod.conf new file mode 100644 index 00000000..b53158aa --- /dev/null +++ b/mods/ITEMS/mclx_fences/mod.conf @@ -0,0 +1 @@ +name = mclx_fences diff --git a/mods/ITEMS/mclx_fences/sounds/mcl_fences_nether_brick_fence_gate_close.ogg b/mods/ITEMS/mclx_fences/sounds/mcl_fences_nether_brick_fence_gate_close.ogg new file mode 100644 index 00000000..4e7b3fe7 Binary files /dev/null and b/mods/ITEMS/mclx_fences/sounds/mcl_fences_nether_brick_fence_gate_close.ogg differ diff --git a/mods/ITEMS/mclx_fences/sounds/mcl_fences_nether_brick_fence_gate_open.ogg b/mods/ITEMS/mclx_fences/sounds/mcl_fences_nether_brick_fence_gate_open.ogg new file mode 100644 index 00000000..4c2108e6 Binary files /dev/null and b/mods/ITEMS/mclx_fences/sounds/mcl_fences_nether_brick_fence_gate_open.ogg differ diff --git a/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_nether_brick.png b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_nether_brick.png new file mode 100644 index 00000000..58bc85db Binary files /dev/null and b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_nether_brick.png differ diff --git a/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_red_nether_brick.png b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_red_nether_brick.png new file mode 100644 index 00000000..599cf1bf Binary files /dev/null and b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_red_nether_brick.png differ diff --git a/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_red_nether_brick.png b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_red_nether_brick.png new file mode 100644 index 00000000..24e08e0f Binary files /dev/null and b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_red_nether_brick.png differ diff --git a/mods/ITEMS/mclx_stairs/depends.txt b/mods/ITEMS/mclx_stairs/depends.txt new file mode 100644 index 00000000..49805c17 --- /dev/null +++ b/mods/ITEMS/mclx_stairs/depends.txt @@ -0,0 +1,8 @@ +mcl_ocean +mcl_core +mcl_sounds +mcl_nether +mcl_end +mcl_colorblocks +mcl_stairs +doc? diff --git a/mods/ITEMS/mclx_stairs/description.txt b/mods/ITEMS/mclx_stairs/description.txt new file mode 100644 index 00000000..896be59b --- /dev/null +++ b/mods/ITEMS/mclx_stairs/description.txt @@ -0,0 +1 @@ +Additional stairs and slabs not found in Minecraft 1.11 diff --git a/mods/ITEMS/mclx_stairs/init.lua b/mods/ITEMS/mclx_stairs/init.lua new file mode 100644 index 00000000..450436da --- /dev/null +++ b/mods/ITEMS/mclx_stairs/init.lua @@ -0,0 +1,115 @@ +local S = minetest.get_translator("mclx_stairs") +local doc_mod = minetest.get_modpath("doc") + + +local barks = { + { "", S("Oak Bark Stairs"), S("Oak Bark Slab"), S("Double Oak Bark Slab") }, + { "jungle", S("Jungle Bark Stairs"), S("Jungle Bark Slab"), S("Double Jungle Bark Slab") }, + { "acacia", S("Acacia Bark Stairs"), S("Acacia Bark Slab"), S("Double Acacia Bark Slab") }, + { "spruce", S("Spruce Bark Stairs"), S("Spruce Bark Slab"), S("Double Spruce Bark Slab") }, + { "birch", S("Birch Bark Stairs"), S("Birch Bark Slab"), S("Double Birch Bark Slab") }, + { "dark", S("Dark Oak Bark Stairs"), S("Dark Oak Bark Slab"), S("Double Dark Oak Bark Slab") }, +} + +for b=1, #barks do + local bark = barks[b] + local sub = bark[1].."tree_bark" + local id = "mcl_core:tree" + if bark[1] ~= "" then + id = "mcl_core:"..bark[1].."tree" + end + mcl_stairs.register_stair(sub, id, + {handy=1,axey=1, flammable=3, bark_stairs=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + {minetest.registered_nodes[id].tiles[3]}, + bark[2], + mcl_sounds.node_sound_wood_defaults(), + 2, + "woodlike") + mcl_stairs.register_slab(sub, id, + {handy=1,axey=1, flammable=3, bark_slab=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + {minetest.registered_nodes[id].tiles[3]}, + bark[3], + mcl_sounds.node_sound_wood_defaults(), + 2, + bark[4]) +end + +mcl_stairs.register_slab("lapisblock", "mcl_core:lapisblock", {pickaxey=3}, {"mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_stairs_lapis_block_slab.png"}, S("Lapis Lazuli Slab"), nil, nil, S("Double Lapis Lazuli Slab")) +mcl_stairs.register_stair("lapisblock", "mcl_core:lapisblock", {pickaxey=3}, {"mcl_stairs_lapis_block_slab.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_stairs_lapis_block_slab.png"}, S("Lapis Lazuli Stairs"), nil, nil, "woodlike") + +mcl_stairs.register_slab("goldblock", "mcl_core:goldblock", {pickaxey=4}, {"default_gold_block.png", "default_gold_block.png", "mcl_stairs_gold_block_slab.png"}, S("Slab of Gold"), nil, nil, S("Double Slab of Gold")) +mcl_stairs.register_stair("goldblock", "mcl_core:goldblock", {pickaxey=4}, {"mcl_stairs_gold_block_slab.png", "default_gold_block.png", "default_gold_block.png", "default_gold_block.png", "default_gold_block.png", "mcl_stairs_gold_block_slab.png"}, S("Stairs of Gold"), nil, nil, "woodlike") + +mcl_stairs.register_slab("ironblock", "mcl_core:ironblock", {pickaxey=2}, {"default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, S("Slab of Iron"), nil, nil, S("Double Slab of Iron")) +mcl_stairs.register_stair("ironblock", "mcl_core:ironblock", {pickaxey=2}, {"mcl_stairs_iron_block_slab.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, S("Stairs of Iron"), nil, nil, "woodlike") + +mcl_stairs.register_stair("stonebrickcracked", "mcl_core:stonebrickcracked", + {pickaxey=1}, + {"mcl_core_stonebrick_cracked.png"}, + S("Cracked Stone Brick Stairs"), + mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrickcracked") + +mcl_stairs.register_slab("stonebrickcracked", "mcl_core:stonebrickcracked", + {pickaxey=1}, + {"mcl_core_stonebrick_cracked.png"}, + S("Cracked Stone Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Cracked Stone Brick Slab"), "mcl_core:stonebrickcracked") + +local block = {} +block.dyes = { + {"white", S("White Concrete Stairs"), S("White Concrete Slab"), S("Double White Concrete Slab"), "white"}, + {"grey", S("Grey Concrete Stairs"), S("Grey Concrete Slab"), S("Double Grey Concrete Slab"), "dark_grey"}, + {"silver", S("Light Grey Concrete Stairs"), S("Light Grey Concrete Slab"), S("Double Light Grey Concrete Slab"), "grey"}, + {"black", S("Black Concrete Stairs"), S("Black Concrete Slab"), S("Double Black Concrete Slab"), "black"}, + {"red", S("Red Concrete Stairs"), S("Red Concrete Slab"), S("Double Red Concrete Slab"), "red"}, + {"yellow", S("Yellow Concrete Stairs"), S("Yellow Concrete Slab"), S("Double Yellow Concrete Slab"), "yellow"}, + {"green", S("Green Concrete Stairs"), S("Green Concrete Slab"), S("Double Green Concrete Slab"), "dark_green"}, + {"cyan", S("Cyan Concrete Stairs"), S("Cyan Concrete Slab"), S("Double Cyan Concrete Slab"), "cyan"}, + {"blue", S("Blue Concrete Stairs"), S("Blue Concrete Slab"), S("Double Blue Concrete Slab"), "blue"}, + {"magenta", S("Magenta Concrete Stairs"), S("Magenta Concrete Slab"), S("Double Magenta Concrete Slab"), "magenta"}, + {"orange", S("Orange Concrete Stairs"), S("Orange Concrete Slab"), S("Double Orange Concrete Slab"), "orange"}, + {"purple", S("Purple Concrete Stairs"), S("Purple Concrete Slab"), S("Double Purple Concrete Slab"), "violet"}, + {"brown", S("Brown Concrete Stairs"), S("Brown Concrete Slab"), S("Double Brown Concrete Slab"), "brown"}, + {"pink", S("Pink Concrete Stairs"), S("Pink Concrete Slab"), S("Double Pink Concrete Slab"), "pink"}, + {"lime", S("Lime Concrete Stairs"), S("Lime Concrete Slab"), S("Double Lime Concrete Slab"), "green"}, + {"light_blue", S("Light Blue Concrete Stairs"), S("Light Blue Concrete Slab"), S("Double Light Blue Concrete Slab"), "lightblue"}, +} +local canonical_color = "yellow" + +for i=1, #block.dyes do + local c = block.dyes[i][1] + local is_canonical = c == canonical_color + mcl_stairs.register_stair_and_slab_simple("concrete_"..c, "mcl_colorblocks:concrete_"..c, + block.dyes[i][2], + block.dyes[i][3], + block.dyes[i][4]) + + if doc_mod then + if not is_canonical then + doc.add_entry_alias("nodes", "mcl_stairs:slab_concrete_"..canonical_color, "nodes", "mcl_stairs:slab_concrete_"..c) + doc.add_entry_alias("nodes", "mcl_stairs:slab_concrete_"..canonical_color.."_double", "nodes", "mcl_stairs:slab_concrete_"..c.."_double") + doc.add_entry_alias("nodes", "mcl_stairs:stair_concrete_"..canonical_color, "nodes", "mcl_stairs:stair_concrete_"..c) + minetest.override_item("mcl_stairs:slab_concrete_"..c, { _doc_items_create_entry = false }) + minetest.override_item("mcl_stairs:slab_concrete_"..c.."_double", { _doc_items_create_entry = false }) + minetest.override_item("mcl_stairs:stair_concrete_"..c, { _doc_items_create_entry = false }) + else + minetest.override_item("mcl_stairs:slab_concrete_"..c, { _doc_items_entry_name = S("Concrete Slab") }) + minetest.override_item("mcl_stairs:slab_concrete_"..c.."_double", { _doc_items_entry_name = S("Double Concrete Slab") }) + minetest.override_item("mcl_stairs:stair_concrete_"..c, { _doc_items_entry_name = S("Concrete Stairs") }) + end + end +end + +-- Fuel +minetest.register_craft({ + type = "fuel", + recipe = "group:bark_stairs", + -- Same as wood stairs + burntime = 15, +}) +minetest.register_craft({ + type = "fuel", + recipe = "group:bark_slab", + -- Same as wood slab + burntime = 8, +}) diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr new file mode 100644 index 00000000..c6f9f65d --- /dev/null +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr @@ -0,0 +1,82 @@ +# textdomain: mclx_stairs +Oak Bark Stairs=Eichenrindentreppe +Oak Bark Slab=Eichenrindenplatte +Double Oak Bark Slab=Doppeleichenrindenplatte +Acacia Bark Stairs=Akazienrindentreppe +Acacia Bark Slab=Akazienrindenplatte +Double Acacia Bark Slab=Doppelakazienrindenplatte +Spruce Bark Stairs=Fichtenrindentreppe +Spruce Bark Slab=Fichtenrindenplatte +Double Spruce Bark Slab=Doppelfichtenrindenplatte +Birch Bark Stairs=Birkenrindentreppe +Birch Bark Slab=Birkenrindenplatte +Double Birch Bark Slab=Doppelbirkenrindenplatte +Jungle Bark Stairs=Dschungelrindentreppe +Jungle Bark Slab=Dschungelrindenplatte +Double Jungle Bark Slab=Doppelschungelbirkenplatte +Dark Oak Bark Stairs=Schwarzeichenrindentreppe +Dark Oak Bark Slab=Schwarzeichenrindenplatte +Double Dark Oak Bark Slab=Doppelschwarzeichenrindenplatte +Lapis Lazuli Slab=Lapislazuliplatte +Double Lapis Lazuli Slab=Doppellapislazuliplatte +Lapis Lazuli Stairs=Lapislazulitreppe +Slab of Gold=Goldplatte +Double Slab of Gold=Doppelgoldplatte +Stairs of Gold=Goldtreppe +Slab of Iron=Eisenplatte +Double Slab of Iron=Doppeleisenplatte +Stairs of Iron=Eisentreppe +Cracked Stone Brick Stairs=Rissige Steinziegeltreppe +Cracked Stone Brick Slab=Rissige Steinziegelplatte +Double Cracked Stone Brick Slab=Doppelte rissige Steinziegelplatte +White Concrete Stairs=Weiße Betontreppe +White Concrete Slab=Weiße Betonplatte +Double White Concrete Slab=Doppelte weiße Betonplatte +Grey Concrete Stairs=Graue Betontreppe +Grey Concrete Slab=Graue Betonplatte +Double Grey Concrete Slab=Doppelte graue Betonplatte +Light Grey Concrete Stairs=Hellgraue Betontreppe +Light Grey Concrete Slab=Hellgraue Betonplatte +Double Light Grey Concrete Slab=Doppelte hellgraue Betonplatte +Black Concrete Stairs=Schwarze Betontreppe +Black Concrete Slab=Schwarze Betonplatte +Double Black Concrete Slab=Doppelte schwarze Betonplatte +Red Concrete Stairs=Rote Betontreppe +Red Concrete Slab=Rote Betonplatte +Double Red Concrete Slab=Doppelte rote Betonplatte +Yellow Concrete Stairs=Gelbe Betontreppe +Yellow Concrete Slab=Gelbe Betonplatte +Double Yellow Concrete Slab=Doppelte gelbe Betonplatte +Green Concrete Stairs=Grüne Betontreppe +Green Concrete Slab=Grüne Betonplatte +Double Green Concrete Slab=Doppelte grüne Betonplatte +Cyan Concrete Stairs=Türkise Betontreppe +Cyan Concrete Slab=Türkise Betonplatte +Double Cyan Concrete Slab=Doppelte Türkise Betonplatte +Blue Concrete Stairs=Blaue Betontreppe +Blue Concrete Slab=Blaue Betonplatte +Double Blue Concrete Slab=Doppelte blaue Betonplatte +Magenta Concrete Stairs=Magenta Betontreppe +Magenta Concrete Slab=Magenta Betonplatte +Double Magenta Concrete Slab=Doppelte magenta Betonplatte +Orange Concrete Stairs=Orange Betontreppe +Orange Concrete Slab=Orange Betonplatte +Double Orange Concrete Slab=Doppelte orange Betonplatte +Purple Concrete Stairs=Violette Betontreppe +Purple Concrete Slab=Violette Betonplatte +Double Purple Concrete Slab=Doppelte violette Betonplatte +Brown Concrete Stairs=Braune Betontreppe +Brown Concrete Slab=Braune Betonplatte +Double Brown Concrete Slab=Doppelte braune Betonplatte +Pink Concrete Stairs=Rosa Betontreppe +Pink Concrete Slab=Rosa Betonplatte +Double Pink Concrete Slab=Doppelte rosa Betonplatte +Lime Concrete Stairs=Lindgrüne Betontreppe +Lime Concrete Slab=Lindgrüne Betonplatte +Double Lime Concrete Slab=Doppelte Betonplatte +Light Blue Concrete Stairs=Hellblaue Betontreppe +Light Blue Concrete Slab=Hellblaue Betonplatte +Double Light Blue Concrete Slab=Doppelte hellblaue Betonplatte +Concrete Slab=Betonplatte +Double Concrete Slab=Doppelte Betonplatte +Concrete Stairs=Betontreppe diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.es.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.es.tr new file mode 100644 index 00000000..302ae7f2 --- /dev/null +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.es.tr @@ -0,0 +1,82 @@ +# textdomain: mclx_stairs +Oak Bark Stairs=Escaleras de roble +Oak Bark Slab=Losa de roble +Double Oak Bark Slab=Losa doble de roble +Acacia Bark Stairs=Escaleras de acacia +Acacia Bark Slab=Losa de acacia +Double Acacia Bark Slab=Losa doble de acacia +Spruce Bark Stairs=Escaleras de abeto +Spruce Bark Slab=Losa de abeto +Double Spruce Bark Slab=Losa doble de abeto +Birch Bark Stairs=Escaleras de abedul +Birch Bark Slab=Losa de abedul +Double Birch Bark Slab=Losa doble de abedul +Jungle Bark Stairs=Escaleras de jungla +Jungle Bark Slab=Losa de jungla +Double Jungle Bark Slab=Losa doble de jungla +Dark Oak Bark Stairs=Escaleras de roble oscuro +Dark Oak Bark Slab=Losa de roble oscuro +Double Dark Oak Bark Slab=Losa doble de roble oscuro +Lapis Lazuli Slab=Losa de lapislázuli +Double Lapis Lazuli Slab=Losa doble de lapislázuli +Lapis Lazuli Stairs=Escaleras de lapislázuli +Slab of Gold=Losa de oro +Double Slab of Gold=Losa doble de oro +Stairs of Gold=Escaleras de oro +Slab of Iron=Losa de hierro +Double Slab of Iron=Losa doble de hierro +Stairs of Iron=Escaleras de hierro +Cracked Stone Brick Stairs=Escaleras de ladrillo de piedra agrietada +Cracked Stone Brick Slab=Losa de ladrillo de piedra agrietada +Double Cracked Stone Brick Slab=Losa doble de ladrillo de piedra agrietada +White Concrete Stairs=Escaleras de hormigón blanco +White Concrete Slab=Losa de hormigón blanco +Double White Concrete Slab=Losa doble de hormigón blanco +Grey Concrete Stairs=Escaleras de hormigón gris +Grey Concrete Slab=Losas de hormigón gris +Double Grey Concrete Slab=Losa doble de hormigón gris +Light Grey Concrete Stairs=Escaleras de hormigón gris claro +Light Grey Concrete Slab=Losa de hormigón gris claro +Double Light Grey Concrete Slab=Losa doble de hormigón gris claro +Black Concrete Stairs=Escaleras de hormigón negro +Black Concrete Slab=Losa de hormigón negro +Double Black Concrete Slab=Losa doble de hormigón negro +Red Concrete Stairs=Escaleras de hormigón rojo +Red Concrete Slab=Losa de hormigón rojo +Double Red Concrete Slab=Losa doble de hormigón rojo +Yellow Concrete Stairs=Escaleras de hormigón amarillo +Yellow Concrete Slab=Losa de hormigón amarillo +Double Yellow Concrete Slab=Losa doble de hormigón amarillo +Green Concrete Stairs=Escaleras de hormigón verde +Green Concrete Slab=Losa de hormigón verde +Double Green Concrete Slab=Losa doble de hormigón verde +Cyan Concrete Stairs=Escaleras de hormigón cian +Cyan Concrete Slab=Losa de hormigón cian +Double Cyan Concrete Slab=Losa doble de hormigón cian +Blue Concrete Stairs=Escaleras de hormigón azul +Blue Concrete Slab=Losa de hormigón azul +Double Blue Concrete Slab=Losa doble de hormigón azul +Magenta Concrete Stairs=Escaleras de hormigón magenta +Magenta Concrete Slab=Losa de hormigón magenta +Double Magenta Concrete Slab=Losa doble de hormigón magenta +Orange Concrete Stairs=Escaleras de hormigón naranja +Orange Concrete Slab=Losa de hormigón naranja +Double Orange Concrete Slab=Losa doble de hormigón naranja +Purple Concrete Stairs=Escaleras de hormigón morado +Purple Concrete Slab=Losa de hormigón morado +Double Purple Concrete Slab=Losa doble de hormigón morado +Brown Concrete Stairs=Escaleras de hormigón marrón +Brown Concrete Slab=Losa de hormigón marrón +Double Brown Concrete Slab=Losa doble de hormigón marrón +Pink Concrete Stairs=Escaleras de hormigón rosa +Pink Concrete Slab=Losa de hormigón rosa +Double Pink Concrete Slab=Losa doble de hormigón rosa +Lime Concrete Stairs=Escaleras de hormigón verde lima +Lime Concrete Slab=Losa de hormigón verde lima +Double Lime Concrete Slab=Losa doble de hormigón verde lima +Light Blue Concrete Stairs=Escaleras de hormigón azul claro +Light Blue Concrete Slab=Losa de hormigón azul claro +Double Light Blue Concrete Slab=Losa doble de hormigón azul claro +Concrete Slab=Losa de hormigón +Double Concrete Slab=Losa doble de hormigón +Concrete Stairs=Escaleras de hormigón diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr new file mode 100644 index 00000000..98becd49 --- /dev/null +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr @@ -0,0 +1,82 @@ +# textdomain: mclx_stairs +Oak Bark Stairs=Escalier en écorse de Chêne +Oak Bark Slab=Plaque d'écorce de Chêne +Double Oak Bark Slab=Double Dalle d'écorce de Chêne +Acacia Bark Stairs=Escalier en écorce d'Acacia +Acacia Bark Slab=Plaque d'écorce d'Acacia +Double Acacia Bark Slab=Double Dalle d'écorce d'Acacia +Spruce Bark Stairs=Escalier en écorse de Sapin +Spruce Bark Slab=Plaque d'écorce de Sapin +Double Spruce Bark Slab=Double Dalle d'écorce de Sapin +Birch Bark Stairs=Escalier en écorse de Bouleau +Birch Bark Slab=Plaque d'écorce de Bouleau +Double Birch Bark Slab=Double Dalle d'écorce de Bouleau +Jungle Bark Stairs=Escalier en écorse d'Acajou +Jungle Bark Slab=Plaque d'écorce d'Acajou +Double Jungle Bark Slab=Double Dalle d'écorce d'Acajou +Dark Oak Bark Stairs=Escalier en écorse de Chêne Noir +Dark Oak Bark Slab=Plaque d'écorce de Chêne Noir +Double Dark Oak Bark Slab=Double Dalle d'écorce de Chêne Noir +Lapis Lazuli Slab=Dalle de Lapis Lazuli +Double Lapis Lazuli Slab=Double Dalle de Lapis Lazuli +Lapis Lazuli Stairs=Escalier de Lapis Lazuli +Slab of Gold=Dalle en Or +Double Slab of Gold=Double Dalle en Or +Stairs of Gold=Escalier en Or +Slab of Iron=Dalle en Fer +Double Slab of Iron=Double Dalle en Fer +Stairs of Iron=Escalier en Fer +Cracked Stone Brick Stairs=Escalier en Brique de Pierre Fissurée +Cracked Stone Brick Slab=Dalle de Brique de Pierre Fissurée +Double Cracked Stone Brick Slab=Double Dalle de Brique de Pierre Fissurée +White Concrete Stairs=Escalier en Béton Blanc +White Concrete Slab=Dalle en Béton Blanc +Double White Concrete Slab=Double Dalle en Béton Blanc +Grey Concrete Stairs=Escalier en Béton Gris +Grey Concrete Slab=Dalle en Béton Gris +Double Grey Concrete Slab=Double Dalle en Béton Gris +Light Grey Concrete Stairs=Escalier en Béton Gris Clair +Light Grey Concrete Slab=Dalle en Béton Gris Clair +Double Light Grey Concrete Slab=Double Dalle en Béton Gris Clair +Black Concrete Stairs=Escalier en Béton Noir +Black Concrete Slab=Dalle en Béton Noir +Double Black Concrete Slab=Double Dalle en Béton Noir +Red Concrete Stairs=Escalier en Béton Rouge +Red Concrete Slab=Dalle en Béton Rouge +Double Red Concrete Slab=Double Dalle en Béton Rouge +Yellow Concrete Stairs=Escalier en Béton Jaune +Yellow Concrete Slab=Dalle en Béton Jaune +Double Yellow Concrete Slab=Double Dalle en Béton Jaune +Green Concrete Stairs=Escalier en Béton Vert +Green Concrete Slab=Dalle en Béton Vert +Double Green Concrete Slab=Double Dalle en Béton Vert +Cyan Concrete Stairs=Escalier en Béton Cyan +Cyan Concrete Slab=Dalle en Béton Cyan +Double Cyan Concrete Slab=Double Dalle en Béton Cyan +Blue Concrete Stairs=Escalier en Béton Bleu +Blue Concrete Slab=Dalle en Béton Bleu +Double Blue Concrete Slab=Double Dalle en Béton Bleu +Magenta Concrete Stairs=Escalier en Béton Magenta +Magenta Concrete Slab=Dalle en Béton Magenta +Double Magenta Concrete Slab=Double Dalle en Béton Magenta +Orange Concrete Stairs=Escalier en Béton Orange +Orange Concrete Slab=Dalle en Béton Orange +Double Orange Concrete Slab=Double Dalle en Béton Orange +Purple Concrete Stairs=Escalier en Béton Violet +Purple Concrete Slab=Dalle en Béton Violet +Double Purple Concrete Slab=Double Dalle en Béton Violet +Brown Concrete Stairs=Escalier en Béton Marron +Brown Concrete Slab=Dalle en Béton Marron +Double Brown Concrete Slab=Double Dalle en Béton Marron +Pink Concrete Stairs=Escalier en Béton Rose +Pink Concrete Slab=Dalle en Béton Rose +Double Pink Concrete Slab=Double Dalle en Béton Rose +Lime Concrete Stairs=Escalier en Béton Vert Clair +Lime Concrete Slab=Dalle en Béton Vert Clair +Double Lime Concrete Slab=Double Dalle en Béton Vert Clair +Light Blue Concrete Stairs=Escalier en Béton Bleu Clair +Light Blue Concrete Slab=Dalle en Béton Bleu Clair +Double Light Blue Concrete Slab=Double Dalle en Béton Bleu Clair +Concrete Slab=Dalle en Béton +Double Concrete Slab=Double Dalle en Béton +Concrete Stairs=Escalier en Béton diff --git a/mods/ITEMS/mclx_stairs/locale/template.txt b/mods/ITEMS/mclx_stairs/locale/template.txt new file mode 100644 index 00000000..b6272dbc --- /dev/null +++ b/mods/ITEMS/mclx_stairs/locale/template.txt @@ -0,0 +1,82 @@ +# textdomain: mclx_stairs +Oak Bark Stairs= +Oak Bark Slab= +Double Oak Bark Slab= +Acacia Bark Stairs= +Acacia Bark Slab= +Double Acacia Bark Slab= +Spruce Bark Stairs= +Spruce Bark Slab= +Double Spruce Bark Slab= +Birch Bark Stairs= +Birch Bark Slab= +Double Birch Bark Slab= +Jungle Bark Stairs= +Jungle Bark Slab= +Double Jungle Bark Slab= +Dark Oak Bark Stairs= +Dark Oak Bark Slab= +Double Dark Oak Bark Slab= +Lapis Lazuli Slab= +Double Lapis Lazuli Slab= +Lapis Lazuli Stairs= +Slab of Gold= +Double Slab of Gold= +Stairs of Gold= +Slab of Iron= +Double Slab of Iron= +Stairs of Iron= +Cracked Stone Brick Stairs= +Cracked Stone Brick Slab= +Double Cracked Stone Brick Slab= +White Concrete Stairs= +White Concrete Slab= +Double White Concrete Slab= +Grey Concrete Stairs= +Grey Concrete Slab= +Double Grey Concrete Slab= +Light Grey Concrete Stairs= +Light Grey Concrete Slab= +Double Light Grey Concrete Slab= +Black Concrete Stairs= +Black Concrete Slab= +Double Black Concrete Slab= +Red Concrete Stairs= +Red Concrete Slab= +Double Red Concrete Slab= +Yellow Concrete Stairs= +Yellow Concrete Slab= +Double Yellow Concrete Slab= +Green Concrete Stairs= +Green Concrete Slab= +Double Green Concrete Slab= +Cyan Concrete Stairs= +Cyan Concrete Slab= +Double Cyan Concrete Slab= +Blue Concrete Stairs= +Blue Concrete Slab= +Double Blue Concrete Slab= +Magenta Concrete Stairs= +Magenta Concrete Slab= +Double Magenta Concrete Slab= +Orange Concrete Stairs= +Orange Concrete Slab= +Double Orange Concrete Slab= +Purple Concrete Stairs= +Purple Concrete Slab= +Double Purple Concrete Slab= +Brown Concrete Stairs= +Brown Concrete Slab= +Double Brown Concrete Slab= +Pink Concrete Stairs= +Pink Concrete Slab= +Double Pink Concrete Slab= +Lime Concrete Stairs= +Lime Concrete Slab= +Double Lime Concrete Slab= +Light Blue Concrete Stairs= +Light Blue Concrete Slab= +Double Light Blue Concrete Slab= +Concrete Slab= +Double Concrete Slab= +Concrete Stairs= diff --git a/mods/ITEMS/mclx_stairs/mod.conf b/mods/ITEMS/mclx_stairs/mod.conf new file mode 100644 index 00000000..9d514a88 --- /dev/null +++ b/mods/ITEMS/mclx_stairs/mod.conf @@ -0,0 +1 @@ +name = mclx_stairs diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_andesite_smooth_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_andesite_smooth_slab.png new file mode 100644 index 00000000..b2ccfa1d Binary files /dev/null and b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_andesite_smooth_slab.png differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_diorite_smooth_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_diorite_smooth_slab.png new file mode 100644 index 00000000..2fd10111 Binary files /dev/null and b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_diorite_smooth_slab.png differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_gold_block_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_gold_block_slab.png new file mode 100644 index 00000000..b8da4ede Binary files /dev/null and b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_gold_block_slab.png differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_granite_smooth_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_granite_smooth_slab.png new file mode 100644 index 00000000..968d8b96 Binary files /dev/null and b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_granite_smooth_slab.png differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_iron_block_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_iron_block_slab.png new file mode 100644 index 00000000..9f027e4b Binary files /dev/null and b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_iron_block_slab.png differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_lapis_block_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_lapis_block_slab.png new file mode 100644 index 00000000..2690b4a0 Binary files /dev/null and b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_lapis_block_slab.png differ diff --git a/mods/ITEMS/mcstair/README.md b/mods/ITEMS/mcstair/README.md deleted file mode 100644 index f2b28439..00000000 --- a/mods/ITEMS/mcstair/README.md +++ /dev/null @@ -1,49 +0,0 @@ -mcstair v1.0 - -Minecraft like corner stairs. - -License for all of this mod is "CC0", see below. - -```txt -CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. - -Statement of Purpose -The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). -Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. -For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: - i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); - iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and - vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. - -4. Limitations and Disclaimers. - a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. - b. Affirmer 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, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. - d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. -``` - -mod api: - -```lua -mcstair.add(name, stairtiles) -``` - -"name" is the name of the node to make corner stairs for. - -"stairtiles" is an optional table of tiles to override textures for inner and outer stairs. - -"stairtiles" format is... - -```lua -{tiles_def_for_outer_stair, tiles_def_for_inner_stair} -``` diff --git a/mods/ITEMS/mcstair/depends.txt b/mods/ITEMS/mcstair/depends.txt deleted file mode 100644 index dd0b3ab4..00000000 --- a/mods/ITEMS/mcstair/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -mcl_core -mcl_stairs -doc? diff --git a/mods/ITEMS/mcstair/description.txt b/mods/ITEMS/mcstair/description.txt deleted file mode 100644 index 382c4807..00000000 --- a/mods/ITEMS/mcstair/description.txt +++ /dev/null @@ -1 +0,0 @@ -Minecraft like corner stairs. \ No newline at end of file diff --git a/mods/ITEMS/mcstair/mod.conf b/mods/ITEMS/mcstair/mod.conf deleted file mode 100644 index c0546d6d..00000000 --- a/mods/ITEMS/mcstair/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = mcstair diff --git a/mods/ITEMS/mcstair/textures/mcstair_turntexture.png b/mods/ITEMS/mcstair/textures/mcstair_turntexture.png deleted file mode 100644 index 6a2e8db1..00000000 Binary files a/mods/ITEMS/mcstair/textures/mcstair_turntexture.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/README.txt b/mods/ITEMS/minetest-3d_armor/3d_armor/README.txt deleted file mode 100644 index 224f81c9..00000000 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/README.txt +++ /dev/null @@ -1,24 +0,0 @@ -[mod] Visible Player Armor [3d_armor] -===================================== - -Depends: default - -Recommends: inventory_plus or unified_inventory (use only one) - -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. - -Fire protection added by TenPlus1 when using crystal armor if Ethereal mod active, level 1 -protects against torches, level 2 for crystal spike, level 3 for fire, level 5 for lava. - -Configuration -------------- - -Armor can be configured by adding a file called armor.conf in 3d_armor mod and/or world directory. -see armor.conf.example for all available options. - -Note: worldpath config settings override any settings made in the mod's directory. - diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.conf b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.conf deleted file mode 100644 index 3d22006f..00000000 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.conf +++ /dev/null @@ -1,23 +0,0 @@ --- Armor Configuration -ARMOR_MATERIALS = { - leather = "mcl_mobitems:leather", - iron = "mcl_core:iron_ingot", - chain = nil, - gold = "mcl_core:gold_ingot", - diamond = "mcl_core:diamond", -} - -ARMOR_FIRE_PROTECT = false - -ARMOR_FIRE_NODES = { - {"default:lava_source", 5, 4}, - {"default:lava_flowing", 5, 4}, - {"mcl_fire:fire", 3, 4}, - {"mcl_fire:eternal_fire", 3, 4}, -} - --- Armor drop/destroy disabled. Armor dropping is handled in mcl_death -ARMOR_DROP = false -ARMOR_DESTROY = false -ARMOR_HEAL_MULTIPLIER = 0 -ARMOR_RADIATION_MULTIPLIER = 0 diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.conf.example b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.conf.example deleted file mode 100644 index 75e072d9..00000000 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.conf.example +++ /dev/null @@ -1,61 +0,0 @@ --- 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", -} - --- 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 - --- Number of initialization attempts. --- Use in conjunction with ARMOR_INIT_DELAY if initialization problems persist. -ARMOR_INIT_TIMES = 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/ITEMS/minetest-3d_armor/3d_armor/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua deleted file mode 100644 index bb2c7032..00000000 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua +++ /dev/null @@ -1,267 +0,0 @@ -dofile(minetest.get_modpath(minetest.get_current_modname()).."/armor.lua") - --- Regisiter Head Armor - -local longdesc = "This is a piece of equippable armor which reduces the amount of damage you receive." -local usage = "To equip it, put it on the corresponding armor slot in your inventory menu." - -minetest.register_tool("3d_armor:helmet_leather", { - description = "Leather Cap", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_helmet_leather.png", - groups = {armor_head=5, armor_heal=0, armor_use=100}, - wear = 0, -}) - -minetest.register_tool("3d_armor:helmet_iron", { - description = "Iron Helmet", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_helmet_iron.png", - groups = {armor_head=10, armor_heal=5, armor_use=250}, - wear = 0, -}) - -minetest.register_tool("3d_armor:helmet_gold", { - description = "Golden Helmet", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_helmet_gold.png", - groups = {armor_head=15, armor_heal=10, armor_use=500}, - wear = 0, -}) - -minetest.register_tool("3d_armor:helmet_diamond",{ - description = "Diamond Helmet", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_helmet_diamond.png", - groups = {armor_head=20, armor_heal=15, armor_use=750}, - wear = 0, -}) - -minetest.register_tool("3d_armor:helmet_chain", { - description = "Chain Helmet", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_helmet_chain.png", - groups = {armor_head=15, armor_heal=10, armor_use=500}, - wear = 0, -}) - --- Regisiter Torso Armor - -minetest.register_tool("3d_armor:chestplate_leather", { - description = "Leather Tunic", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_chestplate_leather.png", - groups = {armor_torso=15, armor_heal=0, armor_use=100}, - wear = 0, -}) - -minetest.register_tool("3d_armor:chestplate_iron", { - description = "Iron Chestplate", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_chestplate_iron.png", - groups = {armor_torso=20, armor_heal=5, armor_use=250}, - wear = 0, -}) - -minetest.register_tool("3d_armor:chestplate_gold", { - description = "Golden Chestplate", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_chestplate_gold.png", - groups = {armor_torso=25, armor_heal=10, armor_use=500}, - wear = 0, -}) - -minetest.register_tool("3d_armor:chestplate_diamond",{ - description = "Diamond Chestplate", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_chestplate_diamond.png", - groups = {armor_torso=30, armor_heal=15, armor_use=750}, - wear = 0, -}) - -minetest.register_tool("3d_armor:chestplate_chain", { - description = "Chain Chestplate", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_chestplate_chain.png", - groups = {armor_torso=25, armor_heal=10, armor_use=500}, - wear = 0, -}) - --- Regisiter Leg Armor - -minetest.register_tool("3d_armor:leggings_leather", { - description = "Leather Pants", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_leggings_leather.png", - groups = {armor_legs=10, armor_heal=0, armor_use=100}, - wear = 0, -}) - -minetest.register_tool("3d_armor:leggings_iron", { - description = "Iron Leggings", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_leggings_iron.png", - groups = {armor_legs=15, armor_heal=5, armor_use=250}, - wear = 0, -}) - -minetest.register_tool("3d_armor:leggings_gold", { - description = "Golden Leggings", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_leggings_gold.png", - groups = {armor_legs=20, armor_heal=10, armor_use=500}, - wear = 0, -}) - -minetest.register_tool("3d_armor:leggings_diamond",{ - description = "Diamond Leggins", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_leggings_diamond.png", - groups = {armor_legs=25, armor_heal=15, armor_use=750}, - wear = 0, -}) - -minetest.register_tool("3d_armor:leggings_chain", { - description = "Chain Leggings", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_leggings_chain.png", - groups = {armor_legs=20, armor_heal=10, armor_use=500}, - wear = 0, -}) --- Regisiter Boots - -minetest.register_tool("3d_armor:boots_leather", { - description = "Leather Boots", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_boots_leather.png", - groups = {armor_feet=5, armor_heal=0, armor_use=100}, - wear = 0, -}) - -minetest.register_tool("3d_armor:boots_iron", { - description = "Iron Boots", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_boots_iron.png", - groups = {armor_feet=10, armor_heal=5, armor_use=250}, - wear = 0, -}) - -minetest.register_tool("3d_armor:boots_gold", { - description = "Golden Boots", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_boots_gold.png", - groups = {armor_feet=15, armor_heal=10, armor_use=500}, - wear = 0, -}) - -minetest.register_tool("3d_armor:boots_diamond",{ - description = "Diamond Boots", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_boots_diamond.png", - groups = {armor_feet=20, armor_heal=15, armor_use=750}, - wear = 0, -}) - -minetest.register_tool("3d_armor:boots_chain", { - description = "Chain Boots", - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "3d_armor_inv_boots_chain.png", - groups = {armor_feet=15, armor_heal=10, armor_use=500}, - wear = 0, -}) - --- Register Craft Recipies - -local craft_ingreds = { - leather = { "mcl_mobitems:leather" }, - iron = { "mcl_core:iron_ingot", "mcl_core:iron_nugget" }, - gold = { "mcl_core:gold_ingot", "mcl_core:gold_nugget" }, - diamond = { "mcl_core:diamond" }, - chain = { nil, "mcl_core:iron_nugget"} , -} - -for k, v in pairs(craft_ingreds) do - -- material - local m = v[1] - -- cooking result - local c = v[2] - if m ~= nil then - minetest.register_craft({ - output = "3d_armor:helmet_"..k, - recipe = { - {m, m, m}, - {m, "", m}, - {"", "", ""}, - }, - }) - minetest.register_craft({ - output = "3d_armor:chestplate_"..k, - recipe = { - {m, "", m}, - {m, m, m}, - {m, m, m}, - }, - }) - minetest.register_craft({ - output = "3d_armor:leggings_"..k, - recipe = { - {m, m, m}, - {m, "", m}, - {m, "", m}, - }, - }) - minetest.register_craft({ - output = "3d_armor:boots_"..k, - recipe = { - {m, "", m}, - {m, "", m}, - }, - }) - end - if c ~= nil then - minetest.register_craft({ - type = "cooking", - output = c, - recipe = "3d_armor:helmet_"..k, - cooktime = 10, - }) - minetest.register_craft({ - type = "cooking", - output = c, - recipe = "3d_armor:chestplate_"..k, - cooktime = 10, - }) - minetest.register_craft({ - type = "cooking", - output = c, - recipe = "3d_armor:leggings_"..k, - cooktime = 10, - }) - minetest.register_craft({ - type = "cooking", - output = c, - recipe = "3d_armor:boots_"..k, - cooktime = 10, - }) - end -end diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.b3d b/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.b3d deleted file mode 100644 index 7c27caeb..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.b3d and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.blend b/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.blend deleted file mode 100644 index f61e222c..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.blend and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_chain_preview.png b/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_chain_preview.png deleted file mode 100644 index af9c982f..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_chain_preview.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png b/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png deleted file mode 100644 index 3679ae6a..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_leather.png b/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_leather.png deleted file mode 100644 index eaa53582..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_chestplate_leather.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_chain.png b/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_chain.png deleted file mode 100644 index 66f9bdce..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_boots_chain.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_chain.png b/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_chain.png deleted file mode 100644 index 9ab14863..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_chestplate_chain.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_chain.png b/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_chain.png deleted file mode 100644 index f72a88da..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_helmet_chain.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_chain.png b/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_chain.png deleted file mode 100644 index c2641991..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_chain.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_leather.png b/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_leather.png deleted file mode 100644 index 41d49c37..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_inv_leggings_leather.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_trans.png b/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_trans.png deleted file mode 100644 index 4d7beb80..00000000 Binary files a/mods/ITEMS/minetest-3d_armor/3d_armor/textures/3d_armor_trans.png and /dev/null differ diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/LICENSE.txt b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/LICENSE.txt deleted file mode 100644 index 5c8246a9..00000000 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -[mod] 3d Armor Stand [3d_armor_stand] -===================================== - -License Source Code: LGPL v2.1 - -Lecense Media: CC BY-SA 3.0 - diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/README.txt b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/README.txt deleted file mode 100644 index 3fe7fb8c..00000000 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -[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/ITEMS/minetest-3d_armor/LICENSE.md b/mods/ITEMS/minetest-3d_armor/LICENSE.md deleted file mode 100644 index 38e8a9fd..00000000 --- a/mods/ITEMS/minetest-3d_armor/LICENSE.md +++ /dev/null @@ -1,7 +0,0 @@ -3D Armor - Visible Player Armor -=============================== - -Source Code: Copyright (C) 2013 Stuart Jones - LGPL - -Special credit to Jordach and MirceaKitsune for providing the default 3d character model. - diff --git a/mods/ITEMS/minetest-3d_armor/README.md b/mods/ITEMS/minetest-3d_armor/README.md deleted file mode 100644 index 0ac2c29a..00000000 --- a/mods/ITEMS/minetest-3d_armor/README.md +++ /dev/null @@ -1,41 +0,0 @@ -Modpack - 3d Armor -================== - -[mod] Unified Skins [unified_skins] ------------------------------------ - -depends: default - -A 3d character model re-texturing api used as the framework for this modpack. - -Compatible with player skins mod [skins] by Zeg9 and Player Textures [player_textures] by sdzen. - -Note: Currently only supports 64x32px player skins. - -[mod] Visible Wielded Items [wieldview] ---------------------------------------- - -depends: unified_skins - -Makes hand wielded items visible to other players. - -Note: Currently only supports 16x16px texture packs, sorry! - -[mod] Visible Player Armor [3d_armor] -------------------------------------- - -depends: unified_skins, inventory_plus - -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, however, many armor items offer a 'stackable' -percentage chance of restoring the lost health points. - -[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. diff --git a/mods/ITEMS/minetest-3d_armor/modpack.txt b/mods/ITEMS/minetest-3d_armor/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/ITEMS/minetest-3d_armor/wieldview/LICENSE.txt b/mods/ITEMS/minetest-3d_armor/wieldview/LICENSE.txt deleted file mode 100644 index 4e8d524b..00000000 --- a/mods/ITEMS/minetest-3d_armor/wieldview/LICENSE.txt +++ /dev/null @@ -1,5 +0,0 @@ -[mod] visible wielded items [wieldview] -======================================= - -License Source Code: Copyright (C) 2013-2017 Stuart Jones - LGPL v2.1 - diff --git a/mods/ITEMS/minetest-3d_armor/wieldview/depends.txt b/mods/ITEMS/minetest-3d_armor/wieldview/depends.txt deleted file mode 100644 index b6cac219..00000000 --- a/mods/ITEMS/minetest-3d_armor/wieldview/depends.txt +++ /dev/null @@ -1 +0,0 @@ -3d_armor diff --git a/mods/ITEMS/modpack.conf b/mods/ITEMS/modpack.conf new file mode 100644 index 00000000..b37dc302 --- /dev/null +++ b/mods/ITEMS/modpack.conf @@ -0,0 +1,2 @@ +name = ITEMS +description = Meta-modpack containing items-related mods for MineClone 2 diff --git a/mods/ITEMS/modpack.txt b/mods/ITEMS/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/ITEMS/screwdriver/API.md b/mods/ITEMS/screwdriver/API.md new file mode 100644 index 00000000..03cc6fdd --- /dev/null +++ b/mods/ITEMS/screwdriver/API.md @@ -0,0 +1,20 @@ +Screwdriver API +--------------- + +The screwdriver API allows you to control a node's behaviour when a screwdriver is used on it. +NOTE: This API is compatible with Minetest Game 5.1.0, but has some extensions. + +To use it, add the `on_rotate` function to the node definition. + +`on_rotate(pos, node, user, mode, new_param2)` + + * `pos`: Position of the node that the screwdriver is being used on + * `node`: that node + * `user`: The player who used the screwdriver + * `mode`: `screwdriver.ROTATE_FACE` or `screwdriver.ROTATE_AXIS` + * `new_param2` the new value of `param2` that would have been set if `on_rotate` wasn't there + * return value: false to disallow rotation, nil to keep default behaviour, true to allow + it but to indicate that changed have already been made (so the screwdriver will wear out) + * use `on_rotate = false` to always disallow rotation + * use `on_rotate = screwdriver.rotate_simple` to allow only face rotation + * use `on_rotate = screwdriver.rotate_3way` (MineClone 2 extension) for pillar-like nodes that should only have 3 possible orientations) diff --git a/mods/ITEMS/screwdriver/README.md b/mods/ITEMS/screwdriver/README.md new file mode 100644 index 00000000..7237c847 --- /dev/null +++ b/mods/ITEMS/screwdriver/README.md @@ -0,0 +1,13 @@ +MineClone 2 mod: screwdriver +============================ +See license.txt for license information. + +License of source code +---------------------- +Originally by RealBadAngel, Maciej Kasatkin (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +License of media (textures) +--------------------------- +Created by Wuzzy (CC0): +* `screwdriver.png` diff --git a/mods/ITEMS/screwdriver/init.lua b/mods/ITEMS/screwdriver/init.lua new file mode 100644 index 00000000..7fad2bdc --- /dev/null +++ b/mods/ITEMS/screwdriver/init.lua @@ -0,0 +1,198 @@ +local S = minetest.get_translator("screwdriver") + +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 +screwdriver.rotate_3way = function(pos, node, user, mode, new_param2) + if mode == screwdriver.ROTATE_AXIS then + if node.param2 == 0 then + node.param2 = 6 + elseif node.param2 == 6 then + node.param2 = 12 + else + node.param2 = 0 + end + minetest.swap_node(pos, node) + return true + elseif mode == screwdriver.ROTATE_FACE then + if node.param2 == 6 then + node.param2 = 12 + minetest.swap_node(pos, node) + return true + else + node.param2 = 6 + minetest.swap_node(pos, node) + return true + end + end + return false +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 + +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) + 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.settings:get_bool("creative_mode")) then + itemstack:add_wear(65535 / ((uses or 200) - 1)) + end + + return itemstack +end + +-- Screwdriver +minetest.register_tool("screwdriver:screwdriver", { + description = S("Screwdriver"), + inventory_image = "screwdriver.png", + wield_image = "screwdriver.png^[transformFX", + groups = { tool = 1, not_in_creative_inventory = 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 = { + {"mcl_core:iron_ingot"}, + {"mcl_core: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/ITEMS/screwdriver/license.txt b/mods/ITEMS/screwdriver/license.txt new file mode 100644 index 00000000..d9b721bb --- /dev/null +++ b/mods/ITEMS/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 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/ITEMS/screwdriver/locale/screwdriver.de.tr b/mods/ITEMS/screwdriver/locale/screwdriver.de.tr new file mode 100644 index 00000000..35c99c05 --- /dev/null +++ b/mods/ITEMS/screwdriver/locale/screwdriver.de.tr @@ -0,0 +1,2 @@ +# textdomain: screwdriver +Screwdriver=Schraubendreher diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.es.tr b/mods/ITEMS/screwdriver/locale/screwdriver.es.tr new file mode 100644 index 00000000..f2c778ce --- /dev/null +++ b/mods/ITEMS/screwdriver/locale/screwdriver.es.tr @@ -0,0 +1,2 @@ +# textdomain: screwdriver +Screwdriver=Destornillador diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.fr.tr b/mods/ITEMS/screwdriver/locale/screwdriver.fr.tr new file mode 100644 index 00000000..ae014ea0 --- /dev/null +++ b/mods/ITEMS/screwdriver/locale/screwdriver.fr.tr @@ -0,0 +1,2 @@ +#textdomain: screwdriver +Screwdriver=Tournevis diff --git a/mods/ITEMS/screwdriver/locale/template.txt b/mods/ITEMS/screwdriver/locale/template.txt new file mode 100644 index 00000000..b3871a11 --- /dev/null +++ b/mods/ITEMS/screwdriver/locale/template.txt @@ -0,0 +1,2 @@ +#textdomain: screwdriver +Screwdriver= diff --git a/mods/ITEMS/screwdriver/textures/screwdriver.png b/mods/ITEMS/screwdriver/textures/screwdriver.png new file mode 100644 index 00000000..f6706b97 Binary files /dev/null and b/mods/ITEMS/screwdriver/textures/screwdriver.png differ diff --git a/mods/ITEMS/xpanes/init.lua b/mods/ITEMS/xpanes/init.lua index 1b540ee6..b98d65e3 100644 --- a/mods/ITEMS/xpanes/init.lua +++ b/mods/ITEMS/xpanes/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("xpanes") +local mod_doc = minetest.get_modpath("doc") local function is_pane(pos) return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0 @@ -135,7 +137,6 @@ function xpanes.register_pane(name, def) paramtype = "light", is_ground_content = false, sunlight_propagates = true, - description = def.description, _doc_items_create_entry = false, tiles = {def.textures[3], def.textures[2], def.textures[1]}, use_texture_alpha = def.use_texture_alpha, @@ -161,24 +162,35 @@ function xpanes.register_pane(name, def) recipe = def.recipe }) - if minetest.get_modpath("doc") then + if mod_doc and def._doc_items_create_entry ~= false then doc.add_entry_alias("nodes", "xpanes:" .. name .. "_flat", "nodes", "xpanes:" .. name) end end +local canonical_color = "yellow" -- Register glass pane (stained and unstained) local pane = function(description, node, append) - local texture1 - + local texture1, longdesc, entry_name, create_entry + local is_canonical = true -- Special case: Default (unstained) glass texture if append == "_natural" then texture1 = "default_glass.png" + longdesc = S("Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.") else + if append ~= "_"..canonical_color then + is_canonical = false + create_entry = false + else + longdesc = S("Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.") + entry_name = S("Stained Glass Pane") + end texture1 = "mcl_core_glass"..append..".png" end xpanes.register_pane("pane"..append, { description = description, - _doc_items_longdesc = "Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.", + _doc_items_create_entry = create_entry, + _doc_items_entry_name = entry_name, + _doc_items_longdesc = longdesc, textures = {texture1, texture1, "xpanes_top_glass"..append..".png"}, use_texture_alpha = true, inventory_image = texture1, @@ -190,15 +202,20 @@ local pane = function(description, node, append) {node, node, node}, }, drop = "", - _mcl_blast_resistance = 1.5, + _mcl_blast_resistance = 0.3, _mcl_hardness = 0.3, }) + + if mod_doc and not is_canonical then + doc.add_entry_alias("nodes", "xpanes:pane_".. canonical_color .. "_flat", "nodes", "xpanes:pane"..append) + doc.add_entry_alias("nodes", "xpanes:pane_".. canonical_color .. "_flat", "nodes", "xpanes:pane"..append.."_flat") + end end -- Iron Bars xpanes.register_pane("bar", { - description = "Iron Bars", - _doc_items_longdesc = "Iron bars neatly connect to their neighbors as you build them.", + description = S("Iron Bars"), + _doc_items_longdesc = S("Iron bars neatly connect to their neighbors as you build them."), textures = {"xpanes_pane_iron.png","xpanes_pane_iron.png","xpanes_top_iron.png"}, inventory_image = "xpanes_pane_iron.png", wield_image = "xpanes_pane_iron.png", @@ -208,27 +225,27 @@ xpanes.register_pane("bar", { {"mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot"}, {"mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot"}, }, - _mcl_blast_resistance = 30, + _mcl_blast_resistance = 6, _mcl_hardness = 5, }) -- Glass Pane -pane("Glass Pane", "mcl_core:glass", "_natural") -- triggers special case +pane(S("Glass Pane"), "mcl_core:glass", "_natural") -- triggers special case -- Stained Glass Pane -pane("Red Stained Glass Pane", "mcl_core:glass_red", "_red") -pane("Green Stained Glass Pane", "mcl_core:glass_green", "_green") -pane("Blue Stained Glass Pane", "mcl_core:glass_blue", "_blue") -pane("Light Blue Stained Glass Pane", "mcl_core:glass_light_blue", "_light_blue") -pane("Black Stained Glass Pane", "mcl_core:glass_black", "_black") -pane("White Stained Glass Pane", "mcl_core:glass_white", "_white") -pane("Yellow Stained Glass Pane", "mcl_core:glass_yellow", "_yellow") -pane("Brown Stained Glass Pane", "mcl_core:glass_brown", "_brown") -pane("Orange Stained Glass Pane", "mcl_core:glass_orange", "_orange") -pane("Pink Stained Glass Pane", "mcl_core:glass_pink", "_pink") -pane("Grey Stained Glass Pane", "mcl_core:glass_gray", "_gray") -pane("Lime Stained Glass Pane", "mcl_core:glass_lime", "_lime") -pane("Light Grey Stained Glass Pane", "mcl_core:glass_silver", "_silver") -pane("Magenta Stained Glass Pane", "mcl_core:glass_magenta", "_magenta") -pane("Purple Stained Glass Pane", "mcl_core:glass_purple", "_purple") -pane("Cyan Stained Glass Pane", "mcl_core:glass_cyan", "_cyan") +pane(S("Red Stained Glass Pane"), "mcl_core:glass_red", "_red") +pane(S("Green Stained Glass Pane"), "mcl_core:glass_green", "_green") +pane(S("Blue Stained Glass Pane"), "mcl_core:glass_blue", "_blue") +pane(S("Light Blue Stained Glass Pane"), "mcl_core:glass_light_blue", "_light_blue") +pane(S("Black Stained Glass Pane"), "mcl_core:glass_black", "_black") +pane(S("White Stained Glass Pane"), "mcl_core:glass_white", "_white") +pane(S("Yellow Stained Glass Pane"), "mcl_core:glass_yellow", "_yellow") +pane(S("Brown Stained Glass Pane"), "mcl_core:glass_brown", "_brown") +pane(S("Orange Stained Glass Pane"), "mcl_core:glass_orange", "_orange") +pane(S("Pink Stained Glass Pane"), "mcl_core:glass_pink", "_pink") +pane(S("Grey Stained Glass Pane"), "mcl_core:glass_gray", "_gray") +pane(S("Lime Stained Glass Pane"), "mcl_core:glass_lime", "_lime") +pane(S("Light Grey Stained Glass Pane"), "mcl_core:glass_silver", "_silver") +pane(S("Magenta Stained Glass Pane"), "mcl_core:glass_magenta", "_magenta") +pane(S("Purple Stained Glass Pane"), "mcl_core:glass_purple", "_purple") +pane(S("Cyan Stained Glass Pane"), "mcl_core:glass_cyan", "_cyan") diff --git a/mods/ITEMS/xpanes/locale/template.txt b/mods/ITEMS/xpanes/locale/template.txt new file mode 100644 index 00000000..cae83797 --- /dev/null +++ b/mods/ITEMS/xpanes/locale/template.txt @@ -0,0 +1,23 @@ +# textdomain: xpanes +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.= +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.= +Iron Bars= +Iron bars neatly connect to their neighbors as you build them.= +Glass Pane= +Stained Glass Pane= +Red Stained Glass Pane= +Green Stained Glass Pane= +Blue Stained Glass Pane= +Light Blue Stained Glass Pane= +Black Stained Glass Pane= +White Stained Glass Pane= +Yellow Stained Glass Pane= +Brown Stained Glass Pane= +Orange Stained Glass Pane= +Pink Stained Glass Pane= +Grey Stained Glass Pane= +Lime Stained Glass Pane= +Light Grey Stained Glass Pane= +Magenta Stained Glass Pane= +Purple Stained Glass Pane= +Cyan Stained Glass Pane= diff --git a/mods/ITEMS/xpanes/locale/xpanes.de.tr b/mods/ITEMS/xpanes/locale/xpanes.de.tr new file mode 100644 index 00000000..3c840b08 --- /dev/null +++ b/mods/ITEMS/xpanes/locale/xpanes.de.tr @@ -0,0 +1,23 @@ +# textdomain: xpanes +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=Glasscheiben sind dünne Glasschichten, die sich mit ihren Nachbarn automatisch verbinden. +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Farbglasscheiben sind dünne Schichten aus Farbglas, die sich mit ihren Nachbarn automatisch verbinden. Es gibt sie in vielen verschiedenen Farben. +Iron Bars=Eisenstangen +Iron bars neatly connect to their neighbors as you build them.=Eisenstangen verbinden sich mit den Nachbarn, wenn sie gebaut werden. +Glass Pane=Glasscheibe +Stained Glass Pane=Buntglasscheibe +Red Stained Glass Pane=Rote Buntglasscheibe +Green Stained Glass Pane=Grüne Buntglasscheibe +Blue Stained Glass Pane=Blaue Buntglasscheibe +Light Blue Stained Glass Pane=Hellblaue Buntglasscheibe +Black Stained Glass Pane=Schwarze Buntglasscheibe +White Stained Glass Pane=Weiße Buntglasscheibe +Yellow Stained Glass Pane=Gelbe Buntglasscheibe +Brown Stained Glass Pane=Braune Buntglasscheibe +Orange Stained Glass Pane=Orange Buntglasscheibe +Pink Stained Glass Pane=Rosa Buntglasscheibe +Grey Stained Glass Pane=Graue Buntglasscheibe +Lime Stained Glass Pane=Lindgrüne Buntglasscheibe +Light Grey Stained Glass Pane=Hellgraue Buntglasscheibe +Magenta Stained Glass Pane=Magenta Buntglasscheibe +Purple Stained Glass Pane=Violette Buntglasscheibe +Cyan Stained Glass Pane=Türkise Buntglasscheibe diff --git a/mods/ITEMS/xpanes/locale/xpanes.es.tr b/mods/ITEMS/xpanes/locale/xpanes.es.tr new file mode 100644 index 00000000..c90c6472 --- /dev/null +++ b/mods/ITEMS/xpanes/locale/xpanes.es.tr @@ -0,0 +1,23 @@ +# textdomain: xpanes +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=Los paneles de cristal son capas delgadas de vidrio que se conectan perfectamente a otros cristales a medida que los construye. +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Los paneles de cristal son capas delgadas de vidrio que se conectan perfectamente a otros cristales a medida que los construye. Vienen en muchos colores diferentes. +Iron Bars=Barrotes de hierro +Iron bars neatly connect to their neighbors as you build them.=Los barrotes de hierro se conectan perfectamente a sus vecinos a medida que los construyes. +Glass Pane=Panel de cristal +Stained Glass Pane=Panel de cristal tintado de manchado +Red Stained Glass Pane=Panel de cristal tintado de rojo +Green Stained Glass Pane=Panel de cristal tintado de verde +Blue Stained Glass Pane=Panel de cristal tintado de azul +Light Blue Stained Glass Pane=Panel de cristal tintado de azul claro +Black Stained Glass Pane=Panel de cristal tintado de negro +White Stained Glass Pane=Panel de cristal tintado de blanco +Yellow Stained Glass Pane=Panel de cristal tintado de amarillo +Brown Stained Glass Pane=Panel de cristal tintado de marrón +Orange Stained Glass Pane=Panel de cristal tintado de naranja +Pink Stained Glass Pane=Panel de cristal tintado de rosa +Grey Stained Glass Pane=Panel de cristal tintado de gris +Lime Stained Glass Pane=Panel de cristal tintado de verde lima +Light Grey Stained Glass Pane=Panel de cristal tintado de gris claro +Magenta Stained Glass Pane=Panel de cristal tintado de magenta +Purple Stained Glass Pane=Panel de cristal tintado de morado +Cyan Stained Glass Pane=Panel de cristal tintado de cian diff --git a/mods/ITEMS/xpanes/locale/xpanes.fr.tr b/mods/ITEMS/xpanes/locale/xpanes.fr.tr new file mode 100644 index 00000000..6b2fe43f --- /dev/null +++ b/mods/ITEMS/xpanes/locale/xpanes.fr.tr @@ -0,0 +1,23 @@ +# textdomain: xpanes +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=Les vitres sont de fines couches de verre qui se connectent parfaitement à leurs voisins lorsque vous les construisez. +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Les vitres teintées sont de fines couches de verre teinté qui se connectent parfaitement à leurs voisins lorsque vous les construisez. Ils viennent dans de nombreuses couleurs différentes. +Iron Bars=Barres de fer +Iron bars neatly connect to their neighbors as you build them.=Les barres de fer se connectent parfaitement à leurs voisins lorsque vous les construisez. +Glass Pane=Vitre +Stained Glass Pane=Vitre Teintée +Red Stained Glass Pane=Vitre Teintée Rouge +Green Stained Glass Pane=Vitre Teintée Verte +Blue Stained Glass Pane=Vitre Teintée Bleue +Light Blue Stained Glass Pane=Vitre Teintée Bleu Clair +Black Stained Glass Pane=Vitre Teintée Noire +White Stained Glass Pane=Vitre Teintée Blanche +Yellow Stained Glass Pane=Vitre Teintée Jaune +Brown Stained Glass Pane=Vitre Teintée Marron +Orange Stained Glass Pane=Vitre Teintée Orange +Pink Stained Glass Pane=Vitre Teintée Rose +Grey Stained Glass Pane=Vitre Teintée Grise +Lime Stained Glass Pane=Vitre Teintée Vert Clair +Light Grey Stained Glass Pane=Vitre Teintée Gris Clair +Magenta Stained Glass Pane=Vitre Teintée Magenta +Purple Stained Glass Pane=Vitre Teintée Violette +Cyan Stained Glass Pane=Vitre Teintée Cyan diff --git a/mods/ITEMS/xpanes/textures/xpanes_pane_iron.png b/mods/ITEMS/xpanes/textures/xpanes_pane_iron.png index 45c4bf13..8424b462 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_pane_iron.png and b/mods/ITEMS/xpanes/textures/xpanes_pane_iron.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_black.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_black.png index d273bceb..84a68034 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_black.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_black.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_blue.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_blue.png index 97e5e329..c5bf8235 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_blue.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_blue.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_brown.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_brown.png index e6ddb526..eafbb2f2 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_brown.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_brown.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_cyan.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_cyan.png index 1ca0c651..315734e1 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_cyan.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_cyan.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_gray.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_gray.png index 106f33bd..2826e38d 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_gray.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_gray.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_green.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_green.png index b27b4471..88d73ce0 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_green.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_green.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_light_blue.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_light_blue.png index c683ed08..7244012e 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_light_blue.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_light_blue.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_lime.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_lime.png index 1f1fe8a8..3fb8ed2d 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_lime.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_lime.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_magenta.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_magenta.png index 7dc225da..6824b438 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_magenta.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_magenta.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_orange.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_orange.png index e703f33d..5d2fb60f 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_orange.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_orange.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_pink.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_pink.png index 5edbf1b8..e6cef550 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_pink.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_pink.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_purple.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_purple.png index 91af04e1..fa02e7f8 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_purple.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_purple.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_red.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_red.png index e82ba1df..891de591 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_red.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_red.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_silver.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_silver.png index 3150ebab..0b0e7d59 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_silver.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_silver.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_white.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_white.png index 6fa56d87..9244f361 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_white.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_white.png differ diff --git a/mods/ITEMS/xpanes/textures/xpanes_top_glass_yellow.png b/mods/ITEMS/xpanes/textures/xpanes_top_glass_yellow.png index 9254c7a0..d2f0b320 100644 Binary files a/mods/ITEMS/xpanes/textures/xpanes_top_glass_yellow.png and b/mods/ITEMS/xpanes/textures/xpanes_top_glass_yellow.png differ diff --git a/mods/MAPGEN/mcl_biomes/depends.txt b/mods/MAPGEN/mcl_biomes/depends.txt index 442501fa..dd21ef64 100644 --- a/mods/MAPGEN/mcl_biomes/depends.txt +++ b/mods/MAPGEN/mcl_biomes/depends.txt @@ -1,3 +1,7 @@ +mcl_init mcl_core +mcl_worlds mcl_farming mcl_flowers +mcl_end +mcl_ocean diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 4dfadfee..01762c25 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1,9 +1,28 @@ +local mg_name = minetest.get_mapgen_setting("mg_name") +local mg_seed = minetest.get_mapgen_setting("seed") + +-- Some mapgen settings +local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" + +local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_logs", false) + +-- Jungle bush schematic. In PC/Java Edition it's Jungle Wood + Oak Leaves +local jungle_bush_schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_bush_oak_leaves.mts" + +local deco_id_chorus_plant -- --- Register biomes for mapgens other than v6 --- EXPERIMENTAL! +-- Register biomes -- +local OCEAN_MIN = -15 +local DEEP_OCEAN_MAX = OCEAN_MIN - 1 +local DEEP_OCEAN_MIN = -31 + +--[[ Special biome field: _mcl_biome_type: +Rough categorization of biomes: One of "snowy", "cold", "medium" and "hot" +Based off ]] + local function register_classic_superflat_biome() -- Classic Superflat: bedrock (not part of biome), 2 dirt, 1 grass block minetest.register_biome({ @@ -15,487 +34,1379 @@ local function register_classic_superflat_biome() node_stone = "mcl_core:dirt", y_min = mcl_vars.mg_overworld_min - 512, y_max = mcl_vars.mg_overworld_max, - heat_point = 50, humidity_point = 50, + heat_point = 50, + _mcl_biome_type = "medium", + _mcl_palette_index = 0, }) end -- All mapgens except mgv6, flat and singlenode local function register_biomes() - - local upper_limit = mcl_vars.mg_overworld_max --[[ OVERWORLD ]] - -- Icesheet + --[[ These biomes try to resemble MC as good as possible. This means especially the floor cover and + the type of plants and structures (shapes might differ). The terrain itself will be of course different + and depends on the mapgen. + Important: MC also takes the terrain into account while MT biomes don't care about the terrain at all + (except height). + MC has many “M” and “Hills” variants, most of which only differ in terrain compared to their original + counterpart. + In MT, any biome can occour in any terrain, so these variants are implied and are therefore + not explicitly implmented in MCL2. “M” variants are only included if they have another unique feature, + such as a different land cover. + In MCL2, the MC Overworld biomes are split in multiple more parts (stacked by height): + * The main part, this represents the land. It begins at around sea level and usually goes all the way up + * _ocean: For the area covered by ocean water. The y_max may vary for various beach effects. + Has sand or dirt as floor. + * _deep_ocean: Like _ocean, but deeper and has gravel as floor + * _underground: + * Other modifiers: Some complex biomes require more layers to improve the landscape. + + The following naming conventions apply: + * The land biome name is equal to the MC biome name, as of Minecraft 1.11 (in camel case) + * Height modifiers and sub-biomes are appended with underscores and in lowercase. Example: “_ocean” + * Non-MC biomes are written in lowercase + * MC dimension biomes are named after their MC dimension + + Intentionally missing biomes: + * River (generated by valleys and v7) + * Frozen River (generated by valleys and v7) + * Hills biomes (shape only) + * Plateau (shape only) + * Plateau M (shape only) + * Cold Taiga M (mountain only) + * Taiga M (mountain only) + * Roofed Forest M (mountain only) + * Swampland M (mountain only) + * Extreme Hills Edge (unused in MC) + + TODO: + * Better beaches + * Improve Extreme Hills M + * Desert M + + ]] + + -- List of Overworld biomes without modifiers. + -- IMPORTANT: Don't forget to add new Overworld biomes to this list! + local overworld_biomes = { + "IcePlains", + "IcePlainsSpikes", + "ColdTaiga", + "ExtremeHills", + "ExtremeHillsM", + "ExtremeHills+", + "Taiga", + "MegaTaiga", + "MegaSpruceTaiga", + "StoneBeach", + "Plains", + "SunflowerPlains", + "Forest", + "FlowerForest", + "BirchForest", + "BirchForestM", + "RoofedForest", + "Swampland", + "Jungle", + "JungleM", + "JungleEdge", + "JungleEdgeM", + "MushroomIsland", + "Desert", + "Savanna", + "SavannaM", + "Mesa", + "MesaBryce", + "MesaPlateauF", + "MesaPlateauFM", + } + + -- Ice Plains Spikes (rare) minetest.register_biome({ - name = "icesheet", - node_dust = "mcl_core:snowblock", + name = "IcePlainsSpikes", node_top = "mcl_core:snowblock", depth_top = 1, - node_filler = "mcl_core:snowblock", - depth_filler = 3, - node_stone = "mcl_core:packed_ice", + node_filler = "mcl_core:dirt", + depth_filler = 2, node_water_top = "mcl_core:ice", - depth_water_top = 10, + depth_water_top = 1, node_river_water = "mcl_core:ice", - node_riverbed = "mcl_core:gravel", + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = -8, - y_max = upper_limit, - heat_point = 0, - humidity_point = 73, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 24, + heat_point = -5, + _mcl_biome_type = "snowy", + _mcl_palette_index = 2, }) - minetest.register_biome({ - name = "icesheet_ocean", - node_dust = "mcl_core:snowblock", - node_top = "mcl_core:stone", - depth_top = 1, - node_filler = "mcl_core:stone", + name = "IcePlainsSpikes_ocean", + node_top = "mcl_core:gravel", + depth_top = 2, + node_filler = "mcl_core:gravel", depth_filler = 3, - node_water_top = "mcl_core:ice", - depth_water_top = 10, - y_min = mcl_vars.mg_overworld_min, - y_max = -9, - heat_point = 0, - humidity_point = 73, - }) - - -- Tundra - - minetest.register_biome({ - name = "tundra", - node_dust = "mcl_core:snowblock", - node_riverbed = "mcl_core:gravel", + node_river_water = "mcl_core:ice", + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 2, - y_max = upper_limit, - heat_point = 0, - humidity_point = 40, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 24, + heat_point = -5, + _mcl_biome_type = "snowy", + _mcl_palette_index = 2, }) + -- Cold Taiga minetest.register_biome({ - name = "tundra_beach", + name = "ColdTaiga", + node_dust = "mcl_core:snow", + node_top = "mcl_core:dirt_with_grass_snow", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 3, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 58, + heat_point = 8, + _mcl_biome_type = "snowy", + _mcl_palette_index = 3, + }) + + -- A cold beach-like biome, implemented as low part of Cold Taiga + minetest.register_biome({ + name = "ColdTaiga_beach", + node_dust = "mcl_core:snow", + node_top = "mcl_core:sand", + depth_top = 2, + node_water_top = "mcl_core:ice", + depth_water_top = 1, + node_filler = "mcl_core:sandstone", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = 2, + humidity_point = 58, + heat_point = 8, + _mcl_biome_type = "snowy", + _mcl_palette_index = 3, + }) + -- Water part of the beach. Added to prevent snow being on the ice. + minetest.register_biome({ + name = "ColdTaiga_beach_water", + node_top = "mcl_core:sand", + depth_top = 2, + node_water_top = "mcl_core:ice", + depth_water_top = 1, + node_filler = "mcl_core:sandstone", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = -4, + y_max = 0, + humidity_point = 58, + heat_point = 8, + _mcl_biome_type = "snowy", + _mcl_palette_index = 3, + }) + minetest.register_biome({ + name = "ColdTaiga_ocean", node_top = "mcl_core:gravel", depth_top = 1, node_filler = "mcl_core:gravel", - depth_filler = 2, - node_riverbed = "mcl_core:gravel", - depth_riverbed = 2, - y_min = -3, - y_max = 1, - heat_point = 0, - humidity_point = 40, - }) - - minetest.register_biome({ - name = "tundra_ocean", - node_top = "mcl_core:stone", - depth_top = 1, - node_filler = "mcl_core:stone", depth_filler = 3, - node_riverbed = "mcl_core:gravel", + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = -4, - heat_point = 0, - humidity_point = 40, + y_min = OCEAN_MIN, + y_max = -5, + humidity_point = 58, + heat_point = 8, + vertical_blend = 1, + _mcl_biome_type = "snowy", + _mcl_palette_index = 3, }) - -- Taiga + -- Mega Taiga minetest.register_biome({ - name = "taiga", + name = "MegaTaiga", node_top = "mcl_core:podzol", depth_top = 1, node_filler = "mcl_core:dirt", depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 15, - y_max = upper_limit, - heat_point = 26, - humidity_point = 72, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 76, + heat_point = 10, + _mcl_biome_type = "cold", + _mcl_palette_index = 4, }) - minetest.register_biome({ - name = "taiga_ocean", - node_top = "mcl_core:stone", + name = "MegaTaiga_ocean", + node_top = "mcl_core:gravel", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:gravel", depth_filler = 3, - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = 1, - heat_point = 26, - humidity_point = 72, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 76, + heat_point = 10, + _mcl_biome_type = "cold", + _mcl_palette_index = 4, }) - -- Snowy grassland - + -- Mega Spruce Taiga minetest.register_biome({ - name = "snowy_grassland", + name = "MegaSpruceTaiga", + node_top = "mcl_core:podzol", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 100, + heat_point = 8, + _mcl_biome_type = "cold", + _mcl_palette_index = 5, + }) + minetest.register_biome({ + name = "MegaSpruceTaiga_ocean", + node_top = "mcl_core:gravel", + depth_top = 1, + node_filler = "mcl_core:gravel", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 100, + heat_point = 8, + _mcl_biome_type = "cold", + _mcl_palette_index = 5, + }) + + -- Extreme Hills + -- Sparsely populated grasslands with little tallgras and trees. + minetest.register_biome({ + name = "ExtremeHills", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 4, + node_riverbed = "mcl_core:sand", + depth_riverbed = 4, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 10, + heat_point = 45, + _mcl_biome_type = "cold", + _mcl_palette_index = 6, + }) + minetest.register_biome({ + name = "ExtremeHills_beach", + node_top = "mcl_core:sand", + depth_top = 2, + depth_water_top = 1, + node_filler = "mcl_core:sandstone", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 4, + y_min = -4, + y_max = 3, + humidity_point = 10, + heat_point = 45, + _mcl_biome_type = "cold", + _mcl_palette_index = 6, + }) + minetest.register_biome({ + name = "ExtremeHills_ocean", + node_top = "mcl_core:gravel", + depth_top = 1, + node_filler = "mcl_core:gravel", + depth_filler = 4, + node_riverbed = "mcl_core:sand", + depth_riverbed = 4, + y_min = OCEAN_MIN, + y_max = -5, + vertical_blend = 1, + humidity_point = 10, + heat_point = 45, + _mcl_biome_type = "cold", + _mcl_palette_index = 6, + }) + + -- Extreme Hills M + -- Just gravel. + minetest.register_biome({ + name = "ExtremeHillsM", + node_top = "mcl_core:gravel", + depth_top = 1, + node_filler = "mcl_core:gravel", + depth_filler = 3, + node_riverbed = "mcl_core:gravel", + depth_riverbed = 3, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 0, + heat_point = 25, + _mcl_biome_type = "cold", + _mcl_palette_index = 7, + }) + minetest.register_biome({ + name = "ExtremeHillsM_ocean", + node_top = "mcl_core:gravel", + depth_top = 1, + node_filler = "mcl_core:gravel", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 3, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 0, + heat_point = 25, + _mcl_biome_type = "cold", + _mcl_palette_index = 7, + }) + + -- Extreme Hills+ + -- This biome is near-identical to Extreme Hills on the surface but has snow-covered mountains with spruce/oak + -- forests above a certain height. + minetest.register_biome({ + name = "ExtremeHills+", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 4, + node_riverbed = "mcl_core:sand", + depth_riverbed = 4, + y_min = 1, + y_max = 41, + humidity_point = 24, + heat_point = 25, + vertical_blend = 6, + _mcl_biome_type = "cold", + _mcl_palette_index = 8, + }) + ---- Sub-biome for Extreme Hills+ for those snow forests + minetest.register_biome({ + name = "ExtremeHills+_snowtop", node_dust = "mcl_core:snow", node_top = "mcl_core:dirt_with_grass_snow", depth_top = 1, node_filler = "mcl_core:dirt", - depth_filler = 1, + depth_filler = 4, + node_river_water = "mcl_core:ice", + node_riverbed = "mcl_core:sand", + depth_riverbed = 4, + y_min = 42, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 24, + heat_point = 25, + _mcl_biome_type = "cold", + _mcl_palette_index = 8, + }) + minetest.register_biome({ + name = "ExtremeHills+_ocean", + node_top = "mcl_core:gravel", + depth_top = 1, + node_filler = "mcl_core:gravel", + depth_filler = 4, + node_riverbed = "mcl_core:sand", + depth_riverbed = 4, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 24, + heat_point = 25, + _mcl_biome_type = "cold", + _mcl_palette_index = 8, + }) + + -- Stone beach + -- Just stone. + -- Not neccessarily a beach at all, only named so according to MC + minetest.register_biome({ + name = "StoneBeach", + node_riverbed = "mcl_core:sand", + depth_riverbed = 1, + y_min = -7, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 0, + heat_point = 8, + _mcl_biome_type = "cold", + _mcl_palette_index = 9, + }) + + minetest.register_biome({ + name = "StoneBeach_ocean", + node_top = "mcl_core:gravel", + depth_top = 1, + node_riverbed = "mcl_core:sand", + depth_riverbed = 1, + y_min = OCEAN_MIN, + y_max = -8, + vertical_blend = 2, + humidity_point = 0, + heat_point = 8, + _mcl_biome_type = "cold", + _mcl_palette_index = 9, + }) + + -- Ice Plains + minetest.register_biome({ + name = "IcePlains", + node_dust = "mcl_core:snow", + node_top = "mcl_core:dirt_with_grass_snow", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 2, + node_water_top = "mcl_core:ice", + depth_water_top = 2, + node_river_water = "mcl_core:ice", node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 5, - y_max = upper_limit, - heat_point = 13, - humidity_point = 79, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 24, + heat_point = 8, + _mcl_biome_type = "snowy", + _mcl_palette_index = 10, }) - minetest.register_biome({ - name = "snowy_grassland_ocean", - node_top = "mcl_core:stone", + name = "IcePlains_ocean", + node_top = "mcl_core:gravel", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:gravel", depth_filler = 3, - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = 4, - heat_point = 13, - humidity_point = 79, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 24, + heat_point = 8, + _mcl_biome_type = "snowy", + _mcl_palette_index = 10, }) - -- Grassland - + -- Plains minetest.register_biome({ - name = "grassland", + name = "Plains", node_top = "mcl_core:dirt_with_grass", depth_top = 1, node_filler = "mcl_core:dirt", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 3, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 39, + heat_point = 58, + _mcl_biome_type = "medium", + _mcl_palette_index = 0, + }) + minetest.register_biome({ + name = "Plains_beach", + node_top = "mcl_core:sand", + depth_top = 2, + node_filler = "mcl_core:sandstone", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 0, + y_max = 2, + humidity_point = 39, + heat_point = 58, + _mcl_biome_type = "medium", + _mcl_palette_index = 0, + }) + minetest.register_biome({ + name = "Plains_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -1, + humidity_point = 39, + heat_point = 58, + _mcl_biome_type = "medium", + _mcl_palette_index = 0, + }) + + -- Sunflower Plains + minetest.register_biome({ + name = "SunflowerPlains", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 28, + heat_point = 45, + _mcl_biome_type = "medium", + _mcl_palette_index = 11, + }) + minetest.register_biome({ + name = "SunflowerPlains_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:dirt", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 28, + heat_point = 45, + _mcl_biome_type = "medium", + _mcl_palette_index = 11, + }) + + -- Taiga + minetest.register_biome({ + name = "Taiga", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 58, + heat_point = 22, + _mcl_biome_type = "cold", + _mcl_palette_index = 12, + }) + minetest.register_biome({ + name = "Taiga_beach", + node_top = "mcl_core:sand", + depth_top = 2, + node_filler = "mcl_core:sandstone", depth_filler = 1, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 6, - y_max = upper_limit, - heat_point = 26, - humidity_point = 45, + y_min = 1, + y_max = 3, + humidity_point = 58, + heat_point = 22, + _mcl_biome_type = "cold", + _mcl_palette_index = 12, + }) + minetest.register_biome({ + name = "Taiga_ocean", + node_top = "mcl_core:gravel", + depth_top = 1, + node_filler = "mcl_core:gravel", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 58, + heat_point = 22, + _mcl_biome_type = "cold", + _mcl_palette_index = 12, }) + -- Forest minetest.register_biome({ - name = "grassland_dunes", + name = "Forest", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 61, + heat_point = 45, + _mcl_biome_type = "medium", + _mcl_palette_index = 13, + }) + minetest.register_biome({ + name = "Forest_beach", + node_top = "mcl_core:sand", + depth_top = 2, + node_filler = "mcl_core:sandstone", + depth_filler = 1, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = -1, + y_max = 0, + humidity_point = 61, + heat_point = 45, + _mcl_biome_type = "medium", + _mcl_palette_index = 13, + }) + minetest.register_biome({ + name = "Forest_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -2, + humidity_point = 61, + heat_point = 45, + _mcl_biome_type = "medium", + _mcl_palette_index = 13, + }) + + -- Flower Forest + minetest.register_biome({ + name = "FlowerForest", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 3, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 44, + heat_point = 32, + _mcl_biome_type = "medium", + _mcl_palette_index = 14, + }) + minetest.register_biome({ + name = "FlowerForest_beach", + node_top = "mcl_core:sand", + depth_top = 2, + node_filler = "mcl_core:sandstone", + depth_filler = 1, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = -2, + y_max = 2, + humidity_point = 44, + heat_point = 32, + _mcl_biome_type = "medium", + _mcl_palette_index = 14, + }) + minetest.register_biome({ + name = "FlowerForest_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -3, + humidity_point = 44, + heat_point = 32, + _mcl_biome_type = "medium", + _mcl_palette_index = 14, + }) + + -- Birch Forest + minetest.register_biome({ + name = "BirchForest", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 78, + heat_point = 31, + _mcl_biome_type = "medium", + _mcl_palette_index = 15, + }) + minetest.register_biome({ + name = "BirchForest_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 78, + heat_point = 31, + _mcl_biome_type = "medium", + _mcl_palette_index = 15, + }) + + -- Birch Forest M + minetest.register_biome({ + name = "BirchForestM", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 77, + heat_point = 27, + _mcl_biome_type = "medium", + _mcl_palette_index = 16, + }) + minetest.register_biome({ + name = "BirchForestM_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:gravel", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 77, + heat_point = 27, + _mcl_biome_type = "medium", + _mcl_palette_index = 16, + }) + + -- Desert + minetest.register_biome({ + name = "Desert", node_top = "mcl_core:sand", depth_top = 1, node_filler = "mcl_core:sand", depth_filler = 2, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 5, - y_max = 1, - heat_point = 26, - humidity_point = 45, - }) - - - minetest.register_biome({ - name = "grassland_ocean", - node_top = "mcl_core:stone", - depth_top = 1, - node_filler = "mcl_core:stone", - depth_filler = 3, - node_riverbed = "mcl_core:stone", - depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = 0, - heat_point = 26, - humidity_point = 45, - }) - - -- Coniferous forest - - minetest.register_biome({ - name = "coniferous_forest", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 6, - y_max = upper_limit, - heat_point = 47, - humidity_point = 73, --was 70 - }) - - minetest.register_biome({ - name = "coniferous_forest_dunes", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, + node_stone = "mcl_core:sandstone", y_min = 1, - y_max = 56, - heat_point = 47, - humidity_point = 73, --was 70 + y_max = mcl_vars.mg_overworld_max, + humidity_point = 26, + heat_point = 94, + _mcl_biome_type = "hot", + _mcl_palette_index = 17, }) - minetest.register_biome({ - name = "coniferous_forest_ocean", - node_top = "mcl_core:stone", - depth_top = 1, - node_filler = "mcl_core:stone", - depth_filler = 3, - node_riverbed = "mcl_core:stone", - depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = 0, - heat_point = 47, - humidity_point = 73, --was 70 - }) - - -- Deciduous forest - - - minetest.register_biome({ - name = "deciduous_forest", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = upper_limit, - heat_point = 33, - humidity_point = 44, --was 68 - }) - - minetest.register_biome({ - name = "deciduous_forest_shore", - node_top = "mcl_core:dirt", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = -1, - y_max = 0, - heat_point = 33, - humidity_point = 44, --was 68 - }) - - minetest.register_biome({ - name = "deciduous_forest_ocean", - node_top = "mcl_core:stone", - depth_top = 1, - node_filler = "mcl_core:stone", - depth_filler = 3, - node_riverbed = "mcl_core:stone", - depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = -2, - heat_point = 33, - humidity_point = 44, --was 68 - }) - - -- Desert - - minetest.register_biome({ - name = "desert", - node_top = "mcl_core:redsand", - depth_top = 1, - node_filler = "mcl_core:redsand", - depth_filler = 1, - node_stone = "mcl_core:redsandstone", - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = upper_limit, - heat_point = 64, - humidity_point = 37, --was 16 - }) - - minetest.register_biome({ - name = "desert_ocean", - node_top = "mcl_core:stone", - depth_top = 1, - node_filler = "mcl_core:stone", - depth_filler = 3, - node_stone = "mcl_core:stone", - node_riverbed = "mcl_core:stone", - depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = 0, - heat_point = 64, - humidity_point = 37, --was 16 - }) - - -- Sandstone desert - - minetest.register_biome({ - name = "sandstone_desert", + name = "Desert_ocean", node_top = "mcl_core:sand", depth_top = 1, node_filler = "mcl_core:sand", - depth_filler = 1, - node_stone = "mcl_core:sandstone", + depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 0, - y_max = upper_limit, - heat_point = 57, - humidity_point = 0, --was 0 + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 26, + heat_point = 94, + _mcl_biome_type = "hot", + _mcl_palette_index = 17, }) + -- Roofed Forest minetest.register_biome({ - name = "sandstone_desert_ocean", - node_top = "mcl_core:stone", + name = "RoofedForest", + node_top = "mcl_core:dirt_with_grass", depth_top = 1, - node_filler = "mcl_core:stone", - depth_filler = 3, - node_stone = "mcl_core:stone", - node_riverbed = "mcl_core:stone", + node_filler = "mcl_core:dirt", + depth_filler = 2, + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = 4, - heat_point = 57, - humidity_point = 0, --was 0 + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 94, + heat_point = 27, + _mcl_biome_type = "medium", + _mcl_palette_index = 18, }) - - -- Cold desert - minetest.register_biome({ - name = "cold_desert", - --node_dust = "", - node_top = "mcl_core:stone", + name = "RoofedForest_ocean", + node_top = "mcl_core:gravel", depth_top = 1, - node_filler = "mcl_core:stone", - depth_filler = 1, - node_riverbed = "mcl_core:stone", + node_filler = "mcl_core:gravel", + depth_filler = 2, + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 5, - y_max = upper_limit, - heat_point = 26, - humidity_point = 0, --was 0 + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 94, + heat_point = 27, + _mcl_biome_type = "medium", + _mcl_palette_index = 18, }) + -- Mesa: Starts with a couple of sand-covered layers (the "sandlevel"), + -- followed by terracotta with colorful (but imperfect) strata minetest.register_biome({ - name = "cold_desert_ocean", - node_top = "mcl_core:stone", + name = "Mesa", + node_top = "mcl_colorblocks:hardened_clay", depth_top = 1, - node_filler = "mcl_core:stone", - depth_filler = 3, - node_riverbed = "mcl_core:stone", - depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = 4, - heat_point = 26, - humidity_point = 0, --was 0 + node_filler = "mcl_colorblocks:hardened_clay", + node_riverbed = "mcl_core:redsand", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay", + y_min = 11, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 0, + heat_point = 100, + _mcl_biome_type = "hot", + _mcl_palette_index = 19, }) - - -- Hot biomes + -- Helper biome for the red sand at the bottom of Mesas. minetest.register_biome({ - name = "mesa", - node_top = "mcl_colorblocks:hardened_clay_orange", + name = "Mesa_sandlevel", + node_top = "mcl_core:redsand", depth_top = 1, node_filler = "mcl_colorblocks:hardened_clay_orange", - depth_filler = 1, + depth_filler = 3, + node_riverbed = "mcl_core:redsand", + depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay_orange", - y_min = -35, - y_max = upper_limit, - heat_point = 88, - humidity_point = 20, --was 40 + y_min = -4, + y_max = 10, + humidity_point = 0, + heat_point = 100, + _mcl_biome_type = "hot", + _mcl_palette_index = 19, + }) + minetest.register_biome({ + name = "Mesa_ocean", + node_top = "mcl_core:sand", + depth_top = 3, + node_filler = "mcl_core:sand", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -5, + vertical_blend = 1, + humidity_point = 0, + heat_point = 100, + _mcl_biome_type = "hot", + _mcl_palette_index = 19, + }) + + -- Mesa Bryce: Variant of Mesa, but with perfect strata and a much smaller red sand desert + minetest.register_biome({ + name = "MesaBryce", + node_top = "mcl_colorblocks:hardened_clay", + depth_top = 1, + node_filler = "mcl_colorblocks:hardened_clay", + node_riverbed = "mcl_colorblocks:hardened_clay", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay", + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + humidity_point = -5, + heat_point = 100, + _mcl_biome_type = "hot", + _mcl_palette_index = 20, + }) + minetest.register_biome({ + name = "MesaBryce_sandlevel", + node_top = "mcl_core:redsand", + depth_top = 1, + node_filler = "mcl_colorblocks:hardened_clay_orange", + depth_filler = 3, + node_riverbed = "mcl_colorblocks:hardened_clay", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay_orange", + y_min = -4, + y_max = 3, + humidity_point = -5, + heat_point = 100, + _mcl_biome_type = "hot", + _mcl_palette_index = 20, + }) + minetest.register_biome({ + name = "MesaBryce_ocean", + node_top = "mcl_core:sand", + depth_top = 3, + node_filler = "mcl_core:sand", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -5, + vertical_blend = 1, + humidity_point = -5, + heat_point = 100, + _mcl_biome_type = "hot", + _mcl_palette_index = 20, + }) + + + + -- Mesa Plateau F + -- Identical to Mesa below Y=30. At Y=30 and above there is a "dry" oak forest + minetest.register_biome({ + name = "MesaPlateauF", + node_top = "mcl_colorblocks:hardened_clay", + depth_top = 1, + node_filler = "mcl_colorblocks:hardened_clay", + node_riverbed = "mcl_core:redsand", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay", + y_min = 11, + y_max = 29, + humidity_point = 0, + heat_point = 60, + vertical_blend = 0, -- we want a sharp transition + _mcl_biome_type = "hot", + _mcl_palette_index = 21, + }) + -- The oak forest plateau of this biome. + -- This is a plateau for grass blocks, dry shrubs, tall grass, coarse dirt and oaks. + -- Strata don't generate here. + minetest.register_biome({ + name = "MesaPlateauF_grasstop", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 1, + node_riverbed = "mcl_core:redsand", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay", + y_min = 30, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 0, + heat_point = 60, + _mcl_biome_type = "hot", + _mcl_palette_index = 21, + }) + minetest.register_biome({ + name = "MesaPlateauF_sandlevel", + node_top = "mcl_core:redsand", + depth_top = 2, + node_filler = "mcl_colorblocks:hardened_clay_orange", + depth_filler = 3, + node_riverbed = "mcl_core:redsand", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay_orange", + y_min = -5, + y_max = 10, + humidity_point = 0, + heat_point = 60, + _mcl_biome_type = "hot", + _mcl_palette_index = 21, + }) + minetest.register_biome({ + name = "MesaPlateauF_ocean", + node_top = "mcl_core:sand", + depth_top = 3, + node_filler = "mcl_core:sand", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -6, + vertical_blend = 1, + humidity_point = 0, + heat_point = 60, + _mcl_biome_type = "hot", + _mcl_palette_index = 21, + }) + + -- Mesa Plateau FM + -- Dryer and more "chaotic"/"weathered down" variant of MesaPlateauF: + -- oak forest is less dense, more coarse dirt, more erratic terrain, vertical blend, more red sand layers, + -- red sand as ores, red sandstone at sandlevel + minetest.register_biome({ + name = "MesaPlateauFM", + node_top = "mcl_colorblocks:hardened_clay", + depth_top = 1, + node_filler = "mcl_colorblocks:hardened_clay", + node_riverbed = "mcl_core:redsand", + depth_riverbed = 2, + node_stone = "mcl_colorblocks:hardened_clay", + y_min = 12, + y_max = 29, + humidity_point = -5, + heat_point = 60, + vertical_blend = 5, + _mcl_biome_type = "hot", + _mcl_palette_index = 22, + }) + -- Grass plateau + minetest.register_biome({ + name = "MesaPlateauFM_grasstop", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:coarse_dirt", + depth_filler = 2, + node_riverbed = "mcl_core:redsand", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay", + y_min = 30, + y_max = mcl_vars.mg_overworld_max, + humidity_point = -5, + heat_point = 60, + _mcl_biome_type = "hot", + _mcl_palette_index = 22, + }) + minetest.register_biome({ + name = "MesaPlateauFM_sandlevel", + node_top = "mcl_core:redsand", + depth_top = 3, + node_filler = "mcl_colorblocks:hardened_clay_orange", + depth_filler = 3, + node_riverbed = "mcl_core:redsand", + depth_riverbed = 2, + node_stone = "mcl_colorblocks:hardened_clay", + -- red sand has wider reach than in other mesa biomes + y_min = -7, + y_max = 11, + humidity_point = -5, + heat_point = 60, + vertical_blend = 4, + _mcl_biome_type = "hot", + _mcl_palette_index = 22, + }) + minetest.register_biome({ + name = "MesaPlateauFM_ocean", + node_top = "mcl_core:sand", + depth_top = 3, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 3, + y_min = OCEAN_MIN, + y_max = -8, + vertical_blend = 2, + humidity_point = -5, + heat_point = 60, + _mcl_biome_type = "hot", + _mcl_palette_index = 22, }) -- Savanna minetest.register_biome({ - name = "savanna", + name = "Savanna", node_top = "mcl_core:dirt_with_grass", depth_top = 1, node_filler = "mcl_core:dirt", - depth_filler = 1, + depth_filler = 2, node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = upper_limit, - heat_point = 50, - humidity_point = 46, --was 42 + y_max = mcl_vars.mg_overworld_max, + humidity_point = 36, + heat_point = 79, + _mcl_biome_type = "hot", + _mcl_palette_index = 1, }) - minetest.register_biome({ - name = "savanna_shore", - node_top = "mcl_core:dirt", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, + name = "Savanna_beach", + node_top = "mcl_core:sand", + depth_top = 3, + node_filler = "mcl_core:sandstone", + depth_filler = 2, node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = -1, y_max = 0, - heat_point = 50, - humidity_point = 46, --was 42 + humidity_point = 36, + heat_point = 79, + _mcl_biome_type = "hot", + _mcl_palette_index = 1, }) - minetest.register_biome({ - name = "savanna_ocean", - node_top = "mcl_core:stone", - depth_top = 1, - node_filler = "mcl_core:stone", - depth_filler = 3, - node_riverbed = "mcl_core:stone", - depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = -2, - heat_point = 50, - humidity_point = 46, --was 42 - }) - - -- Rainforest - - minetest.register_biome({ - name = "rainforest", - node_top = "mcl_core:podzol", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = upper_limit, - heat_point = 90, - humidity_point = 91, - }) - - minetest.register_biome({ - name = "rainforest_swamp", - node_top = "mcl_core:dirt", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = -1, - y_max = 0, - heat_point = 90, - humidity_point = 91, - }) - - minetest.register_biome({ - name = "rainforest_ocean", + name = "Savanna_ocean", node_top = "mcl_core:sand", depth_top = 1, node_filler = "mcl_core:sand", depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, + y_min = OCEAN_MIN, y_max = -2, - heat_point = 90, - humidity_point = 91, + humidity_point = 36, + heat_point = 79, + _mcl_biome_type = "hot", + _mcl_palette_index = 1, }) - -- Mushroom biomes + -- Savanna M + -- Changes to Savanna: Coarse Dirt. No sand beach. No oaks. + -- Otherwise identical to Savanna minetest.register_biome({ - name = "mushroom", + name = "SavannaM", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:coarse_dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 48, + heat_point = 100, + _mcl_biome_type = "hot", + _mcl_palette_index = 23, + }) + minetest.register_biome({ + name = "SavannaM_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 48, + heat_point = 100, + _mcl_biome_type = "hot", + _mcl_palette_index = 23, + }) + + -- Jungle + minetest.register_biome({ + name = "Jungle", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 88, + heat_point = 81, + _mcl_biome_type = "medium", + _mcl_palette_index = 24, + }) + minetest.register_biome({ + name = "Jungle_shore", + node_top = "mcl_core:dirt", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = -2, + y_max = 0, + humidity_point = 88, + heat_point = 81, + _mcl_biome_type = "medium", + _mcl_palette_index = 24, + }) + minetest.register_biome({ + name = "Jungle_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -3, + vertical_blend = 1, + humidity_point = 88, + heat_point = 81, + _mcl_biome_type = "medium", + _mcl_palette_index = 24, + }) + + -- Jungle M + -- Like Jungle but with even more dense vegetation + minetest.register_biome({ + name = "JungleM", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 92, + heat_point = 81, + _mcl_biome_type = "medium", + _mcl_palette_index = 25, + }) + minetest.register_biome({ + name = "JungleM_shore", + node_top = "mcl_core:dirt", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = -2, + y_max = 0, + humidity_point = 92, + heat_point = 81, + _mcl_biome_type = "medium", + _mcl_palette_index = 25, + }) + minetest.register_biome({ + name = "JungleM_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -3, + vertical_blend = 1, + humidity_point = 92, + heat_point = 81, + _mcl_biome_type = "medium", + _mcl_palette_index = 25, + }) + + -- Jungle Edge + minetest.register_biome({ + name = "JungleEdge", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 88, + heat_point = 76, + _mcl_biome_type = "medium", + _mcl_palette_index = 26, + }) + minetest.register_biome({ + name = "JungleEdge_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 88, + heat_point = 76, + _mcl_biome_type = "medium", + _mcl_palette_index = 26, + }) + + -- Jungle Edge M (very rare). + -- Almost identical to Jungle Edge. Has deeper dirt. Melons spawn here a lot. + -- This biome occours directly between Jungle M and Jungle Edge but also has a small border to Jungle. + -- This biome is very small in general. + minetest.register_biome({ + name = "JungleEdgeM", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 4, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + humidity_point = 90, + heat_point = 79, + _mcl_biome_type = "medium", + _mcl_palette_index = 27, + }) + minetest.register_biome({ + name = "JungleEdgeM_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 4, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = 0, + humidity_point = 90, + heat_point = 79, + _mcl_biome_type = "medium", + _mcl_palette_index = 27, + }) + + -- Swampland + minetest.register_biome({ + name = "Swampland", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + -- Note: Limited in height! + y_max = 23, + humidity_point = 90, + heat_point = 50, + _mcl_biome_type = "medium", + _mcl_palette_index = 28, + }) + minetest.register_biome({ + name = "Swampland_shore", + node_top = "mcl_core:dirt", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = -5, + y_max = 0, + humidity_point = 90, + heat_point = 50, + _mcl_biome_type = "medium", + _mcl_palette_index = 28, + }) + minetest.register_biome({ + name = "Swampland_ocean", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -6, + vertical_blend = 1, + humidity_point = 90, + heat_point = 50, + _mcl_biome_type = "medium", + _mcl_palette_index = 28, + }) + + -- Mushroom Island / Mushroom Island Shore (rare) + -- Not neccessarily an island at all, only named after Minecraft's biome + minetest.register_biome({ + name = "MushroomIsland", + node_top = "mcl_core:mycelium", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 4, + -- Note: Limited in height! + y_max = 20, + vertical_blend = 1, + humidity_point = 106, + heat_point = 50, + _mcl_biome_type = "medium", + _mcl_palette_index = 29, + }) + + minetest.register_biome({ + name = "MushroomIslandShore", node_top = "mcl_core:mycelium", depth_top = 1, node_filler = "mcl_core:dirt", @@ -503,330 +1414,475 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = 20, - heat_point = 99, - humidity_point = 99, + y_max = 3, + humidity_point = 106, + heat_point = 50, + _mcl_biome_type = "medium", + _mcl_palette_index = 29, }) - minetest.register_biome({ - name = "mushroom_ocean", - node_top = "mcl_core:stone", + name = "MushroomIsland_ocean", + node_top = "mcl_core:gravel", depth_top = 1, node_filler = "mcl_core:gravel", depth_filler = 3, - node_riverbed = "mcl_core:coarse_dirt", + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = mcl_vars.mg_overworld_min, + y_min = OCEAN_MIN, y_max = 0, - heat_point = 99, - humidity_point = 99, - }) - - - --cold - minetest.register_biome({ - name = "mushroom_cold", - node_dust = "mcl_core:snow", - node_top = "mcl_core:mycelium_snow", - depth_top = 1, - node_filler = "mcl_core:coarse_dirt", - depth_filler = 3, - node_riverbed = "mcl_core:stone", - depth_riverbed = 2, - y_min = 56, - y_max = upper_limit, - heat_point = -13, - humidity_point = 30, - }) - - - - -- Underground in Overworld - minetest.register_biome({ - name = "underground", - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(61), + humidity_point = 106, heat_point = 50, - humidity_point = 50, + _mcl_biome_type = "medium", + _mcl_palette_index = 29, }) + -- Add deep ocean and underground biomes automatically. + for i=1, #overworld_biomes do + local biome = overworld_biomes[i] + -- Deep Ocean + minetest.register_biome({ + name = biome .. "_deep_ocean", + heat_point = minetest.registered_biomes[biome].heat_point, + humidity_point = minetest.registered_biomes[biome].humidity_point, + y_min = DEEP_OCEAN_MIN, + y_max = DEEP_OCEAN_MAX, + node_top = minetest.registered_biomes[biome.."_ocean"].node_top, + depth_top = 2, + node_filler = minetest.registered_biomes[biome.."_ocean"].node_filler, + depth_filler = 3, + node_riverbed = minetest.registered_biomes[biome.."_ocean"].node_riverbed, + depth_riverbed = 2, + vertical_blend = 5, + _mcl_biome_type = minetest.registered_biomes[biome]._mcl_biome_type, + _mcl_palette_index = minetest.registered_biomes[biome]._mcl_palette_index, + }) + + -- Underground biomes are used to identify the underground and to prevent nodes from the surface + -- (sand, dirt) from leaking into the underground. + minetest.register_biome({ + name = biome .. "_underground", + heat_point = minetest.registered_biomes[biome].heat_point, + humidity_point = minetest.registered_biomes[biome].humidity_point, + y_min = mcl_vars.mg_overworld_min, + y_max = DEEP_OCEAN_MIN - 1, + _mcl_biome_type = minetest.registered_biomes[biome]._mcl_biome_type, + _mcl_palette_index = minetest.registered_biomes[biome]._mcl_palette_index, + }) + + end +end + +-- Register biomes of non-Overworld biomes +local function register_dimension_biomes() --[[ REALMS ]] - -- TODO: Make these work in v6, too. --[[ THE NETHER ]] - minetest.register_biome({ - name = "nether", + name = "Nether", node_filler = "mcl_nether:netherrack", node_stone = "mcl_nether:netherrack", + node_water = "air", + node_river_water = "air", y_min = mcl_vars.mg_nether_min, -- FIXME: For some reason the Nether stops generating early if this constant is not added. -- Figure out why. y_max = mcl_vars.mg_nether_max + 80, heat_point = 100, humidity_point = 0, + _mcl_biome_type = "hot", + _mcl_palette_index = 19, }) --[[ THE END ]] - minetest.register_biome({ - name = "end", - node_filler = "mcl_end:end_stone", - node_stone = "mcl_end:end_stone", - y_min = mcl_vars.mg_end_min, - -- FIXME: For some reason the Nether stops generating early if this constant is not added. + name = "End", + node_stone = "air", + node_filler = "air", + node_water = "air", + node_river_water = "air", + -- FIXME: For some reason the End stops generating early if this constant is not added. -- Figure out why. + y_min = mcl_vars.mg_end_min, y_max = mcl_vars.mg_end_max + 80, heat_point = 50, humidity_point = 50, + _mcl_biome_type = "medium", + _mcl_palette_index = 0, }) - end --- Register “fake” ores directly related to the biomes -local function register_biomelike_ores() +-- Register ores which are limited by biomes. For all mapgens except flat and singlenode. +local function register_biome_ores() + local stonelike = {"mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite"} - -- Fake moss stone boulder - -- TODO: Remove when real boulders are added + -- Emeralds minetest.register_ore({ - ore_type = "blob", - ore = "mcl_core:mossycobble", - wherein = "mcl_core:podzol", - biomes = {"taiga"}, - clust_scarcity = 16 * 16 * 16, - clust_size = 3, - y_min = 25, - y_max = 31000, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.2, - spread = {x = 3, y = 3, z = 3}, - seed = 17676, - octaves = 1, - persist = 0.0 + ore_type = "scatter", + ore = "mcl_core:stone_with_emerald", + wherein = stonelike, + clust_scarcity = 16384, + clust_num_ores = 1, + clust_size = 1, + y_min = mcl_worlds.layer_to_y(4), + y_max = mcl_worlds.layer_to_y(32), + biomes = { + "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean", "ExtremeHills_deep_ocean", "ExtremeHills_underground", + "ExtremeHills+", "ExtremeHills+_ocean", "ExtremeHills+_deep_ocean", "ExtremeHills+_underground", + "ExtremeHillsM", "ExtremeHillsM_ocean", "ExtremeHillsM_deep_ocean", "ExtremeHillsM_underground", }, }) - --mcl_core STRATA + -- Rarely replace stone with stone monster eggs. + -- In v6 this can happen anywhere, in other mapgens only in Extreme Hills. + local monster_egg_scarcity + if mg_name == "v6" then + monster_egg_scarcity = 28 * 28 * 28 + else + monster_egg_scarcity = 26 * 26 * 26 + end minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:stone", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_scarcity = 1, + ore_type = "scatter", + ore = "mcl_monster_eggs:monster_egg_stone", + wherein = "mcl_core:stone", + clust_scarcity = monster_egg_scarcity, clust_num_ores = 3, - clust_size = 4, - y_min = 50, - y_max = 90, - noise_threshold = 0.4, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} - }) - - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:clay", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_scarcity = 1, - clust_num_ores = 12, - clust_size = 8, - y_min = 24, - y_max = 50, - noise_threshold = 0.4, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} - }) - - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:sandstone", - wherein ={"mcl_colorblocks:hardened_clay_orange"}, - clust_scarcity = 1, - clust_num_ores = 12, - clust_size = 10, - y_min = 10, - y_max = 30, - noise_threshold = 0.2, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} - }) - - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:dirt", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_scarcity = 1, - clust_num_ores = 12, - clust_size = 4, - y_min = -12, - y_max = 7, - noise_threshold = 0.4, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} - }) - - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:redsand", - wherein = { "mcl_colorblocks:hardened_clay_orange"}, - clust_scarcity = 1, - clust_num_ores = 12, - clust_size = 10, - y_min = 44, - y_max = 70, - noise_threshold = 0.7, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} - }) - - - -- MESA STRATA - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:redsand", - wherein = {"mcl_core:redsandstone", "mcl_colorblocks:hardened_clay_orange"}, - clust_scarcity = 1, - clust_num_ores = 8, - clust_size = 4, - y_min = 4, - y_max = 70, - noise_threshold = 0.4, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} - }) - - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_white", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 1, - y_min = 5, - y_max = 14, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , - }) - - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_black", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 1, - y_min = 15, - y_max = 17, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70}, - }) - - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_brown", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 6, - y_min = 20, - y_max = 29, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , - }) - - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_red", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, clust_size = 2, - y_min = 34, - y_max = 37, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_worlds.layer_to_y(61), + biomes = { + "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean", "ExtremeHills_deep_ocean", "ExtremeHills_underground", + "ExtremeHills+", "ExtremeHills+_ocean", "ExtremeHills+_deep_ocean", "ExtremeHills+_underground", + "ExtremeHillsM", "ExtremeHillsM_ocean", "ExtremeHillsM_deep_ocean", "ExtremeHillsM_underground", + }, + }) + + -- Bonus gold spawn in Mesa + if mg_name ~= "v6" then + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_core:stone_with_gold", + wherein = stonelike, + clust_scarcity = 3333, + clust_num_ores = 5, + clust_size = 3, + y_min = mcl_worlds.layer_to_y(32), + y_max = mcl_worlds.layer_to_y(79), + biomes = { "Mesa", "Mesa_sandlevel", "Mesa_ocean", + "MesaBryce", "MesaBryce_sandlevel", "MesaBryce_ocean", + "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", + "MesaPlateauFM", "MesaPlateauFM_sandlevel", "MesaPlateauFM_ocean", }, + }) + end +end + +-- Register “fake” ores directly related to the biomes. These are mostly low-level landscape alternations +local function register_biomelike_ores() + + -- Random coarse dirt floor in Mega Taiga and Mesa Plateau F + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:coarse_dirt", + wherein = {"mcl_core:podzol", "mcl_core:dirt"}, + clust_scarcity = 1, + clust_num_ores = 12, + clust_size = 10, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + noise_threshold = 0.2, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}, + biomes = { "MegaTaiga" }, }) minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_yellow", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 1, - y_min = 42, - y_max = 43, + ore_type = "sheet", + ore = "mcl_core:coarse_dirt", + wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, + column_height_max = 1, + column_midpoint_factor = 0.0, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + noise_params = {offset=0, scale=15, spread={x=250, y=250, z=250}, seed=24, octaves=3, persist=0.70}, + biomes = { "MesaPlateauF_grasstop" }, }) minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_blue", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 1, - y_min = 43, - y_max = 44, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + ore_type = "blob", + ore = "mcl_core:coarse_dirt", + wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, + clust_scarcity = 1500, + clust_num_ores = 25, + clust_size = 7, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + biomes = { "MesaPlateauF_grasstop" }, }) minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_yellow", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 1, - y_min = 44, - y_max = 45, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + ore_type = "sheet", + ore = "mcl_core:coarse_dirt", + wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, + column_height_max = 1, + column_midpoint_factor = 0.0, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + noise_threshold = -2.5, + noise_params = {offset=1, scale=15, spread={x=250, y=250, z=250}, seed=24, octaves=3, persist=0.80}, + biomes = { "MesaPlateauFM_grasstop" }, }) minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_yellow", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 1, - y_min = 45, - y_max = 47, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + ore_type = "blob", + ore = "mcl_core:coarse_dirt", + wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, + clust_scarcity = 1800, + clust_num_ores = 65, + clust_size = 15, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + biomes = { "MesaPlateauFM_grasstop" }, + }) + -- Occasionally dig out portions of MesaPlateauFM + minetest.register_ore({ + ore_type = "blob", + ore = "air", + wherein = {"group:hardened_clay", "group:sand","mcl_core:coarse_dirt"}, + clust_scarcity = 4000, + clust_size = 5, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + biomes = { "MesaPlateauFM", "MesaPlateauFM_grasstop" }, }) minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_light_blue", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 1, - y_min = 49, - y_max = 52, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + ore_type = "blob", + ore = "mcl_core:redsandstone", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_scarcity = 300, + clust_size = 8, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + biomes = { "MesaPlateauFM_sandlevel" }, + }) + -- More red sand in MesaPlateauFM + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:redsand", + wherein = {"group:hardened_clay"}, + clust_scarcity = 1, + clust_num_ores = 12, + clust_size = 10, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + noise_threshold = 0.1, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=95, octaves=3, persist=0.70}, + biomes = { "MesaPlateauFM" }, }) minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_yellow", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 4, - y_min = 53, - y_max = 59, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , - }) - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_white", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 8, - y_min = 61, - y_max = 70, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , - }) - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_colorblocks:hardened_clay_purple", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_size = 8, - y_min = 66, - y_max = 75, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , - }) - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:obsidian", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - - clust_size = 8, - y_min = 161, - y_max = 170, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread= {x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + ore_type = "blob", + ore = "mcl_core:redsand", + wherein = {"group:hardened_clay"}, + clust_scarcity = 1500, + clust_size = 4, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + biomes = { "MesaPlateauFM", "MesaPlateauFM_grasstop", "MesaPlateauFM_sandlevel" }, }) + -- Small dirt patches in Extreme Hills M + minetest.register_ore({ + ore_type = "blob", + -- TODO: Should be grass block. But generating this as ore means gras blocks will spawn undeground. :-( + ore = "mcl_core:dirt", + wherein = {"mcl_core:gravel"}, + clust_scarcity = 5000, + clust_num_ores = 12, + clust_size = 4, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + noise_threshold = 0.2, + noise_params = {offset=0, scale=5, spread={x=250, y=250, z=250}, seed=64, octaves=3, persist=0.60}, + biomes = { "ExtremeHillsM" }, + }) + -- For a transition from stone to hardened clay in mesa biomes that is not perfectly flat + minetest.register_ore({ + ore_type = "stratum", + ore = "mcl_core:stone", + wherein = {"group:hardened_clay"}, + noise_params = {offset=-6, scale=2, spread={x=25, y=25, z=25}, octaves=1, persist=0.60}, + stratum_thickness = 8, + biomes = { + "Mesa_sandlevel", "Mesa_ocean", + "MesaBryce_sandlevel", "MesaBryce_ocean", + "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", + "MesaPlateauFM_sandlevel", "MesaPlateauFM_ocean", + }, + y_min = -4, + y_max = 0, + + }) + + -- Mesa strata (registered as sheet ores) + + -- Helper function to create strata. + local stratum = function(y_min, height, color, seed, is_perfect) + if not height then + height = 1 + end + if not seed then + seed = 39 + end + local y_max = y_min + height-1 + local perfect_biomes + if is_perfect then + -- "perfect" means no erosion + perfect_biomes = { "MesaBryce", "Mesa", "MesaPlateauF", "MesaPlateauFM" } + else + perfect_biomes = { "MesaBryce" } + end + -- Full, perfect stratum + minetest.register_ore({ + ore_type = "stratum", + ore = "mcl_colorblocks:hardened_clay_"..color, + -- Only paint uncolored so the biome can choose + -- a color in advance. + wherein = {"mcl_colorblocks:hardened_clay"}, + y_min = y_min, + y_max = y_max, + biomes = perfect_biomes, + }) + if not is_perfect then + -- Slightly eroded stratum, only minor imperfections + minetest.register_ore({ + ore_type = "stratum", + ore = "mcl_colorblocks:hardened_clay_"..color, + wherein = {"mcl_colorblocks:hardened_clay"}, + y_min = y_min, + y_max = y_max, + biomes = { "Mesa", "MesaPlateauF" }, + noise_params = { + offset = y_min+(y_max-y_min)/2, + scale = 0, + spread = {x = 50, y = 50, z = 50}, + seed = seed+4, + octaves = 1, + persist = 1.0 + }, + np_stratum_thickness = { + offset = 1.28, + scale = 1, + spread = {x = 18, y = 18, z = 18}, + seed = seed+4, + octaves = 3, + persist = 0.8, + }, + }) + -- Very eroded stratum, most of the color is gone + minetest.register_ore({ + ore_type = "stratum", + ore = "mcl_colorblocks:hardened_clay_"..color, + wherein = {"mcl_colorblocks:hardened_clay"}, + y_min = y_min, + y_max = y_max, + biomes = { "MesaPlateauFM" }, + noise_params = { + offset = y_min+(y_max-y_min)/2, + scale = 0, + spread = {x = 50, y = 50, z = 50}, + seed = seed+4, + octaves = 1, + persist = 1.0 + }, + np_stratum_thickness = { + offset = 0.1, + scale = 1, + spread = {x = 28, y = 28, z = 28}, + seed = seed+4, + octaves = 2, + persist = 0.6, + }, + }) + end + + end + + -- Hardcoded orange strata near sea level. + + -- For MesaBryce, since it has no sand at these heights + stratum(4, 1, "orange", nil, true) + stratum(7, 2, "orange", nil, true) + + -- 3-level stratum above the sandlevel (all mesa biomes) + stratum(11, 3, "orange", nil, true) + + -- Create random strata for up to Y = 256. + -- These strata are calculated based on the world seed and are global. + -- They are thus different per-world. + local mesapr = PcgRandom(mg_seed) + + --[[ + + ------ DANGER ZONE! ------ + + The following code is sensitive to changes; changing any number may break + mapgen consistency when the mapgen generates new mapchunks in existing + worlds because the random generator will yield different results and the strata + suddenly don't match up anymore. ]] + + -- Available Mesa colors: + local mesa_stratum_colors = { "silver", "brown", "orange", "red", "yellow", "white" } + + -- Start level + local y = 17 + + -- Generate stratas + repeat + -- Each stratum has a color (duh!) + local colorid = mesapr:next(1, #mesa_stratum_colors) + + -- … and a random thickness + local heightrandom = mesapr:next(1, 12) + local h + if heightrandom == 12 then + h = 4 + elseif heightrandom >= 10 then + h = 3 + elseif heightrandom >= 8 then + h = 2 + else + h = 1 + end + -- Small built-in bias: Only thin strata up to this Y level + if y < 45 then + h = math.min(h, 2) + end + + -- Register stratum + stratum(y, h, mesa_stratum_colors[colorid]) + + -- Skip a random amount of layers (which won't get painted) + local skiprandom = mesapr:next(1, 12) + local skip + if skiprandom == 12 then + skip = 4 + elseif skiprandom >= 10 then + skip = 3 + elseif skiprandom >= 5 then + skip = 2 + elseif skiprandom >= 2 then + skip = 1 + else + -- If this happens, the next stratum will touch the previous one without gap + skip = 0 + end + + -- Get height of next stratum or finish + y = y + h + skip + until y > 256 + + --[[ END OF DANGER ZONE ]] +end + +-- Non-Overworld ores +local function register_dimension_ores() --[[ NETHER GENERATION ]] @@ -834,11 +1890,13 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "sheet", ore = "mcl_nether:soul_sand", - wherein = {"mcl_nether:netherrack"}, + -- Note: Stone is included only for v6 mapgen support. Netherrack is not generated naturally + -- in v6, but instead set with the on_generated function in mcl_mapgen_core. + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 13 * 13 * 13, clust_size = 5, y_min = mcl_vars.mg_nether_min, - y_max = mcl_util.layer_to_y(64, "nether"), + y_max = mcl_worlds.layer_to_y(64, "nether"), noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -854,29 +1912,29 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "blob", ore = "mcl_nether:magma", - wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 14*14*14, - clust_num_ores = 35, - clust_size = 4, - y_min = mcl_util.layer_to_y(23, "nether"), - y_max = mcl_util.layer_to_y(37, "nether"), + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, + clust_scarcity = 8*8*8, + clust_num_ores = 45, + clust_size = 6, + y_min = mcl_worlds.layer_to_y(23, "nether"), + y_max = mcl_worlds.layer_to_y(37, "nether"), }) minetest.register_ore({ ore_type = "blob", ore = "mcl_nether:magma", wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 9*9*9, - clust_num_ores = 50, - clust_size = 5, - y_min = mcl_util.layer_to_y(23, "nether"), - y_max = mcl_util.layer_to_y(37, "nether"), + clust_scarcity = 10*10*10, + clust_num_ores = 65, + clust_size = 8, + y_min = mcl_worlds.layer_to_y(23, "nether"), + y_max = mcl_worlds.layer_to_y(37, "nether"), }) -- Glowstone minetest.register_ore({ ore_type = "blob", ore = "mcl_nether:glowstone", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 26 * 26 * 26, clust_size = 5, y_min = mcl_vars.mg_lava_nether_max + 10, @@ -896,18 +1954,20 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "sheet", ore = "mcl_core:gravel", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, column_height_min = 1, column_height_max = 1, - y_min = mcl_util.layer_to_y(63, "nether"), - y_max = mcl_util.layer_to_y(65, "nether"), - noise_threshold = 0.0, + column_midpoint_factor = 0, + y_min = mcl_worlds.layer_to_y(63, "nether"), + -- This should be 65, but for some reason with this setting, the sheet ore really stops at 65. o_O + y_max = mcl_worlds.layer_to_y(65+2, "nether"), + noise_threshold = 0.2, noise_params = { offset = 0.0, - scale = 0.2, - spread = {x = 50, y = 50, z = 50}, + scale = 0.5, + spread = {x = 20, y = 20, z = 20}, seed = 766, - octaves = 1, + octaves = 3, persist = 0.6, }, }) @@ -916,7 +1976,7 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:quartz_ore", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 850, clust_num_ores = 4, -- MC cluster amount: 4-10 clust_size = 3, @@ -926,7 +1986,7 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:quartz_ore", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 1650, clust_num_ores = 8, -- MC cluster amount: 4-10 clust_size = 4, @@ -938,7 +1998,7 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 500, clust_num_ores = 1, clust_size = 1, @@ -949,7 +2009,7 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 1000, clust_num_ores = 1, clust_size = 1, @@ -960,7 +2020,7 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 2000, clust_num_ores = 1, clust_size = 1, @@ -970,7 +2030,7 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 3500, clust_num_ores = 1, clust_size = 1, @@ -978,59 +2038,97 @@ local function register_biomelike_ores() y_max = mcl_vars.mg_nether_max, }) - -- Fire in the Nether - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_fire:eternal_fire", - wherein = "mcl_nether:netherrack", - clust_scarcity =12 *22 * 12, - clust_num_ores = 5, - clust_size = 5, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - --[[ THE END ]] -- Generate fake End - -- TODO: Remove both "ores" when there's a better End + -- TODO: Remove the "ores" when there's a better End generator + -- FIXME: Broken lighting in v6 mapgen + + local end_wherein + if mg_name == "v6" then + end_wherein = {"air", "mcl_core:stone"} + else + end_wherein = {"air"} + end minetest.register_ore({ - ore_type = "blob", + ore_type = "stratum", ore = "mcl_end:end_stone", - wherein = {"air", "mcl_core:stone"}, - clust_scarcity = 30 * 30 * 30, - clust_size = 17, - y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.1, - spread = {x = 5, y = 5, z = 5}, - seed = 16, - octaves = 1, - persist = 0.0 + wherein = end_wherein, + y_min = mcl_vars.mg_end_min+64, + y_max = mcl_vars.mg_end_min+80, + + noise_params = { + offset = mcl_vars.mg_end_min+70, + scale = -1, + spread = {x=126, y=126, z=126}, + seed = mg_seed+9999, + octaves = 3, + persist = 0.5, }, + + np_stratum_thickness = { + offset = -2, + scale = 10, + spread = {x=126, y=126, z=126}, + seed = mg_seed+9999, + octaves = 3, + persist = 0.5, + }, + clust_scarcity = 1, }) minetest.register_ore({ - ore_type = "scatter", + ore_type = "stratum", ore = "mcl_end:end_stone", - wherein = {"air", "mcl_core:stone"}, - clust_scarcity = 30 * 30 * 30, - clust_size = 34, - y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.1, - spread = {x = 70, y = 15, z = 70}, - seed = 16, - octaves = 1, - persist = 0.0 + wherein = end_wherein, + y_min = mcl_vars.mg_end_min+64, + y_max = mcl_vars.mg_end_min+80, + + noise_params = { + offset = mcl_vars.mg_end_min+72, + scale = -3, + spread = {x=84, y=84, z=84}, + seed = mg_seed+999, + octaves = 4, + persist = 0.8, }, + + np_stratum_thickness = { + offset = -4, + scale = 10, + spread = {x=84, y=84, z=84}, + seed = mg_seed+999, + octaves = 4, + persist = 0.8, + }, + clust_scarcity = 1, + }) + minetest.register_ore({ + ore_type = "stratum", + ore = "mcl_end:end_stone", + wherein = end_wherein, + y_min = mcl_vars.mg_end_min+64, + y_max = mcl_vars.mg_end_min+80, + + noise_params = { + offset = mcl_vars.mg_end_min+70, + scale = -2, + spread = {x=84, y=84, z=84}, + seed = mg_seed+99, + octaves = 4, + persist = 0.85, + }, + + np_stratum_thickness = { + offset = -3, + scale = 5, + spread = {x=63, y=63, z=63}, + seed = mg_seed+50, + octaves = 4, + persist = 0.85, + }, + clust_scarcity = 1, }) end @@ -1038,528 +2136,1732 @@ end -- All mapgens except mgv6 -local function register_grass_decoration(offset, scale) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core: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", "coniferous_forest", "deciduous_forest", "savanna"}, - y_min = 1, - y_max = 31000, - decoration = "mcl_flowers:tallgrass", - }) +-- Template to register a grass or fern decoration +local function register_grass_decoration(grasstype, offset, scale, biomes) + local place_on, seed, node + if grasstype == "fern" then + node = "mcl_flowers:fern" + place_on = {"group:grass_block_no_snow", "mcl_core:podzol"} + seed = 333 + elseif grasstype == "tallgrass" then + node = "mcl_flowers:tallgrass" + place_on = {"group:grass_block_no_snow"} + seed = 420 + end + local noise = { + offset = offset, + scale = scale, + spread = {x = 200, y = 200, z = 200}, + seed = seed, + octaves = 3, + persist = 0.6 + } + for b=1, #biomes do + local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index + minetest.register_decoration({ + deco_type = "simple", + place_on = place_on, + sidelen = 16, + noise_params = noise, + biomes = { biomes[b] }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = node, + param2 = param2, + }) + end end +local function register_seagrass_decoration(grasstype, offset, scale, biomes) + local seed, nodes, surfaces, param2, param2_max, y_max + if grasstype == "seagrass" then + seed = 16 + surfaces = { "mcl_core:dirt", "mcl_core:sand", "mcl_core:gravel", "mcl_core:redsand" } + nodes = { "mcl_ocean:seagrass_dirt", "mcl_ocean:seagrass_sand", "mcl_ocean:seagrass_gravel", "mcl_ocean:seagrass_redsand" } + y_max = 0 + elseif grasstype == "kelp" then + seed = 32 + param2 = 16 + param2_max = 96 + surfaces = { "mcl_core:dirt", "mcl_core:sand", "mcl_core:gravel" } + nodes = { "mcl_ocean:kelp_dirt", "mcl_ocean:kelp_sand", "mcl_ocean:kelp_gravel" } + y_max = -6 + end + local noise = { + offset = offset, + scale = scale, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.6, + } + + for s=1, #surfaces do + minetest.register_decoration({ + deco_type = "simple", + place_on = { surfaces[s] }, + sidelen = 16, + noise_params = noise, + biomes = biomes, + y_min = DEEP_OCEAN_MIN, + y_max = y_max, + decoration = nodes[s], + param2 = param2, + param2_max = param2_max, + place_offset_y = -1, + flags = "force_placement", + }) + end +end + + + local function register_decorations() - - -- Oak tree and log + -- Large ice spike minetest.register_decoration({ deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass"}, + place_on = {"mcl_core:snowblock", "mcl_core:snow", "group:grass_block_snow"}, + sidelen = 80, + noise_params = { + offset = 0.00040, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 1133, + octaves = 4, + persist = 0.67, + }, + biomes = {"IcePlainsSpikes"}, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_ice_spike_large.mts", + rotation = "random", + flags = "place_center_x, place_center_z", + }) + + -- Small ice spike + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:snowblock", "mcl_core:snow", "group:grass_block_snow"}, + sidelen = 80, + noise_params = { + offset = 0.005, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 1133, + octaves = 4, + persist = 0.67, + }, + biomes = {"IcePlainsSpikes"}, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_ice_spike_small.mts", + rotation = "random", + flags = "place_center_x, place_center_z", + }) + + -- Oak + -- Large oaks + for i=1, 4 do + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + noise_params = { + offset = 0.000545, + scale = 0.0011, + spread = {x = 250, y = 250, z = 250}, + seed = 3 + 5 * i, + octaves = 3, + persist = 0.66 + }, + biomes = {"Forest"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_large_"..i..".mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block", "mcl_core:dirt", }, + sidelen = 80, + noise_params = { + offset = -0.0007, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 3, + octaves = 3, + persist = 0.6 + }, + biomes = {"ExtremeHills", "ExtremeHillsM", "ExtremeHills+", "ExtremeHills+_snowtop"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_large_"..i..".mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + end + -- Small “classic” oak (many biomes) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, sidelen = 16, noise_params = { - offset = 0.0036, + offset = 0.025, scale = 0.0022, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, persist = 0.66 }, - biomes = {"deciduous_forest"}, + biomes = {"Forest"}, y_min = 1, - y_max = 31000, - schematic = minetest.get_modpath("mcl_core").."/schematics/apple_tree.mts", - flags = "place_center_x, place_center_z", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = 0.00018, - scale = 0.00011, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"deciduous_forest"}, - y_min = 1, - y_max = 31000, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "mcl_core:tree", param2 = 12, prob = 191}, - {name = "mcl_core:tree", param2 = 12}, - {name = "mcl_core:tree", param2 = 12, prob = 127}, - {name = "air", prob = 0}, - {name = "mcl_mushrooms:mushroom_brown", prob = 63}, - {name = "air", prob = 0}, - }, - }, - flags = "place_center_x", - rotation = "random", - }) - - -- Jungle tree and log - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol"}, - sidelen = 80, - fill_ratio = 0.09, - biomes = {"rainforest", "rainforest_swamp"}, - y_min = 0, - y_max = 31000, - schematic = minetest.get_modpath("mcl_core").."/schematics/jungle_tree.mts", + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", }) - minetest.register_decoration({ deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol"}, - sidelen = 80, - fill_ratio = 0.01, - biomes = {"rainforest", "rainforest_swamp"}, - y_min = 1, - y_max = 31000, - schematic = { - 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, prob = 191}, - {name = "mcl_core:jungletree", param2 = 12}, - {name = "mcl_core:jungletree", param2 = 12, prob = 127}, - {name = "air", prob = 0}, - {name = "mcl_mushrooms:mushroom_brown", prob = 127}, - {name = "air", prob = 0}, - }, - }, - flags = "place_center_x", - rotation = "random", - }) - - -- Taiga and temperate coniferous forest pine tree and log - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass_snow", "mcl_core:dirt_with_grass", "mcl_core:podzol"}, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, sidelen = 16, noise_params = { - offset = 0.0096, + offset = 0.01, scale = 0.0022, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, persist = 0.66 }, - biomes = {"taiga", "coniferous_forest","coniferous_forest_dunes"}, - y_min = 2, - y_max = 31000, - schematic = minetest.get_modpath("mcl_core").."/schematics/pine_tree.mts", - flags = "place_center_x, place_center_z", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass_snow", "mcl_core:dirt_with_grass", "mcl_core:podzol"}, - sidelen = 80, - noise_params = { - offset = 0.00018, - scale = 0.00011, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"taiga", "coniferous_forest","coniferous_forest_dunes"}, + biomes = {"FlowerForest"}, y_min = 1, - y_max = 31000, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "mcl_core:sprucetree", param2 = 12, prob = 191}, - {name = "mcl_core:sprucetree", param2 = 12}, - {name = "mcl_core:sprucetree", param2 = 12, prob = 127}, - {name = "air", prob = 0}, - {name = "mcl_mushrooms:mushroom_red", prob = 63}, - {name = "air", prob = 0}, - }, - }, - flags = "place_center_x", + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", + flags = "place_center_x, place_center_z", rotation = "random", }) - - -- Acacia tree and log - minetest.register_decoration({ deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass", "mcl_core:coarse_dirt"}, + place_on = {"group:grass_block", "mcl_core:dirt", }, sidelen = 16, noise_params = { - offset = 0, + offset = 0.0, scale = 0.002, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, - persist = 0.66 + persist = 0.7 }, - biomes = {"savanna"}, + biomes = {"ExtremeHills", "ExtremeHillsM", "ExtremeHills+", "ExtremeHills+_snowtop"}, y_min = 1, - y_max = 31000, - schematic = minetest.get_modpath("mcl_core").."/schematics/acacia_tree.mts", + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", }) minetest.register_decoration({ deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass"}, + place_on = {"group:grass_block", "mcl_core:dirt"}, sidelen = 16, noise_params = { - offset = 0, - scale = 0.001, + offset = 0.006, + scale = 0.002, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, - persist = 0.66 + persist = 0.7 }, - biomes = {"savanna"}, - y_min = 1, - y_max = 31000, - schematic = { - size = {x = 3, y = 2, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "mcl_core:acaciatree", param2 = 12, prob = 191}, - {name = "mcl_core:acaciatree", param2 = 12}, - {name = "mcl_core:acaciatree", param2 = 12, prob = 127}, - }, + biomes = {"ExtremeHills+", "ExtremeHills+_snowtop"}, + y_min = 50, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, + sidelen = 16, + noise_params = { + offset = 0.015, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.7 }, - flags = "place_center_x", + biomes = {"MesaPlateauF_grasstop"}, + y_min = 30, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.7 + }, + biomes = {"MesaPlateauFM_grasstop"}, + y_min = 30, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", + flags = "place_center_x, place_center_z", rotation = "random", }) - minetest.register_decoration({ deco_type = "schematic", - place_on = {"mcl_core:sand"}, + place_on = {"group:grass_block", "mcl_core:dirt", }, sidelen = 16, noise_params = { - offset = 0, + offset = 0.0, scale = 0.0002, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, - persist = 0.66 + persist = 0.7 }, - biomes = {"savanna"}, - y_min = 7, - y_max = 31000, - schematic = minetest.get_modpath("mcl_core").."/schematics/acacia_tree.mts", + biomes = {"IcePlains"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", }) - - - -- Aspen tree and log - minetest.register_decoration({ deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = 0.0, - scale = -0.0015, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"deciduous_forest"}, - y_min = 1, - y_max = 31000, - schematic = minetest.get_modpath("mcl_core").."/schematics/aspen_tree.mts", - flags = "place_center_x, place_center_z", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = 0.0, - scale = -0.00008, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"deciduous_forest"}, - y_min = 1, - y_max = 31000, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "mcl_core:birchtree", param2 = 12}, - {name = "mcl_core:birchtree", param2 = 12}, - {name = "mcl_core:birchtree", param2 = 12, prob = 127}, - {name = "mcl_mushrooms:mushroom_red", prob = 63}, - {name = "mcl_mushrooms:mushroom_brown", prob = 63}, - {name = "air", prob = 0}, - }, - }, - flags = "place_center_x", - rotation = "random", - }) - - - --Big dark oak W.I.P. - - --TODO MAKE SCHEMATICS - - - - --Red Mushroom - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:mycelium"}, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, sidelen = 80, fill_ratio = 0.004, - biomes = {"mushroom"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_mushrooms:mushroom_red", + biomes = {"Jungle", "JungleM"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", + flags = "place_center_x, place_center_z", + rotation = "random", }) - --Brown Mushroom - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:mycelium"}, - sidelen = 80, - fill_ratio = 0.003, - biomes = {"mushroom"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_mushrooms:mushroom_brown", - }) - - --Red Mushroom - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:mycelium", "mcl_core:mycelium_snow"}, - sidelen = 80, - fill_ratio = 0.0002, - biomes = {"mushroom", "mushroom_cold"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_mushrooms:mushroom_red", - }) - - --Huge Mushroom minetest.register_decoration({ deco_type = "schematic", - place_on = {"mcl_core:mycelium", "mcl_core:mycelium_snow"}, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, sidelen = 80, fill_ratio = 0.0004, - biomes = {"mushroom", "mushroom_cold"}, - y_min = -6000, - y_max = 31000, - schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts", - flags = "place_center_x", + biomes = {"JungleEdge", "JungleEdgeM", "Savanna"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", + flags = "place_center_x, place_center_z", rotation = "random", }) - - --Huge Brown Mushroom + -- Rare balloon oak minetest.register_decoration({ deco_type = "schematic", - place_on = {"mcl_core:mycelium", "mcl_core:mycelium_snow"}, - sidelen = 80, - fill_ratio = 0.002, - biomes = {"mushroom", "mushroom_cold"}, - y_min = -6000, - y_max = 31000, - schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts", - flags = "place_center_x", - rotation = "random", - }) - - --Huge Red Mushroom - minetest.register_decoration({ - deco_type = "schematic", - place_on = { "mcl_core:dirt_with_grass"}, - sidelen = 50, - fill_ratio = 0.0002, - biomes = { "deciduous_forest"}, - y_min = -6000, - y_max = 31000, - schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_red.mts", - flags = "place_center_x", - rotation = "random", - }) - - - -- Simple 1×1×1 moss stone - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:podzol"}, - sidelen = 80, - fill_ratio = 0.004, - biomes = {"taiga"}, - y_min = 10, - y_max = 31000, - decoration = "mcl_core:mossycobble", - }) - -- Cactus - - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:sand", "mcl_core:redsand"}, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, sidelen = 16, noise_params = { - offset = -0.0003, - scale = 0.0009, - spread = {x = 200, y = 200, z = 200}, - seed = 230, + offset = 0.002083, + scale = 0.0022, + spread = {x = 250, y = 250, z = 250}, + seed = 3, + octaves = 3, + persist = 0.6, + }, + biomes = {"Forest"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_balloon.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + -- Swamp oak + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + noise_params = { + offset = 0.0055, + scale = 0.0011, + spread = {x = 250, y = 250, z = 250}, + seed = 5005, + octaves = 5, + persist = 0.6, + }, + biomes = {"Swampland", "Swampland_shore"}, + y_min = 0, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_swamp.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + -- Jungle tree + + -- Huge jungle tree (2 variants) + for i=1, 2 do + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + fill_ratio = 0.00125, + biomes = {"Jungle"}, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_tree_huge_"..i..".mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + fill_ratio = 0.004, + biomes = {"JungleM"}, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_tree_huge_"..i..".mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + end + + -- Common jungle tree + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + fill_ratio = 0.045, + biomes = {"Jungle"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + fill_ratio = 0.0045, + biomes = {"JungleEdge", "JungleEdgeM"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + fill_ratio = 0.09, + biomes = {"JungleM"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + -- Spruce + local function quick_spruce(seed, offset, sprucename, biomes, y) + if not y then + y = 1 + end + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block", "mcl_core:dirt", "mcl_core:podzol"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = 0.0006, + spread = {x = 250, y = 250, z = 250}, + seed = seed, + octaves = 3, + persist = 0.66 + }, + biomes = biomes, + y_min = y, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/"..sprucename, + flags = "place_center_x, place_center_z", + }) + end + + -- Huge spruce + quick_spruce(3000, 0.0030, "mcl_core_spruce_huge_1.mts", {"MegaSpruceTaiga"}) + quick_spruce(4000, 0.0036, "mcl_core_spruce_huge_2.mts", {"MegaSpruceTaiga"}) + quick_spruce(6000, 0.0036, "mcl_core_spruce_huge_3.mts", {"MegaSpruceTaiga"}) + quick_spruce(6600, 0.0036, "mcl_core_spruce_huge_4.mts", {"MegaSpruceTaiga"}) + + quick_spruce(3000, 0.0008, "mcl_core_spruce_huge_up_1.mts", {"MegaTaiga"}) + quick_spruce(4000, 0.0008, "mcl_core_spruce_huge_up_2.mts", {"MegaTaiga"}) + quick_spruce(6000, 0.0008, "mcl_core_spruce_huge_up_3.mts", {"MegaTaiga"}) + + + -- Common spruce + quick_spruce(11000, 0.00150, "mcl_core_spruce_5.mts", {"Taiga", "ColdTaiga"}) + + quick_spruce(2500, 0.00325, "mcl_core_spruce_1.mts", {"MegaSpruceTaiga", "MegaTaiga", "Taiga", "ColdTaiga"}) + quick_spruce(7000, 0.00425, "mcl_core_spruce_3.mts", {"MegaSpruceTaiga", "MegaTaiga", "Taiga", "ColdTaiga"}) + quick_spruce(9000, 0.00325, "mcl_core_spruce_4.mts", {"MegaTaiga", "Taiga", "ColdTaiga"}) + + quick_spruce(9500, 0.00500, "mcl_core_spruce_tall.mts", {"MegaTaiga"}) + + quick_spruce(5000, 0.00250, "mcl_core_spruce_2.mts", {"MegaSpruceTaiga", "MegaTaiga"}) + + quick_spruce(11000, 0.000025, "mcl_core_spruce_5.mts", {"ExtremeHills", "ExtremeHillsM"}) + quick_spruce(2500, 0.00005, "mcl_core_spruce_1.mts", {"ExtremeHills", "ExtremeHillsM"}) + quick_spruce(7000, 0.00005, "mcl_core_spruce_3.mts", {"ExtremeHills", "ExtremeHillsM"}) + quick_spruce(9000, 0.00005, "mcl_core_spruce_4.mts", {"ExtremeHills", "ExtremeHillsM"}) + + quick_spruce(11000, 0.001, "mcl_core_spruce_5.mts", {"ExtremeHills+", "ExtremeHills+_snowtop"}, 50) + quick_spruce(2500, 0.002, "mcl_core_spruce_1.mts", {"ExtremeHills+", "ExtremeHills+_snowtop"}, 50) + quick_spruce(7000, 0.003, "mcl_core_spruce_3.mts", {"ExtremeHills+", "ExtremeHills+_snowtop"}, 50) + quick_spruce(9000, 0.002, "mcl_core_spruce_4.mts", {"ExtremeHills+", "ExtremeHills+_snowtop"}, 50) + + + -- Small lollipop spruce + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block", "mcl_core:podzol"}, + sidelen = 16, + noise_params = { + offset = 0.004, + scale = 0.0022, + spread = {x = 250, y = 250, z = 250}, + seed = 2500, + octaves = 3, + persist = 0.66 + }, + biomes = {"Taiga", "ColdTaiga"}, + y_min = 2, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_spruce_lollipop.mts", + flags = "place_center_x, place_center_z", + }) + + -- Matchstick spruce: Very few leaves, tall trunk + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block", "mcl_core:podzol"}, + sidelen = 80, + noise_params = { + offset = -0.025, + scale = 0.025, + spread = {x = 250, y = 250, z = 250}, + seed = 2566, + octaves = 5, + persist = 0.60, + }, + biomes = {"Taiga", "ColdTaiga"}, + y_min = 3, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_spruce_matchstick.mts", + flags = "place_center_x, place_center_z", + }) + + -- Rare spruce in Ice Plains + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block"}, + sidelen = 16, + noise_params = { + offset = -0.00075, + scale = -0.0015, + spread = {x = 250, y = 250, z = 250}, + seed = 11, + octaves = 3, + persist = 0.7 + }, + biomes = {"IcePlains"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_spruce_5.mts", + flags = "place_center_x, place_center_z", + }) + + -- Acacia (many variants) + for a=1, 7 do + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:coarse_dirt"}, + sidelen = 16, + fill_ratio = 0.0002, + biomes = {"Savanna", "SavannaM"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_acacia_"..a..".mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + end + + -- Birch + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = 0.03, + scale = 0.0025, + spread = {x = 250, y = 250, z = 250}, + seed = 11, + octaves = 3, + persist = 0.66 + }, + biomes = {"BirchForest"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_birch.mts", + flags = "place_center_x, place_center_z", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = 0.03, + scale = 0.0025, + spread = {x = 250, y = 250, z = 250}, + seed = 11, + octaves = 3, + persist = 0.66 + }, + biomes = {"BirchForestM"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_birch_tall.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 16, + noise_params = { + offset = 0.000333, + scale = -0.0015, + spread = {x = 250, y = 250, z = 250}, + seed = 11, + octaves = 3, + persist = 0.66 + }, + biomes = {"Forest", "FlowerForest"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_birch.mts", + flags = "place_center_x, place_center_z", + }) + + -- Dark Oak + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.0015, + spread = {x = 125, y = 125, z = 125}, + seed = 223, + octaves = 3, + persist = 0.66 + }, + biomes = {"RoofedForest"}, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_dark_oak.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + local ratio_mushroom = 0.0001 + local ratio_mushroom_huge = ratio_mushroom * (11/12) + local ratio_mushroom_giant = ratio_mushroom * (1/12) + local ratio_mushroom_mycelium = 0.002 + local ratio_mushroom_mycelium_huge = ratio_mushroom_mycelium * (11/12) + local ratio_mushroom_mycelium_giant = ratio_mushroom_mycelium * (1/12) + + -- Huge Brown Mushroom + minetest.register_decoration({ + deco_type = "schematic", + place_on = { "group:grass_block_no_snow", "mcl_core:dirt" }, + sidelen = 80, + fill_ratio = ratio_mushroom_huge, + biomes = { "RoofedForest" }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts", + flags = "place_center_x, place_center_z", + rotation = "0", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = { "group:grass_block_no_snow", "mcl_core:dirt" }, + sidelen = 80, + fill_ratio = ratio_mushroom_giant, + biomes = { "RoofedForest" }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_giant_brown.mts", + flags = "place_center_x, place_center_z", + rotation = "0", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = { "mcl_core:mycelium" }, + sidelen = 80, + fill_ratio = ratio_mushroom_mycelium_huge, + biomes = { "MushroomIsland", "MushroomIslandShore" }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts", + flags = "place_center_x, place_center_z", + rotation = "0", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = { "mcl_core:mycelium" }, + sidelen = 80, + fill_ratio = ratio_mushroom_mycelium_giant, + biomes = { "MushroomIsland", "MushroomIslandShore" }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_giant_brown.mts", + flags = "place_center_x, place_center_z", + rotation = "0", + }) + + -- Huge Red Mushroom + minetest.register_decoration({ + deco_type = "schematic", + place_on = { "group:grass_block_no_snow", "mcl_core:dirt" }, + sidelen = 80, + fill_ratio = ratio_mushroom_huge, + biomes = { "RoofedForest" }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_red.mts", + flags = "place_center_x, place_center_z", + rotation = "0", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = { "group:grass_block_no_snow", "mcl_core:dirt" }, + sidelen = 80, + fill_ratio = ratio_mushroom_giant, + biomes = { "RoofedForest" }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_giant_red.mts", + flags = "place_center_x, place_center_z", + rotation = "0", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = { "mcl_core:mycelium" }, + sidelen = 80, + fill_ratio = ratio_mushroom_mycelium_huge, + biomes = { "MushroomIsland", "MushroomIslandShore" }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_red.mts", + flags = "place_center_x, place_center_z", + rotation = "0", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = { "mcl_core:mycelium" }, + sidelen = 80, + fill_ratio = ratio_mushroom_mycelium_giant, + biomes = { "MushroomIsland", "MushroomIslandShore" }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_giant_red.mts", + flags = "place_center_x, place_center_z", + rotation = "0", + }) + + -- Mossy cobblestone boulder (3×3) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:podzol", "mcl_core:dirt", "mcl_core:coarse_dirt"}, + sidelen = 80, + noise_params = { + offset = 0.00015, + scale = 0.001, + spread = {x = 300, y = 300, z = 300}, + seed = 775703, + octaves = 4, + persist = 0.63, + }, + biomes = {"MegaTaiga", "MegaSpruceTaiga"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_boulder.mts", + flags = "place_center_x, place_center_z", + }) + + -- Small mossy cobblestone boulder (2×2) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:podzol", "mcl_core:dirt", "mcl_core:coarse_dirt"}, + sidelen = 80, + noise_params = { + offset = 0.001, + scale = 0.001, + spread = {x = 300, y = 300, z = 300}, + seed = 775703, + octaves = 4, + persist = 0.63, + }, + biomes = {"MegaTaiga", "MegaSpruceTaiga"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_boulder_small.mts", + flags = "place_center_x, place_center_z", + }) + + -- Cacti + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand"}, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x = 100, y = 100, z = 100}, + seed = 257, octaves = 3, persist = 0.6 }, - biomes = {"desert"}, - y_min = 5, - y_max = 31000, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, decoration = "mcl_core:cactus", - biomes = {"desert","sandstone_desert","grassland_dunes", "coniferous_forest_dunes"}, + biomes = {"Desert", + "Mesa","Mesa_sandlevel", + "MesaPlateauF","MesaPlateauF_sandlevel", + "MesaPlateauFM","MesaPlateauFM_sandlevel"}, height = 1, height_max = 3, }) -- Sugar canes minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt", "mcl_core:dirt_with_grass"}, + deco_type = "simple", + place_on = {"mcl_core:dirt", "mcl_core:coarse_dirt", "group:grass_block_no_snow", "group:sand", "mcl_core:podzol", "mcl_core:reeds"}, sidelen = 16, noise_params = { offset = -0.3, scale = 0.7, spread = {x = 200, y = 200, z = 200}, - seed = 354, + seed = 2, octaves = 3, persist = 0.7 }, - biomes = {"grassland", "savanna", "beach", "desert", "savanna_swamp"}, - y_min = 0, - y_max = 0, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, decoration = "mcl_core:reeds", height = 1, height_max = 3, + spawn_by = { "mcl_core:water_source", "group:frosted_ice" }, + num_spawn_by = 1, }) - - -- Grasses - - register_grass_decoration(-0.03, 0.09) - register_grass_decoration(-0.015, 0.075) - register_grass_decoration(0, 0.06) - register_grass_decoration(0.015, 0.045) - register_grass_decoration(0.03, 0.03) - register_grass_decoration(0.01, 0.05) - register_grass_decoration(0.03, 0.03) - register_grass_decoration(0.05, 0.01) - register_grass_decoration(0.07, -0.01) - register_grass_decoration(0.09, -0.03) - - -- Dead bushes - minetest.register_decoration({ deco_type = "simple", - place_on = {"mcl_core:sand", "mcl_core:redsand"}, + place_on = {"mcl_core:dirt", "mcl_core:coarse_dirt", "group:grass_block_no_snow", "group:sand", "mcl_core:podzol", "mcl_core:reeds"}, sidelen = 16, noise_params = { - offset = 0, - scale = 0.02, + offset = 0.0, + scale = 0.5, spread = {x = 200, y = 200, z = 200}, - seed = 329, + seed = 2, + octaves = 3, + persist = 0.7, + }, + biomes = {"Swampland", "Swampland_shore"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_core:reeds", + height = 1, + height_max = 3, + spawn_by = { "mcl_core:water_source", "group:frosted_ice" }, + num_spawn_by = 1, + }) + + -- Doubletall grass + local register_doubletall_grass = function(offset, scale, biomes) + + for b=1, #biomes do + local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "air", prob = 0 }, + { name = "mcl_flowers:double_grass", param1=255, param2=param2 }, + { name = "mcl_flowers:double_grass_top", param1=255, param2=param2 }, + }, + }, + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = {x = 200, y = 200, z = 200}, + seed = 420, + octaves = 3, + persist = 0.6, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + biomes = { biomes[b] }, + }) + end + end + + register_doubletall_grass(-0.01, 0.03, {"Taiga", "Forest", "FlowerForest", "BirchForest", "BirchForestM", "RoofedForest"}) + register_doubletall_grass(-0.002, 0.03, {"Plains", "SunflowerPlains"}) + register_doubletall_grass(-0.0005, -0.03, {"Savanna", "SavannaM"}) + + -- Large ferns + local register_double_fern = function(offset, scale, biomes) + for b=1, #biomes do + local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "air", prob = 0 }, + { name = "mcl_flowers:double_fern", param1=255, param2=param2 }, + { name = "mcl_flowers:double_fern_top", param1=255, param2=param2 }, + }, + }, + place_on = {"group:grass_block_no_snow", "mcl_core:podzol"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 2, + persist = 0.66, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + biomes = biomes[b], + }) + end + end + + register_double_fern(0.01, 0.03, { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "ColdTaiga", "MegaTaiga", "MegaSpruceTaiga" }) + register_double_fern(0.15, 0.1, { "JungleM" }) + + -- Large flowers + local register_large_flower = function(name, biomes, seed, offset, flower_forest_offset) + local maxi + if flower_forest_offset then + maxi = 2 + else + maxi = 1 + end + for i=1, maxi do + local o, b -- offset, biomes + if i == 1 then + o = offset + b = biomes + else + o = flower_forest_offset + b = { "FlowerForest" } + end + + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "air", prob = 0 }, + { name = "mcl_flowers:"..name, param1=255, }, + { name = "mcl_flowers:"..name.."_top", param1=255, }, + }, + }, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + + sidelen = 16, + noise_params = { + offset = o, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = seed, + octaves = 5, + persist = 0.62, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = b, + }) + end + end + + register_large_flower("rose_bush", {"Forest"}, 9350, -0.008, 0.003) + register_large_flower("peony", {"Forest"}, 10450, -0.008, 0.003) + register_large_flower("lilac", {"Forest"}, 10600, -0.007, 0.003) + register_large_flower("sunflower", {"SunflowerPlains"}, 2940, 0.01) + + -- Jungle bush + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + noise_params = { + offset = 0.0196, + scale = 0.025, + spread = {x = 250, y = 250, z = 250}, + seed = 2930, + octaves = 4, + persist = 0.6, + }, + biomes = {"Jungle"}, + y_min = 3, + y_max = mcl_vars.mg_overworld_max, + schematic = jungle_bush_schematic, + flags = "place_center_x, place_center_z", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + noise_params = { + offset = 0.05, + scale = 0.025, + spread = {x = 250, y = 250, z = 250}, + seed = 2930, + octaves = 4, + persist = 0.6, + }, + biomes = {"JungleM"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = jungle_bush_schematic, + flags = "place_center_x, place_center_z", + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + noise_params = { + offset = 0.0085, + scale = 0.025, + spread = {x = 250, y = 250, z = 250}, + seed = 2930, + octaves = 4, + persist = 0.6, + }, + biomes = {"JungleEdge", "JungleEdgeM"}, + y_min = 3, + y_max = mcl_vars.mg_overworld_max, + schematic = jungle_bush_schematic, + flags = "place_center_x, place_center_z", + }) + + -- Fallen logs + -- These fallen logs are not really good yet. They must be longer and also have one upright block. + -- Note the decortion API does not like wide schematics, they are likely to overhang. + if generate_fallen_logs then + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:podzol", "mcl_core:coarse_dirt"}, + sidelen = 80, + noise_params = { + offset = 0.00018, + scale = 0.00011, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"MegaTaiga", "MegaSpruceTaiga", "Taiga"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = { + size = {x = 3, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "mcl_core:sprucetree", param2 = 12, prob = 127}, + {name = "mcl_core:sprucetree", param2 = 12}, + {name = "mcl_core:sprucetree", param2 = 12}, + {name = "air", prob = 0}, + {name = "mcl_mushrooms:mushroom_brown", prob = 160}, + {name = "mcl_mushrooms:mushroom_red", prob = 160}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block", "mcl_core:podzol", "mcl_core:podzol_snow", "mcl_core:coarse_dirt"}, + sidelen = 80, + noise_params = { + offset = 0.00018, + scale = 0.00011, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"ColdTaiga"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = { + size = {x = 3, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "mcl_core:sprucetree", param2 = 12, prob = 127}, + {name = "mcl_core:sprucetree", param2 = 12}, + {name = "mcl_core:sprucetree", param2 = 12}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = -0.00008, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"BirchForest", "BirchForestM",}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = { + size = {x = 3, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "mcl_core:birchtree", param2 = 12}, + {name = "mcl_core:birchtree", param2 = 12}, + {name = "mcl_core:birchtree", param2 = 12, prob = 127}, + {name = "mcl_mushrooms:mushroom_red", prob = 100}, + {name = "mcl_mushrooms:mushroom_brown", prob = 10}, + {name = "air", prob = 0}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + fill_ratio = 0.005, + biomes = {"Jungle", "JungleM"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = { + 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}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = 0.00018, + scale = 0.00011, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"Forest"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = { + size = {x = 3, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "mcl_core:tree", param2 = 12, prob = 127}, + {name = "mcl_core:tree", param2 = 12}, + {name = "mcl_core:tree", param2 = 12}, + {name = "air", prob = 0}, + {name = "mcl_mushrooms:mushroom_brown", prob = 96}, + {name = "mcl_mushrooms:mushroom_red", prob = 96}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + end + + -- Lily pad + + local lily_schem = { + { name = "mcl_core:water_source" }, + { name = "mcl_flowers:waterlily" }, + } + + -- Spawn them in shallow water at ocean level in Swampland. + -- Tweak lilydepth to change the maximum water depth + local lilydepth = 2 + + for d=1, lilydepth do + local height = d + 2 + local y = 1 - d + table.insert(lily_schem, 1, { name = "air", prob = 0 }) + + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=height, z=1 }, + data = lily_schem, + }, + place_on = "mcl_core:dirt", + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 503, + octaves = 6, + persist = 0.7, + }, + y_min = y, + y_max = y, + biomes = { "Swampland_shore" }, + rotation = "random", + }) + end + + -- Melon + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = -0.01, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 333, octaves = 3, persist = 0.6 }, - biomes = {"desert"}, - y_min = 2, - y_max = 31000, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_farming:melon", + biomes = { "Jungle" }, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_farming:melon", + biomes = { "JungleM" }, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = -0.005, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_farming:melon", + biomes = { "JungleEdge", "JungleEdgeM" }, + }) + + -- Lots of melons in Jungle Edge M + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 80, + noise_params = { + offset = 0.013, + scale = 0.006, + spread = {x = 125, y = 125, z = 125}, + seed = 333, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_farming:melon", + biomes = { "JungleEdgeM" }, + }) + + -- Pumpkin + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_farming:pumpkin", + param2 = 0, + param2_max = 3, + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = -0.016, + scale = 0.01332, + spread = {x = 125, y = 125, z = 125}, + seed = 666, + octaves = 6, + persist = 0.666 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + }) + + -- Grasses and ferns + local grass_forest = {"Plains", "Taiga", "Forest", "FlowerForest", "BirchForest", "BirchForestM", "RoofedForest", "Swampland", } + local grass_mpf = {"MesaPlateauF_grasstop"} + local grass_plains = {"Plains", "SunflowerPlains", "JungleEdge", "JungleEdgeM" } + local grass_savanna = {"Savanna", "SavannaM"} + local grass_sparse = {"ExtremeHills", "ExtremeHills+", "ExtremeHills+_snowtop", "ExtremeHillsM", "Jungle" } + local grass_mpfm = {"MesaPlateauFM_grasstop" } + + register_grass_decoration("tallgrass", -0.03, 0.09, grass_forest) + register_grass_decoration("tallgrass", -0.015, 0.075, grass_forest) + register_grass_decoration("tallgrass", 0, 0.06, grass_forest) + register_grass_decoration("tallgrass", 0.015, 0.045, grass_forest) + register_grass_decoration("tallgrass", 0.03, 0.03, grass_forest) + register_grass_decoration("tallgrass", -0.03, 0.09, grass_mpf) + register_grass_decoration("tallgrass", -0.015, 0.075, grass_mpf) + register_grass_decoration("tallgrass", 0, 0.06, grass_mpf) + register_grass_decoration("tallgrass", 0.01, 0.045, grass_mpf) + register_grass_decoration("tallgrass", 0.01, 0.05, grass_forest) + register_grass_decoration("tallgrass", 0.03, 0.03, grass_plains) + register_grass_decoration("tallgrass", 0.05, 0.01, grass_plains) + register_grass_decoration("tallgrass", 0.07, -0.01, grass_plains) + register_grass_decoration("tallgrass", 0.09, -0.03, grass_plains) + register_grass_decoration("tallgrass", 0.18, -0.03, grass_savanna) + register_grass_decoration("tallgrass", 0.05, -0.03, grass_sparse) + register_grass_decoration("tallgrass", 0.05, 0.05, grass_mpfm) + + local fern_minimal = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "MegaTaiga", "MegaSpruceTaiga", "ColdTaiga" } + local fern_low = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "MegaTaiga", "MegaSpruceTaiga" } + local fern_Jungle = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM" } + local fern_JungleM = { "JungleM" }, + register_grass_decoration("fern", -0.03, 0.09, fern_minimal) + register_grass_decoration("fern", -0.015, 0.075, fern_minimal) + register_grass_decoration("fern", 0, 0.06, fern_minimal) + register_grass_decoration("fern", 0.015, 0.045, fern_low) + register_grass_decoration("fern", 0.03, 0.03, fern_low) + register_grass_decoration("fern", 0.01, 0.05, fern_Jungle) + register_grass_decoration("fern", 0.03, 0.03, fern_Jungle) + register_grass_decoration("fern", 0.05, 0.01, fern_Jungle) + register_grass_decoration("fern", 0.07, -0.01, fern_Jungle) + register_grass_decoration("fern", 0.09, -0.03, fern_Jungle) + register_grass_decoration("fern", 0.12, -0.03, fern_JungleM) + + local b_seagrass = {"ColdTaiga_ocean","ExtremeHills_ocean","ExtremeHillsM_ocean","ExtremeHills+_ocean","Taiga_ocean","MegaTaiga_ocean","MegaSpruceTaiga_ocean","StoneBeach_ocean","Plains_ocean","SunflowerPlains_ocean","Forest_ocean","FlowerForest_ocean","BirchForest_ocean","BirchForestM_ocean","RoofedForest_ocean","Swampland_ocean","Jungle_ocean","JungleM_ocean","JungleEdge_ocean","JungleEdgeM_ocean","MushroomIsland_ocean","Desert_ocean","Savanna_ocean","SavannaM_ocean","Mesa_ocean","MesaBryce_ocean","MesaPlateauF_ocean","MesaPlateauFM_ocean", +"ColdTaiga_deep_ocean","ExtremeHills_deep_ocean","ExtremeHillsM_deep_ocean","ExtremeHills+_deep_ocean","Taiga_deep_ocean","MegaTaiga_deep_ocean","MegaSpruceTaiga_deep_ocean","StoneBeach_deep_ocean","Plains_deep_ocean","SunflowerPlains_deep_ocean","Forest_deep_ocean","FlowerForest_deep_ocean","BirchForest_deep_ocean","BirchForestM_deep_ocean","RoofedForest_deep_ocean","Swampland_deep_ocean","Jungle_deep_ocean","JungleM_deep_ocean","JungleEdge_deep_ocean","JungleEdgeM_deep_ocean","MushroomIsland_deep_ocean","Desert_deep_ocean","Savanna_deep_ocean","SavannaM_deep_ocean","Mesa_deep_ocean","MesaBryce_deep_ocean","MesaPlateauF_deep_ocean","MesaPlateauFM_deep_ocean", +"Mesa_sandlevel","MesaBryce_sandlevel","MesaPlateauF_sandlevel","MesaPlateauFM_sandlevel","Swampland_shore","Jungle_shore","JungleM_shore","Savanna_beach","FlowerForest_beach","ColdTaiga_beach_water","ExtremeHills_beach"} + local b_kelp = {"ExtremeHillsM_ocean","ExtremeHills+_ocean","MegaTaiga_ocean","MegaSpruceTaiga_ocean","Plains_ocean","SunflowerPlains_ocean","Forest_ocean","FlowerForest_ocean","BirchForest_ocean","BirchForestM_ocean","RoofedForest_ocean","Swampland_ocean","Jungle_ocean","JungleM_ocean","JungleEdge_ocean","JungleEdgeM_ocean","MushroomIsland_ocean", +"ExtremeHillsM_deep_ocean","ExtremeHills+_deep_ocean","MegaTaiga_deep_ocean","MegaSpruceTaiga_deep_ocean","Plains_deep_ocean","SunflowerPlains_deep_ocean","Forest_deep_ocean","FlowerForest_deep_ocean","BirchForest_deep_ocean","BirchForestM_deep_ocean","RoofedForest_deep_ocean","Swampland_deep_ocean","Jungle_deep_ocean","JungleM_deep_ocean","JungleEdge_deep_ocean","JungleEdgeM_deep_ocean","MushroomIsland_deep_ocean" +} + + register_seagrass_decoration("seagrass", 0, 0.5, b_seagrass) + register_seagrass_decoration("kelp", -0.5, 1, b_kelp) + + local b_sponge = {"Plains_deep_ocean","SunflowerPlains_deep_ocean","Forest_deep_ocean","FlowerForest_deep_ocean","BirchForest_deep_ocean","BirchForestM_deep_ocean","RoofedForest_deep_ocean","Jungle_deep_ocean","JungleM_deep_ocean","JungleEdge_deep_ocean","JungleEdgeM_deep_ocean","MushroomIsland_deep_ocean","Desert_deep_ocean","Savanna_deep_ocean","SavannaM_deep_ocean","Mesa_deep_ocean","MesaBryce_deep_ocean","MesaPlateauF_deep_ocean","MesaPlateauFM_deep_ocean"} + -- Wet Sponge + -- TODO: Remove this when we got ocean monuments + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_sponges:sponge_wet", + biomes = b_sponge, + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:dirt","mcl_core:sand","mcl_core:gravel"}, + sidelen = 16, + noise_params = { + offset = 0.00495, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 999, + octaves = 3, + persist = 0.666 + }, + flags = "force_placement", + y_min = mcl_vars.mg_lava_overworld_max + 5, + y_max = -20, + }) + + -- Place tall grass on snow in Ice Plains and Extreme Hills+ + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block"}, + sidelen = 16, + noise_params = { + offset = -0.08, + scale = 0.09, + spread = {x = 15, y = 15, z = 15}, + seed = 420, + octaves = 3, + persist = 0.6, + }, + biomes = {"IcePlains"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = { + size = { x=1, y=2, z=1 }, + data = { + { name = "mcl_core:dirt_with_grass", force_place=true, }, + { name = "mcl_flowers:tallgrass", param2 = minetest.registered_biomes["IcePlains"]._mcl_palette_index }, + }, + }, + }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"group:grass_block"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = 0.09, + spread = {x = 15, y = 15, z = 15}, + seed = 420, + octaves = 3, + persist = 0.6, + }, + biomes = {"ExtremeHills+_snowtop"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + schematic = { + size = { x=1, y=2, z=1 }, + data = { + { name = "mcl_core:dirt_with_grass", force_place=true, }, + { name = "mcl_flowers:tallgrass", param2 = minetest.registered_biomes["ExtremeHills+_snowtop"]._mcl_palette_index }, + }, + }, + }) + + + -- Dead bushes + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand", "mcl_core:podzol", "mcl_core:dirt", "mcl_core:dirt_with_grass", "mcl_core:coarse_dirt", "group:hardened_clay"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 1972, + octaves = 3, + persist = 0.6 + }, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + biomes = {"Desert", "Mesa", "Mesa_sandlevel", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_grasstop","MesaBryce","Taiga", "MegaTaiga"}, + decoration = "mcl_core:deadbush", + height = 1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand", "mcl_core:dirt", "mcl_core:dirt_with_grass", "mcl_core:coarse_dirt"}, + sidelen = 16, + noise_params = { + offset = 0.1, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 1972, + octaves = 3, + persist = 0.6 + }, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + biomes = {"MesaPlateauFM_grasstop"}, + decoration = "mcl_core:deadbush", + height = 1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand"}, + sidelen = 16, + noise_params = { + offset = 0.045, + scale = 0.055, + spread = {x = 100, y = 100, z = 100}, + seed = 1972, + octaves = 3, + persist = 0.6 + }, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + biomes = {"MesaPlateauFM","MesaPlateauFM_sandlevel"}, + decoration = "mcl_core:deadbush", + height = 1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:hardened_clay"}, + sidelen = 16, + noise_params = { + offset = 0.010, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 1972, + octaves = 3, + persist = 0.6 + }, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + biomes = {"MesaPlateauFM", "MesaPlateauFM_sandlevel", "MesaPlateauFM_grasstop"}, decoration = "mcl_core:deadbush", height = 1, }) - - --[[ NETHER decorations ]] - - -- Red Mushroom + -- Mushrooms in mushroom biome minetest.register_decoration({ deco_type = "simple", - place_on = {"mcl_nether:netherrack"}, + place_on = {"mcl_core:mycelium"}, sidelen = 80, - fill_ratio = 0.01, - biomes = {"nether"}, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, + fill_ratio = 0.009, + biomes = {"MushroomIsland", "MushroomIslandShore"}, + noise_threshold = 2.0, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, decoration = "mcl_mushrooms:mushroom_red", }) - -- Brown Mushroom minetest.register_decoration({ deco_type = "simple", - place_on = {"mcl_nether:netherrack"}, + place_on = {"mcl_core:mycelium"}, sidelen = 80, - fill_ratio = 0.01, - biomes = {"nether"}, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, + fill_ratio = 0.009, + biomes = {"MushroomIsland", "MushroomIslandShore"}, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, decoration = "mcl_mushrooms:mushroom_brown", }) - -- Eternal Fire + -- Mushrooms in Taiga minetest.register_decoration({ deco_type = "simple", - place_on = {"mcl_nether:netherrack"}, - sidelen = 16, - fill_ratio = 0.2, - biomes = {"nether"}, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - decoration = "mcl_fire:eternal_fire", - }) - -- Nether Wart - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_nether:soul_sand"}, + place_on = {"mcl_core:podzol"}, sidelen = 80, - fill_ratio = 0.1, - biomes = {"nether"}, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - decoration = "mcl_nether:nether_wart", + fill_ratio = 0.003, + biomes = {"Taiga", "MegaTaiga", "MegaSpruceTaiga"}, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_mushrooms:mushroom_red", }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:podzol"}, + sidelen = 80, + fill_ratio = 0.003, + biomes = {"Taiga", "MegaTaiga", "MegaSpruceTaiga"}, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_mushrooms:mushroom_brown", + }) + + + -- Mushrooms next to trees + local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"} + local mseeds = { 7133, 8244 } + for m=1, #mushrooms do + -- Mushrooms next to trees + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.003, + spread = {x = 250, y = 250, z = 250}, + seed = mseeds[m], + octaves = 3, + persist = 0.66, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = mushrooms[m], + spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree" }, + num_spawn_by = 1, + }) + + -- More mushrooms in Swampland + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.003, + spread = {x = 250, y = 250, z = 250}, + seed = mseeds[m], + octaves = 3, + persist = 0.6, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = mushrooms[m], + biomes = { "Swampland"}, + spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree" }, + num_spawn_by = 1, + }) + end + local function register_flower(name, biomes, seed, is_in_flower_forest) + if is_in_flower_forest == nil then + is_in_flower_forest = true + end + if biomes then + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 16, + noise_params = { + offset = 0.0008, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + biomes = biomes, + decoration = "mcl_flowers:"..name, + }) + end + if is_in_flower_forest then + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + sidelen = 80, + noise_params= { + offset = 0.0008*40, + scale = 0.003, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.6, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + biomes = {"FlowerForest"}, + decoration = "mcl_flowers:"..name, + }) + end + end + + local flower_biomes1 = {"Plains", "SunflowerPlains", "RoofedForest", "Forest", "BirchForest", "BirchForestM", "Taiga", "ColdTaiga", "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Savanna", "SavannaM", "ExtremeHills", "ExtremeHillsM", "ExtremeHills+", "ExtremeHills+_snowtop" } + + register_flower("dandelion", flower_biomes1, 8) + register_flower("poppy", flower_biomes1, 9439) + + local flower_biomes2 = {"Plains", "SunflowerPlains"} + register_flower("tulip_red", flower_biomes2, 436) + register_flower("tulip_orange", flower_biomes2, 536) + register_flower("tulip_pink", flower_biomes2, 636) + register_flower("tulip_white", flower_biomes2, 736) + register_flower("azure_bluet", flower_biomes2, 800) + register_flower("oxeye_daisy", flower_biomes2, 3490) + + register_flower("allium", nil, 0) -- flower Forest only + register_flower("blue_orchid", {"Swampland"}, 64500, false) + +end + +-- Decorations in non-Overworld dimensions +local function register_dimension_decorations() + --[[ NETHER ]] + -- TODO: Nether + + --[[ THE END ]] + + -- Chorus plant + minetest.register_decoration({ + name = "mcl_biomes:chorus_plant", + deco_type = "simple", + place_on = {"mcl_end:end_stone", "air"}, + flags = "all_floors", + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x = 100, y = 100, z = 100}, + seed = 257, + octaves = 3, + persist = 0.6 + }, + y_min = mcl_vars.mg_end_min, + y_max = mcl_vars.mg_end_max, + decoration = "mcl_end:chorus_flower", + height = 1, + biomes = { "End" }, + }) + + deco_id_chorus_plant = minetest.get_decoration_id("mcl_biomes:chorus_plant") + minetest.set_gen_notify({decoration=true}, { deco_id_chorus_plant }) + + -- TODO: End cities end @@ -1567,19 +3869,43 @@ end -- -- Detect mapgen to select functions -- -local mg_name = minetest.get_mapgen_setting("mg_name") -if mg_name ~= "v6" and mg_name ~= "flat" then - minetest.clear_registered_biomes() - minetest.clear_registered_decorations() - minetest.clear_registered_schematics() - register_biomes() - register_biomelike_ores() - register_decorations() -elseif mg_name == "flat" then - -- Implementation of Minecraft's Superflat mapgen, classic style - minetest.clear_registered_biomes() - minetest.clear_registered_decorations() - minetest.clear_registered_schematics() - register_classic_superflat_biome() +if mg_name ~= "singlenode" then + if not superflat then + if mg_name ~= "v6" then + register_biomes() + register_biomelike_ores() + end + register_biome_ores() + if mg_name ~= "v6" then + register_decorations() + end + else + -- Implementation of Minecraft's Superflat mapgen, classic style: + -- * Perfectly flat land, 1 grass biome, no decorations, no caves + -- * 4 layers, from top to bottom: grass block, dirt, dirt, bedrock + minetest.clear_registered_biomes() + minetest.clear_registered_decorations() + minetest.clear_registered_schematics() + register_classic_superflat_biome() + end + + -- Non-overworld stuff is registered independently + register_dimension_biomes() + register_dimension_ores() + register_dimension_decorations() + + -- Overworld decorations for v6 are handled in mcl_mapgen_core + + if deco_id_chorus_plant then + minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = {} + for _, pos in ipairs(gennotify["decoration#"..deco_id_chorus_plant] or {}) do + local realpos = { x = pos.x, y = pos.y + 1, z = pos.z } + mcl_end.grow_chorus_plant(realpos) + end + end) + end + end --- v6 decorations are handled in mcl_mapgen_core + diff --git a/mods/MAPGEN/mcl_dungeons/depends.txt b/mods/MAPGEN/mcl_dungeons/depends.txt index 9f3c4e9f..2c8ce78b 100644 --- a/mods/MAPGEN/mcl_dungeons/depends.txt +++ b/mods/MAPGEN/mcl_dungeons/depends.txt @@ -1,5 +1,6 @@ mcl_init mcl_core mcl_chests +mcl_mobs mcl_mobspawners mobs_mc diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index 065fb0da..b10f73be 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -1,17 +1,16 @@ -- FIXME: Chests may appear at openings --- TODO: Add monster spawner - +local mg_name = minetest.get_mapgen_setting("mg_name") local pr = PseudoRandom(os.time()) -- Get loot for dungeon chests local get_loot = function() - local items = mcl_loot.get_multi_loot({ + local loottable = { { stacks_min = 1, stacks_max = 3, items = { - { itemstring = "mobs:nametag", weight = 20 }, + { itemstring = "mcl_mobs:nametag", weight = 20 }, { itemstring = "mcl_mobitems:saddle", weight = 20 }, { itemstring = "mcl_jukebox:record_1", weight = 15 }, { itemstring = "mcl_jukebox:record_4", weight = 15 }, @@ -50,7 +49,22 @@ local get_loot = function() { itemstring = "mcl_mobitems:rotten_flesh", weight = 10, amount_min = 1, amount_max = 8 }, { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, }, - }}, pr) + } + } + + -- Bonus loot for v6 mapgen: Otherwise unobtainable saplings. + if mg_name == "v6" then + table.insert(loottable, { + stacks_min = 1, + stacks_max = 3, + items = { + { itemstring = "mcl_core:birchsapling", weight = 1, amount_min = 1, amount_max = 2 }, + { itemstring = "mcl_core:acaciasapling", weight = 1, amount_min = 1, amount_max = 2 }, + { itemstring = "", weight = 6 }, + }, + }) + end + local items = mcl_loot.get_multi_loot(loottable, pr) return items end @@ -58,7 +72,6 @@ end -- Buffer for LuaVoxelManip local lvm_buffer = {} -local lvm_buffer2 = {} -- for param2 -- Below the bedrock, generate air/void minetest.register_on_generated(function(minp, maxp) @@ -74,7 +87,6 @@ minetest.register_on_generated(function(minp, maxp) local c_air = minetest.get_content_id("air") local c_cobble = minetest.get_content_id("mcl_core:cobble") local c_mossycobble = minetest.get_content_id("mcl_core:mossycobble") - local c_chest = minetest.get_content_id("mcl_chests:chest") -- Remember spawner chest positions to set metadata later local chest_posses = {} @@ -228,7 +240,7 @@ minetest.register_on_generated(function(minp, maxp) table.sort(chestSlots) local currentChest = 1 - -- Calculate the monster spawner position, to be re-used for later + -- Calculate the mob spawner position, to be re-used for later local spawner_pos = {x = x + math.ceil(dim.x/2), y = y+1, z = z + math.ceil(dim.z/2)} table.insert(spawner_posses, spawner_pos) @@ -241,7 +253,7 @@ minetest.register_on_generated(function(minp, maxp) local p_pos = area:index(tx, ty, tz) -- Do not overwrite nodes with is_ground_content == false (e.g. bedrock) - -- Exceptions: cobblestone and moss stone so neighborings dungeons nicely connect to each other + -- Exceptions: cobblestone and mossy cobblestone so neighborings dungeons nicely connect to each other local name = minetest.get_name_from_content_id(data[p_pos]) if name == "mcl_core:cobble" or name == "mcl_core:mossycobble" or minetest.registered_nodes[name].is_ground_content then -- Floor @@ -278,13 +290,6 @@ minetest.register_on_generated(function(minp, maxp) -- Place next chest at the wall (if it was its chosen wall slot) if forChest and (currentChest < totalChests + 1) and (chestSlots[currentChest] == chestSlotCounter) then - local p2 - - -- Select rotation so the chest faces away from wall - if (tx==x+1) then p2 = 3 - elseif (tx==maxx-1) then p2 = 1 - elseif (tz==z+1) then p2 = 2 - else p2 = 0 end table.insert(chest_posses, {x=tx, y=ty, z=tz}) currentChest = currentChest + 1 else @@ -361,12 +366,10 @@ minetest.register_on_generated(function(minp, maxp) local meta = minetest.get_meta(cpos) local inv = meta:get_inventory() local items = get_loot() - for i=1, math.min(#items, inv:get_size("main")) do - inv:set_stack("main", i, ItemStack(items[i])) - end + mcl_loot.fill_inventory(inv, "main", items) end - -- Monster spawners are placed seperately, too + -- Mob spawners are placed seperately, too -- We don't want to destroy non-ground nodes for s=1, #spawner_posses do local sp = spawner_posses[s] @@ -383,7 +386,7 @@ minetest.register_on_generated(function(minp, maxp) } local spawner_mob = mobs[math.random(1, #mobs)] - mcl_mobspawners.setup_spawner(sp, spawner_mob) + mcl_mobspawners.setup_spawner(sp, spawner_mob, 0, 7) end end diff --git a/mods/MAPGEN/mcl_mapgen_core/depends.txt b/mods/MAPGEN/mcl_mapgen_core/depends.txt index 34b5a1ce..4aa96f05 100644 --- a/mods/MAPGEN/mcl_mapgen_core/depends.txt +++ b/mods/MAPGEN/mcl_mapgen_core/depends.txt @@ -1,7 +1,11 @@ mcl_init -mcl_util mcl_core +biomeinfo +mclx_core? +mcl_worlds mcl_cocoas +mcl_sponges +mcl_ocean mcl_stairs mcl_monster_eggs mcl_structures diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 6e2dda73..39f189a3 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -28,7 +28,11 @@ minetest.register_alias("mapgen_stone_with_iron", "mcl_core:stone_with_iron") minetest.register_alias("mapgen_desert_sand", "mcl_core:sand") minetest.register_alias("mapgen_desert_stone", "mcl_core:sandstone") minetest.register_alias("mapgen_sandstone", "mcl_core:sandstone") -minetest.register_alias("mapgen_river_water_source", "mcl_core:water_source") +if minetest.get_modpath("mclx_core") then + minetest.register_alias("mapgen_river_water_source", "mclx_core:river_water_source") +else + minetest.register_alias("mapgen_river_water_source", "mcl_core:water_source") +end minetest.register_alias("mapgen_snow", "mcl_core:snow") minetest.register_alias("mapgen_snowblock", "mcl_core:snowblock") minetest.register_alias("mapgen_ice", "mcl_core:ice") @@ -40,6 +44,45 @@ minetest.register_alias("mapgen_stair_sandstone_block", "mcl_stairs:stair_sandst minetest.register_alias("mapgen_stair_desert_stone", "mcl_stairs:stair_sandstone") local mg_name = minetest.get_mapgen_setting("mg_name") +local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" + +local WITCH_HUT_HEIGHT = 3 -- Exact Y level to spawn witch huts at. This height refers to the height of the floor + +-- End exit portal position. This is temporary. +-- TODO: Remove the exit portal generation when the ender dragon has been implemented. +local END_EXIT_PORTAL_POS = table.copy(mcl_vars.mg_end_platform_pos) +END_EXIT_PORTAL_POS.x = END_EXIT_PORTAL_POS.x - 30 +END_EXIT_PORTAL_POS.z = END_EXIT_PORTAL_POS.z - 3 +END_EXIT_PORTAL_POS.y = END_EXIT_PORTAL_POS.y - 3 + +-- Content IDs +local c_bedrock = minetest.get_content_id("mcl_core:bedrock") +local c_obsidian = minetest.get_content_id("mcl_core:obsidian") +local c_stone = minetest.get_content_id("mcl_core:stone") +local c_dirt = minetest.get_content_id("mcl_core:dirt") +local c_dirt_with_grass = minetest.get_content_id("mcl_core:dirt_with_grass") +local c_dirt_with_grass_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow") +local c_sand = minetest.get_content_id("mcl_core:sand") +local c_sandstone = minetest.get_content_id("mcl_core:sandstone") +local c_void = minetest.get_content_id("mcl_core:void") +local c_lava = minetest.get_content_id("mcl_core:lava_source") +local c_water = minetest.get_content_id("mcl_core:water_source") +local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand") +local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") +local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") +local c_end_stone = minetest.get_content_id("mcl_end:end_stone") +local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier") +local c_top_snow = minetest.get_content_id("mcl_core:snow") +local c_snow_block = minetest.get_content_id("mcl_core:snowblock") +local c_clay = minetest.get_content_id("mcl_core:clay") +local c_leaves = minetest.get_content_id("mcl_core:leaves") +local c_jungleleaves = minetest.get_content_id("mcl_core:jungleleaves") +local c_jungletree = minetest.get_content_id("mcl_core:jungletree") +local c_cocoa_1 = minetest.get_content_id("mcl_cocoas:cocoa_1") +local c_cocoa_2 = minetest.get_content_id("mcl_cocoas:cocoa_2") +local c_cocoa_3 = minetest.get_content_id("mcl_cocoas:cocoa_3") +local c_vine = minetest.get_content_id("mcl_core:vine") +local c_air = minetest.CONTENT_AIR -- -- Ore generation @@ -94,7 +137,7 @@ minetest.register_ore({ clust_num_ores = 33, clust_size = 5, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(111), + y_max = mcl_worlds.layer_to_y(111), }) -- @@ -110,7 +153,7 @@ minetest.register_ore({ clust_num_ores = 5, clust_size = 3, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(50), + y_max = mcl_worlds.layer_to_y(50), }) minetest.register_ore({ ore_type = "scatter", @@ -120,7 +163,7 @@ minetest.register_ore({ clust_num_ores = 8, clust_size = 3, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(50), + y_max = mcl_worlds.layer_to_y(50), }) minetest.register_ore({ ore_type = "scatter", @@ -130,7 +173,7 @@ minetest.register_ore({ clust_num_ores = 12, clust_size = 3, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(50), + y_max = mcl_worlds.layer_to_y(50), }) -- Medium-rare spawn @@ -141,8 +184,8 @@ minetest.register_ore({ clust_scarcity = 550*3, clust_num_ores = 4, clust_size = 2, - y_min = mcl_util.layer_to_y(51), - y_max = mcl_util.layer_to_y(80), + y_min = mcl_worlds.layer_to_y(51), + y_max = mcl_worlds.layer_to_y(80), }) minetest.register_ore({ ore_type = "scatter", @@ -151,8 +194,8 @@ minetest.register_ore({ clust_scarcity = 525*3, clust_num_ores = 6, clust_size = 3, - y_min = mcl_util.layer_to_y(51), - y_max = mcl_util.layer_to_y(80), + y_min = mcl_worlds.layer_to_y(51), + y_max = mcl_worlds.layer_to_y(80), }) minetest.register_ore({ ore_type = "scatter", @@ -161,8 +204,8 @@ minetest.register_ore({ clust_scarcity = 500*3, clust_num_ores = 8, clust_size = 3, - y_min = mcl_util.layer_to_y(51), - y_max = mcl_util.layer_to_y(80), + y_min = mcl_worlds.layer_to_y(51), + y_max = mcl_worlds.layer_to_y(80), }) -- Rare spawn @@ -173,8 +216,8 @@ minetest.register_ore({ clust_scarcity = 600*3, clust_num_ores = 3, clust_size = 2, - y_min = mcl_util.layer_to_y(81), - y_max = mcl_util.layer_to_y(128), + y_min = mcl_worlds.layer_to_y(81), + y_max = mcl_worlds.layer_to_y(128), }) minetest.register_ore({ ore_type = "scatter", @@ -183,8 +226,8 @@ minetest.register_ore({ clust_scarcity = 550*3, clust_num_ores = 4, clust_size = 3, - y_min = mcl_util.layer_to_y(81), - y_max = mcl_util.layer_to_y(128), + y_min = mcl_worlds.layer_to_y(81), + y_max = mcl_worlds.layer_to_y(128), }) minetest.register_ore({ ore_type = "scatter", @@ -193,8 +236,8 @@ minetest.register_ore({ clust_scarcity = 500*3, clust_num_ores = 5, clust_size = 3, - y_min = mcl_util.layer_to_y(81), - y_max = mcl_util.layer_to_y(128), + y_min = mcl_worlds.layer_to_y(81), + y_max = mcl_worlds.layer_to_y(128), }) -- @@ -208,7 +251,7 @@ minetest.register_ore({ clust_num_ores = 5, clust_size = 3, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(39), + y_max = mcl_worlds.layer_to_y(39), }) minetest.register_ore({ ore_type = "scatter", @@ -217,8 +260,8 @@ minetest.register_ore({ clust_scarcity = 1660, clust_num_ores = 4, clust_size = 2, - y_min = mcl_util.layer_to_y(40), - y_max = mcl_util.layer_to_y(63), + y_min = mcl_worlds.layer_to_y(40), + y_max = mcl_worlds.layer_to_y(63), }) -- @@ -234,7 +277,7 @@ minetest.register_ore({ clust_num_ores = 5, clust_size = 3, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(30), + y_max = mcl_worlds.layer_to_y(30), }) minetest.register_ore({ ore_type = "scatter", @@ -244,7 +287,7 @@ minetest.register_ore({ clust_num_ores = 7, clust_size = 3, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(30), + y_max = mcl_worlds.layer_to_y(30), }) -- Rare spawn @@ -255,13 +298,10 @@ minetest.register_ore({ clust_scarcity = 13000, clust_num_ores = 4, clust_size = 2, - y_min = mcl_util.layer_to_y(31), - y_max = mcl_util.layer_to_y(33), + y_min = mcl_worlds.layer_to_y(31), + y_max = mcl_worlds.layer_to_y(33), }) - - - -- -- Diamond -- @@ -275,7 +315,7 @@ minetest.register_ore({ clust_num_ores = 4, clust_size = 3, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(12), + y_max = mcl_worlds.layer_to_y(12), }) minetest.register_ore({ ore_type = "scatter", @@ -285,7 +325,7 @@ minetest.register_ore({ clust_num_ores = 2, clust_size = 2, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(12), + y_max = mcl_worlds.layer_to_y(12), }) minetest.register_ore({ ore_type = "scatter", @@ -295,7 +335,7 @@ minetest.register_ore({ clust_num_ores = 8, clust_size = 3, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(12), + y_max = mcl_worlds.layer_to_y(12), }) -- Rare spawn @@ -306,8 +346,8 @@ minetest.register_ore({ clust_scarcity = 20000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_util.layer_to_y(13), - y_max = mcl_util.layer_to_y(15), + y_min = mcl_worlds.layer_to_y(13), + y_max = mcl_worlds.layer_to_y(15), }) minetest.register_ore({ ore_type = "scatter", @@ -316,8 +356,8 @@ minetest.register_ore({ clust_scarcity = 20000, clust_num_ores = 2, clust_size = 2, - y_min = mcl_util.layer_to_y(13), - y_max = mcl_util.layer_to_y(15), + y_min = mcl_worlds.layer_to_y(13), + y_max = mcl_worlds.layer_to_y(15), }) -- @@ -333,7 +373,7 @@ minetest.register_ore({ clust_num_ores = 4, clust_size = 3, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(13), + y_max = mcl_worlds.layer_to_y(13), }) minetest.register_ore({ ore_type = "scatter", @@ -343,7 +383,7 @@ minetest.register_ore({ clust_num_ores = 7, clust_size = 4, y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(13), + y_max = mcl_worlds.layer_to_y(13), }) -- Rare spawn @@ -354,8 +394,8 @@ minetest.register_ore({ clust_scarcity = 1000, clust_num_ores = 4, clust_size = 3, - y_min = mcl_util.layer_to_y(13), - y_max = mcl_util.layer_to_y(15), + y_min = mcl_worlds.layer_to_y(13), + y_max = mcl_worlds.layer_to_y(15), }) minetest.register_ore({ ore_type = "scatter", @@ -364,36 +404,40 @@ minetest.register_ore({ clust_scarcity = 1600, clust_num_ores = 7, clust_size = 4, - y_min = mcl_util.layer_to_y(13), - y_max = mcl_util.layer_to_y(15), + y_min = mcl_worlds.layer_to_y(13), + y_max = mcl_worlds.layer_to_y(15), }) -- -- Emerald -- --- Common spawn -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_emerald", - wherein = stonelike, - clust_scarcity = 14340, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.layer_to_y(29), -}) --- Rare spawn -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_emerald", - wherein = stonelike, - clust_scarcity = 21510, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_util.layer_to_y(30), - y_max = mcl_util.layer_to_y(32), -}) +if mg_name == "v6" then + -- Generate everywhere in v6, but rarely. + + -- Common spawn + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_core:stone_with_emerald", + wherein = stonelike, + clust_scarcity = 14340, + clust_num_ores = 1, + clust_size = 1, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_worlds.layer_to_y(29), + }) + -- Rare spawn + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_core:stone_with_emerald", + wherein = stonelike, + clust_scarcity = 21510, + clust_num_ores = 1, + clust_size = 1, + y_min = mcl_worlds.layer_to_y(30), + y_max = mcl_worlds.layer_to_y(32), + }) +end -- -- Lapis Lazuli @@ -407,8 +451,8 @@ minetest.register_ore({ clust_scarcity = 10000, clust_num_ores = 7, clust_size = 4, - y_min = mcl_util.layer_to_y(14), - y_max = mcl_util.layer_to_y(16), + y_min = mcl_worlds.layer_to_y(14), + y_max = mcl_worlds.layer_to_y(16), }) -- Rare spawn (below center) @@ -419,8 +463,8 @@ minetest.register_ore({ clust_scarcity = 12000, clust_num_ores = 6, clust_size = 3, - y_min = mcl_util.layer_to_y(10), - y_max = mcl_util.layer_to_y(13), + y_min = mcl_worlds.layer_to_y(10), + y_max = mcl_worlds.layer_to_y(13), }) minetest.register_ore({ ore_type = "scatter", @@ -429,8 +473,8 @@ minetest.register_ore({ clust_scarcity = 14000, clust_num_ores = 5, clust_size = 3, - y_min = mcl_util.layer_to_y(6), - y_max = mcl_util.layer_to_y(9), + y_min = mcl_worlds.layer_to_y(6), + y_max = mcl_worlds.layer_to_y(9), }) minetest.register_ore({ ore_type = "scatter", @@ -439,8 +483,8 @@ minetest.register_ore({ clust_scarcity = 16000, clust_num_ores = 4, clust_size = 3, - y_min = mcl_util.layer_to_y(2), - y_max = mcl_util.layer_to_y(5), + y_min = mcl_worlds.layer_to_y(2), + y_max = mcl_worlds.layer_to_y(5), }) minetest.register_ore({ ore_type = "scatter", @@ -449,8 +493,8 @@ minetest.register_ore({ clust_scarcity = 18000, clust_num_ores = 3, clust_size = 2, - y_min = mcl_util.layer_to_y(0), - y_max = mcl_util.layer_to_y(2), + y_min = mcl_worlds.layer_to_y(0), + y_max = mcl_worlds.layer_to_y(2), }) -- Rare spawn (above center) @@ -461,8 +505,8 @@ minetest.register_ore({ clust_scarcity = 12000, clust_num_ores = 6, clust_size = 3, - y_min = mcl_util.layer_to_y(17), - y_max = mcl_util.layer_to_y(20), + y_min = mcl_worlds.layer_to_y(17), + y_max = mcl_worlds.layer_to_y(20), }) minetest.register_ore({ ore_type = "scatter", @@ -471,8 +515,8 @@ minetest.register_ore({ clust_scarcity = 14000, clust_num_ores = 5, clust_size = 3, - y_min = mcl_util.layer_to_y(21), - y_max = mcl_util.layer_to_y(24), + y_min = mcl_worlds.layer_to_y(21), + y_max = mcl_worlds.layer_to_y(24), }) minetest.register_ore({ ore_type = "scatter", @@ -481,8 +525,8 @@ minetest.register_ore({ clust_scarcity = 16000, clust_num_ores = 4, clust_size = 3, - y_min = mcl_util.layer_to_y(25), - y_max = mcl_util.layer_to_y(28), + y_min = mcl_worlds.layer_to_y(25), + y_max = mcl_worlds.layer_to_y(28), }) minetest.register_ore({ ore_type = "scatter", @@ -491,8 +535,8 @@ minetest.register_ore({ clust_scarcity = 18000, clust_num_ores = 3, clust_size = 2, - y_min = mcl_util.layer_to_y(29), - y_max = mcl_util.layer_to_y(32), + y_min = mcl_worlds.layer_to_y(29), + y_max = mcl_worlds.layer_to_y(32), }) minetest.register_ore({ ore_type = "scatter", @@ -501,12 +545,11 @@ minetest.register_ore({ clust_scarcity = 32000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_util.layer_to_y(31), - y_max = mcl_util.layer_to_y(32), + y_min = mcl_worlds.layer_to_y(31), + y_max = mcl_worlds.layer_to_y(32), }) -if mg_name ~= "flat" then - +if not superflat then -- Water and lava springs (single blocks of lava/water source) -- Water appears at nearly every height, but not near the bottom minetest.register_ore({ @@ -516,8 +559,8 @@ minetest.register_ore({ clust_scarcity = 9000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_util.layer_to_y(5), - y_max = mcl_util.layer_to_y(128), + y_min = mcl_worlds.layer_to_y(5), + y_max = mcl_worlds.layer_to_y(128), }) -- Lava springs are rather common at -31 and below @@ -528,8 +571,8 @@ minetest.register_ore({ clust_scarcity = 2000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_util.layer_to_y(1), - y_max = mcl_util.layer_to_y(10), + y_min = mcl_worlds.layer_to_y(1), + y_max = mcl_worlds.layer_to_y(10), }) minetest.register_ore({ @@ -539,8 +582,8 @@ minetest.register_ore({ clust_scarcity = 9000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_util.layer_to_y(11), - y_max = mcl_util.layer_to_y(31), + y_min = mcl_worlds.layer_to_y(11), + y_max = mcl_worlds.layer_to_y(31), }) -- Lava springs will become gradually rarer with increasing height @@ -551,8 +594,8 @@ minetest.register_ore({ clust_scarcity = 32000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_util.layer_to_y(32), - y_max = mcl_util.layer_to_y(47), + y_min = mcl_worlds.layer_to_y(32), + y_max = mcl_worlds.layer_to_y(47), }) minetest.register_ore({ @@ -562,8 +605,8 @@ minetest.register_ore({ clust_scarcity = 72000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_util.layer_to_y(48), - y_max = mcl_util.layer_to_y(61), + y_min = mcl_worlds.layer_to_y(48), + y_max = mcl_worlds.layer_to_y(61), }) -- Lava may even appear above surface, but this is very rare @@ -574,59 +617,14 @@ minetest.register_ore({ clust_scarcity = 96000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_util.layer_to_y(62), - y_max = mcl_util.layer_to_y(127), + y_min = mcl_worlds.layer_to_y(62), + y_max = mcl_worlds.layer_to_y(127), }) - end --- Rarely replace stone with stone monster eggs -local monster_egg_scarcity -if mg_name == "v6" then - monster_egg_scarcity = 28 * 28 * 28 -else - monster_egg_scarcity = 22 * 22 * 22 -end -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_monster_eggs:monster_egg_stone", - wherein = "mcl_core:stone", - clust_scarcity = monster_egg_scarcity, - clust_num_ores = 3, - clust_size = 2, - y_min = -31000, - y_max = 31000, - -- TODO: Limit by biome -}) - - local function register_mgv6_decorations() - -- Sugar canes - - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = -0.3, - scale = 0.7, - spread = {x = 100, y = 100, z = 100}, - seed = 2, - octaves = 3, - persist = 0.7 - }, - y_min = 1, - y_max = 1, - decoration = "mcl_core:reeds", - height = 2, - height_max = 4, - spawn_by = "mcl_core:water_source", - num_spawn_by = 1, - }) - -- Cacti - minetest.register_decoration({ deco_type = "simple", place_on = {"group:sand"}, @@ -640,10 +638,32 @@ local function register_mgv6_decorations() persist = 0.6 }, y_min = 4, - y_max = 30, + y_max = mcl_vars.mg_overworld_max, decoration = "mcl_core:cactus", height = 1, - height_max = 3, + height_max = 3, + }) + + -- Sugar canes + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:dirt", "mcl_core:coarse_dirt", "group:grass_block_no_snow", "group:sand", "mcl_core:podzol", "mcl_core:reeds"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 100, y = 100, z = 100}, + seed = 465, + octaves = 3, + persist = 0.7 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_core:reeds", + height = 1, + height_max = 3, + spawn_by = { "mcl_core:water_source", "group:frosted_ice" }, + num_spawn_by = 1, }) -- Doubletall grass @@ -653,26 +673,22 @@ local function register_mgv6_decorations() size = { x=1, y=3, z=1 }, data = { { name = "air", prob = 0 }, - { name = "mcl_flowers:double_grass", param1=255, }, - { name = "mcl_flowers:double_grass_top", param1=255, }, + { name = "mcl_flowers:double_grass", param1 = 255, }, + { name = "mcl_flowers:double_grass_top", param1 = 255, }, }, }, - replacements = { - ["mcl_flowers:tallgrass"] = "mcl_flowers:double_grass" - }, - place_on = {"mcl_core:dirt_with_grass"}, + place_on = {"group:grass_block_no_snow"}, sidelen = 8, noise_params = { - offset = -0.01, + offset = -0.0025, scale = 0.03, - spread = {x = 500, y = 500, z = 500}, + spread = {x = 100, y = 100, z = 100}, seed = 420, - octaves = 2, - persist = 0.6, + octaves = 3, + persist = 0.0, }, y_min = 1, - y_max = 40, - flags = "", + y_max = mcl_vars.mg_overworld_max, }) -- Large ferns @@ -686,13 +702,10 @@ local function register_mgv6_decorations() { name = "mcl_flowers:double_fern_top", param1=255, }, }, }, - replacements = { - ["mcl_flowers:fern"] = "mcl_flowers:double_fern" - }, - -- This makes sure large ferns only appear in jungles + -- v6 hack: This makes sure large ferns only appear in jungles spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, num_spawn_by = 1, - place_on = {"mcl_core:dirt_with_grass"}, + place_on = {"group:grass_block_no_snow"}, sidelen = 16, noise_params = { @@ -704,8 +717,7 @@ local function register_mgv6_decorations() persist = 0.66, }, y_min = 1, - y_max = 30, - flags = "", + y_max = mcl_vars.mg_overworld_max, }) -- Large flowers @@ -720,7 +732,7 @@ local function register_mgv6_decorations() { name = "mcl_flowers:"..name.."_top", param1=255, }, }, }, - place_on = {"mcl_core:dirt_with_grass"}, + place_on = {"group:grass_block_no_snow"}, sidelen = 16, noise_params = { @@ -732,7 +744,7 @@ local function register_mgv6_decorations() persist = 0.62, }, y_min = 1, - y_max = 30, + y_max = mcl_vars.overworld_max, flags = "", }) end @@ -742,124 +754,39 @@ local function register_mgv6_decorations() register_large_flower("lilac", 10600, -0.007) register_large_flower("sunflower", 2940, -0.005) - -- Tall grass - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 8, - noise_params = { - offset = 0.01, - scale = 0.3, - spread = {x = 500, y = 500, z = 500}, - seed = 420, - octaves = 2, - persist = 0.6 - }, - y_min = 1, - y_max = 50, - decoration = "mcl_flowers:tallgrass", - }) - - -- Add a small amount of tall grass everywhere to avoid areas completely empty devoid of tall grass - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 8, - fill_ratio = 0.001, - y_min = 1, - y_max = 50, - decoration = "mcl_flowers:tallgrass", - }) - - local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"} - local mseeds = { 7133, 8244 } - for m=1, #mushrooms do - -- Mushrooms next to trees - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.04, - spread = {x = 100, y = 100, z = 100}, - seed = mseeds[m], - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = 128, - decoration = mushrooms[m], - spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree", "mcl_core:jungletree", "mcl_core:acaciatree" }, - num_spawn_by = 1, - }) - end - - -- Dead bushes - - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:sand", "mcl_core:podzol", "mcl_core:coarse_dirt", "mcl_colorblocks:hardened_clay"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.035, - spread = {x = 100, y = 100, z = 100}, - seed = 1972, - octaves = 3, - persist = 0.6 - }, - y_min = 4, - y_max = 50, - decoration = "mcl_core:deadbush", - }) - - local function register_mgv6_flower(name, seed, offset) - if offset == nil then - offset = 0 - end - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = offset, - scale = 0.006, - spread = {x = 100, y = 100, z = 100}, - seed = seed, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = 30, - decoration = "mcl_flowers:"..name, - }) - end - - register_mgv6_flower("tulip_red", 436) - register_mgv6_flower("tulip_orange", 536) - register_mgv6_flower("tulip_pink", 636) - register_mgv6_flower("tulip_white", 736) - register_mgv6_flower("azure_bluet", 800) - register_mgv6_flower("dandelion", 8) - --[[ Allium and blue orchid are made slightly rarer in v6 - to compensate for missing biomes. In Minecraft, those flowers only appear in special biomes. ]] - register_mgv6_flower("allium", 0, -0.001) - register_mgv6_flower("blue_orchid", 64500, -0.001) - register_mgv6_flower("oxeye_daisy", 3490) - register_mgv6_flower("poppy", 9439) - - -- Pumpkin + -- Lily pad minetest.register_decoration({ deco_type = "schematic", schematic = { - size = { x=1, y=2, z=1 }, + size = { x=1, y=3, z=1 }, data = { - { name = "air", prob = 0 }, - { name = "mcl_farming:pumpkin_face", param1=255, }, + { name = "mcl_core:water_source", prob = 0 }, + { name = "mcl_core:water_source" }, + { name = "mcl_flowers:waterlily", param1 = 255 }, }, }, - place_on = {"mcl_core:dirt_with_grass"}, + place_on = "mcl_core:dirt", + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 200, y = 200, z = 200}, + seed = 503, + octaves = 6, + persist = 0.7, + }, + y_min = 0, + y_max = 0, + rotation = "random", + }) + + -- Pumpkin + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_farming:pumpkin_face", + param2 = 0, + param2_max = 3, + place_on = {"group:grass_block_no_snow"}, sidelen = 16, noise_params = { offset = -0.008, @@ -869,18 +796,17 @@ local function register_mgv6_decorations() octaves = 6, persist = 0.666 }, - y_min = 3, - y_max = 29, - rotation = "random", + y_min = 1, + y_max = mcl_vars.overworld_max, }) -- Melon minetest.register_decoration({ deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass"}, + place_on = {"group:grass_block_no_snow"}, sidelen = 16, noise_params = { - offset = 0.003, + offset = 0.002, scale = 0.006, spread = {x = 250, y = 250, z = 250}, seed = 333, @@ -895,80 +821,377 @@ local function register_mgv6_decorations() decoration = "mcl_farming:melon", }) + -- Tall grass + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 8, + noise_params = { + offset = 0.01, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 420, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.overworld_max, + decoration = "mcl_flowers:tallgrass", + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 8, + noise_params = { + offset = 0.04, + scale = 0.03, + spread = {x = 100, y = 100, z = 100}, + seed = 420, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.overworld_max, + decoration = "mcl_flowers:tallgrass", + }) + + -- Seagrass and kelp + local materials = {"dirt","sand"} + for i=1, #materials do + local mat = materials[i] + + minetest.register_decoration({ + deco_type = "simple", + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:"..mat}, + sidelen = 8, + noise_params = { + offset = 0.04, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 421, + octaves = 3, + persist = 0.6 + }, + flags = "force_placement", + place_offset_y = -1, + y_min = mcl_vars.overworld_min, + y_max = 0, + decoration = "mcl_ocean:seagrass_"..mat, + }) + minetest.register_decoration({ + deco_type = "simple", + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:mat"}, + sidelen = 8, + noise_params = { + offset = 0.08, + scale = 0.03, + spread = {x = 100, y = 100, z = 100}, + seed = 421, + octaves = 3, + persist = 0.6 + }, + flags = "force_placement", + place_offset_y = -1, + y_min = mcl_vars.overworld_min, + y_max = -5, + decoration = "mcl_ocean:seagrass_"..mat, + }) + + minetest.register_decoration({ + deco_type = "simple", + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:"..mat}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = 505, + octaves = 5, + persist = 0.62, + }, + flags = "force_placement", + place_offset_y = -1, + y_min = mcl_vars.overworld_min, + y_max = -6, + decoration = "mcl_ocean:kelp_"..mat, + param2 = 16, + param2_max = 96, + }) + minetest.register_decoration({ + deco_type = "simple", + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:"..mat}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 506, + octaves = 5, + persist = 0.62, + }, + flags = "force_placement", + place_offset_y = -1, + y_min = mcl_vars.overworld_min, + y_max = -15, + decoration = "mcl_ocean:kelp_"..mat, + param2 = 32, + param2_max = 160, + }) + + end + + -- Wet Sponge + -- TODO: Remove this when we got ocean monuments + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_sponges:sponge_wet", + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:dirt","mcl_core:sand"}, + sidelen = 16, + noise_params = { + offset = 0.00295, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 999, + octaves = 3, + persist = 0.666 + }, + flags = "force_placement", + y_min = mcl_vars.mg_lava_overworld_max + 5, + y_max = -20, + }) + + -- Add a small amount of tall grass everywhere to avoid areas completely empty devoid of tall grass + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 8, + fill_ratio = 0.004, + y_min = 1, + y_max = mcl_vars.overworld_max, + decoration = "mcl_flowers:tallgrass", + }) + + local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"} + local mseeds = { 7133, 8244 } + for m=1, #mushrooms do + -- Mushrooms next to trees + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.04, + spread = {x = 100, y = 100, z = 100}, + seed = mseeds[m], + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = mushrooms[m], + spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree", }, + num_spawn_by = 1, + }) + end + + -- Dead bushes + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand", "mcl_core:podzol", "mcl_core:dirt", "mcl_core:coarse_dirt", "group:hardened_clay"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 1972, + octaves = 3, + persist = 0.6 + }, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_core:deadbush", + }) + + local function register_mgv6_flower(name, seed, offset, y_max) + if offset == nil then + offset = 0 + end + if y_max == nil then + y_max = mcl_vars.mg_overworld_max + end + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = y_max, + decoration = "mcl_flowers:"..name, + }) + end + + register_mgv6_flower("tulip_red", 436) + register_mgv6_flower("tulip_orange", 536) + register_mgv6_flower("tulip_pink", 636) + register_mgv6_flower("tulip_white", 736) + register_mgv6_flower("azure_bluet", 800) + register_mgv6_flower("dandelion", 8) + -- Allium is supposed to only appear in flower forest in MC. There are no flower forests in v6. + -- We compensate by making it slightly rarer in v6. + register_mgv6_flower("allium", 0, -0.001) + --[[ Blue orchid is supposed to appear in swamplands. There are no swamplands in v6. + We emulate swamplands by limiting the height to 5 levels above sea level, + which should be close to the water. ]] + register_mgv6_flower("blue_orchid", 64500, nil, mcl_worlds.layer_to_y(67)) + register_mgv6_flower("oxeye_daisy", 3490) + register_mgv6_flower("poppy", 9439) + + -- Put top snow on snowy grass blocks. The v6 mapgen does not generate the top snow on its own. + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_snow"}, + sidelen = 16, + fill_ratio = 11.0, -- complete coverage + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_core:snow", + }) end -- Apply mapgen-specific mapgen code if mg_name == "v6" then register_mgv6_decorations() -end -if mg_name == "flat" then - local classic = minetest.get_mapgen_setting("mcl_superflat_classic") - if classic == nil then - classic = minetest.settings:get_bool("mcl_superflat_classic") - minetest.set_mapgen_setting("mcl_superflat_classic", "true", true) - end - if classic ~= "false" then - -- Enforce superflat-like mapgen: No hills, lakes or caves - minetest.set_mapgen_setting("mg_flags", "nocaves,nodungeons,nodecorations,light", true) - minetest.set_mapgen_setting("mgflat_spflags", "nolakes,nohills", true) - else - -- If superflat mode is disabled, mapgen is way more liberal - minetest.set_mapgen_setting("mg_flags", "caves,nodungeons,nodecorations,light", true) - end + minetest.set_mapgen_setting("mg_flags", "caves,nodungeons,decorations,light", true) +elseif superflat then + -- Enforce superflat-like mapgen: No hills, lakes or caves + minetest.set_mapgen_setting("mg_flags", "nocaves,nodungeons,nodecorations,light", true) + minetest.set_mapgen_setting("mgflat_spflags", "nolakes,nohills", true) else minetest.set_mapgen_setting("mg_flags", "caves,nodungeons,decorations,light", true) end +-- Helper function for converting a MC probability to MT, with +-- regards to MapBlocks. +-- Some MC generated structures are generated on per-chunk +-- probability. +-- The MC probability is 1/x per Minecraft chunk (16×16). + +-- x: The MC probability is 1/x. +-- minp, maxp: MapBlock limits +-- returns: Probability (1/return_value) for a single MT mapblock +local function minecraft_chunk_probability(x, minp, maxp) + -- 256 is the MC chunk height + return x * (((maxp.x-minp.x+1)*(maxp.z-minp.z+1)) / 256) +end + +-- Takes an index of a biomemap table (from minetest.get_mapgen_object), +-- minp and maxp (from an on_generated callback) and returns the real world coordinates +-- as X, Z. +-- Inverse function of xz_to_biomemap +local biomemap_to_xz = function(index, minp, maxp) + local xwidth = maxp.x - minp.x + 1 + local zwidth = maxp.z - minp.z + 1 + local x = ((index-1) % xwidth) + minp.x + local z = ((index-1) / zwidth) + minp.z + return x, z +end + +-- Takes x and z coordinates and minp and maxp of a generated chunk +-- (in on_generated callback) and returns a biomemap index) +-- Inverse function of biomemap_to_xz +local xz_to_biomemap_index = function(x, z, minp, maxp) + local xwidth = maxp.x - minp.x + 1 + local zwidth = maxp.z - minp.z + 1 + local minix = x % xwidth + local miniz = z % zwidth + + return (minix + miniz * zwidth) + 1 +end + -- Perlin noise objects local perlin_structures local perlin_vines, perlin_vines_fine, perlin_vines_upwards, perlin_vines_length, perlin_vines_density +local perlin_clay --- Generate clay and structures --- TODO: Try to use more efficient structure generating code -minetest.register_on_generated(function(minp, maxp, seed) - local chunk_has_desert_well = false - local chunk_has_desert_temple = false - local chunk_has_igloo = false - if maxp.y >= 2 and minp.y <= 0 then - -- Generate clay +local function generate_clay(minp, maxp, seed, voxelmanip_data, voxelmanip_area, lvm_used) + -- TODO: Make clay generation reproducible for same seed. + if maxp.y < -5 or minp.y > 0 then + return lvm_used + end + + perlin_clay = perlin_clay or minetest.get_perlin({ + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }) + + for y=math.max(minp.y, 0), math.min(maxp.y, -8), -1 do -- Assume X and Z lengths are equal local divlen = 4 local divs = (maxp.x-minp.x)/divlen+1; - for divx=0+1,divs-1-1 do - for divz=0+1,divs-1-1 do - local cx = minp.x + math.floor((divx+0.5)*divlen) - local cz = minp.z + math.floor((divz+0.5)*divlen) - if minetest.get_node({x=cx,y=1,z=cz}).name == "mcl_core:water_source" and - minetest.get_node({x=cx,y=0,z=cz}).name == "mcl_core:sand" then - local is_shallow = true - local num_water_around = 0 - if minetest.get_node({x=cx-divlen*2,y=1,z=cz+0}).name == "mcl_core:water_source" then - num_water_around = num_water_around + 1 end - if minetest.get_node({x=cx+divlen*2,y=1,z=cz+0}).name == "mcl_core:water_source" then - num_water_around = num_water_around + 1 end - if minetest.get_node({x=cx+0,y=1,z=cz-divlen*2}).name == "mcl_core:water_source" then - num_water_around = num_water_around + 1 end - if minetest.get_node({x=cx+0,y=1,z=cz+divlen*2}).name == "mcl_core:water_source" then - num_water_around = num_water_around + 1 end - if num_water_around >= 2 then - is_shallow = false - end - if is_shallow then - for x1=-divlen,divlen do - for z1=-divlen,divlen do - if minetest.get_node({x=cx+x1,y=0,z=cz+z1}).name == "mcl_core:sand" or minetest.get_node({x=cx+x1,y=0,z=cz+z1}).name == "mcl_core:sandstone" then - minetest.set_node({x=cx+x1,y=0,z=cz+z1}, {name="mcl_core:clay"}) - end - end + for divx=0+1,divs-2 do + for divz=0+1,divs-2 do + -- Get position and shift it a bit randomly so the clay do not obviously appear in a grid + local cx = minp.x + math.floor((divx+0.5)*divlen) + math.random(-1,1) + local cz = minp.z + math.floor((divz+0.5)*divlen) + math.random(-1,1) + + local water_pos = voxelmanip_area:index(cx, y+1, cz) + local waternode = voxelmanip_data[water_pos] + local surface_pos = voxelmanip_area:index(cx, y, cz) + local surfacenode = voxelmanip_data[surface_pos] + + local genrnd = math.random(1, 20) + if genrnd == 1 and perlin_clay:get_3d({x=cx,y=y,z=cz}) > 0 and waternode == c_water and + (surfacenode == c_dirt or minetest.get_item_group(minetest.get_name_from_content_id(surfacenode), "sand") == 1) then + local diamondsize = math.random(1, 3) + for x1 = -diamondsize, diamondsize do + for z1 = -(diamondsize - math.abs(x1)), diamondsize - math.abs(x1) do + local ccpos = voxelmanip_area:index(cx+x1, y, cz+z1) + local claycandidate = voxelmanip_data[ccpos] + if voxelmanip_data[ccpos] == c_dirt or minetest.get_item_group(minetest.get_name_from_content_id(claycandidate), "sand") == 1 then + voxelmanip_data[ccpos] = c_clay + lvm_used = true end end + end end end end end - if maxp.y >= 3 and minp.y <= 64 then - -- Generate desert temples + return lvm_used +end + +-- TODO: Try to use more efficient structure generating code +local function generate_structures(minp, maxp, seed, biomemap) + local chunk_has_desert_well = false + local chunk_has_desert_temple = false + local chunk_has_igloo = false + local struct_min, struct_max = -3, 64 + if maxp.y >= struct_min and minp.y <= struct_max then + -- Generate structures + perlin_structures = perlin_structures or minetest.get_perlin(329, 3, 0.6, 100) -- Assume X and Z lengths are equal local divlen = 5 @@ -980,7 +1203,7 @@ minetest.register_on_generated(function(minp, maxp, seed) local x1 = minp.x + math.floor((divx+1)*divlen) local z1 = minp.z + math.floor((divz+1)*divlen) -- Determine amount from perlin noise - local amount = math.floor(perlin_structures:get2d({x=x0, y=z0}) * 9) + local amount = math.floor(perlin_structures:get_2d({x=x0, y=z0}) * 9) -- Find random positions based on this random local pr = PseudoRandom(seed+1) for i=0, amount do @@ -988,13 +1211,17 @@ minetest.register_on_generated(function(minp, maxp, seed) local z = pr:next(z0, z1) -- Find ground level local ground_y = nil - for y=64,3,-1 do - if minetest.get_node({x=x,y=y,z=z}).name ~= "air" then - ground_y = y - break + for y = struct_max, struct_min, -1 do + local checknode = minetest.get_node_or_nil({x=x,y=y,z=z}) + if checknode then + local def = minetest.registered_nodes[checknode.name] + if def and def.walkable then + ground_y = y + break + end end end - + if ground_y then local p = {x=x,y=ground_y+1,z=z} local nn = minetest.get_node(p).name @@ -1003,9 +1230,10 @@ minetest.register_on_generated(function(minp, maxp, seed) minetest.registered_nodes[nn].buildable_to then nn = minetest.get_node({x=x,y=ground_y,z=z}).name local struct = false + -- Desert temples and desert wells if nn == "mcl_core:sand" or (nn == "mcl_core:sandstone") then - if not chunk_has_desert_temple and not chunk_has_desert_well then + if not chunk_has_desert_temple and not chunk_has_desert_well and ground_y > 3 then -- Spawn desert temple -- TODO: Check surface if math.random(1,12000) == 1 then @@ -1013,10 +1241,9 @@ minetest.register_on_generated(function(minp, maxp, seed) chunk_has_desert_temple = true end end - if not chunk_has_desert_temple and not chunk_has_desert_well then - -- Minecraft probability: 1/1000 per Minecraft chunk (16×16). - -- We adjust the probability to Minetest's MapBlock size. - local desert_well_prob = 1000 * (((maxp.x-minp.x+1)*(maxp.z-minp.z+1)) / 256) + if not chunk_has_desert_temple and not chunk_has_desert_well and ground_y > 3 then + local desert_well_prob = minecraft_chunk_probability(1000, minp, maxp) + -- Spawn desert well if math.random(1, desert_well_prob) == 1 then -- Check surface @@ -1027,7 +1254,9 @@ minetest.register_on_generated(function(minp, maxp, seed) end end end - elseif not chunk_has_igloo and (nn == "mcl_core:snowblock" or nn == "mcl_core:snow" or nn == "mcl_core:dirt_with_grass_snow") then + + -- Igloos + elseif not chunk_has_igloo and (nn == "mcl_core:snowblock" or nn == "mcl_core:snow" or (minetest.get_item_group(nn, "grass_block_snow") == 1)) then if math.random(1, 4400) == 1 then -- Check surface local floor = {x=p.x+9, y=p.y-1, z=p.z+9} @@ -1039,150 +1268,400 @@ minetest.register_on_generated(function(minp, maxp, seed) end end end - end - end - - end - end - end - end -end) + -- Fossil + if nn == "mcl_core:sandstone" or nn == "mcl_core:sand" and not chunk_has_desert_temple and ground_y > 3 then + local fossil_prob = minecraft_chunk_probability(64, minp, maxp) --- Generate bedrock layer or layers -local GEN_MAX = mcl_vars.mg_lava_overworld_max or mcl_vars.mg_bedrock_overworld_max + if math.random(1, fossil_prob) == 1 then + -- Spawn fossil below desert surface between layers 40 and 49 + local p1 = {x=p.x, y=math.random(mcl_worlds.layer_to_y(40), mcl_worlds.layer_to_y(49)), z=p.z} + -- Very rough check of the environment (we expect to have enough stonelike nodes). + -- Fossils may still appear partially exposed in caves, but this is O.K. + local p2 = vector.add(p1, 4) + local nodes = minetest.find_nodes_in_area(p1, p2, {"mcl_core:sandstone", "mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:dirt", "mcl_core:gravel"}) --- Buffer for LuaVoxelManip -local lvm_buffer = {} - - --- Generate cocoas and vines at jungle trees within the bounding box -local function generate_jungle_tree_decorations(minp, maxp) - if minetest.get_mapgen_setting("mg_name") == "v6" then - - if maxp.y < 0 then - return - end - - local pos, treepos, dir - local jungletree = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungletree") - local jungleleaves = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungleleaves") - - -- Pass 1: Generate cocoas - for n = 1, #jungletree do - - pos = jungletree[n] - treepos = table.copy(pos) - - if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then - - dir = math.random(1, 40) - - if dir == 1 then - pos.z = pos.z + 1 - elseif dir == 2 then - pos.z = pos.z - 1 - elseif dir == 3 then - pos.x = pos.x + 1 - elseif dir == 4 then - pos.x = pos.x -1 - end - - local nn = minetest.get_node(pos).name - - if dir < 5 - and nn == "air" - and minetest.get_node_light(pos) > 12 then - minetest.swap_node(pos, { - name = "mcl_cocoas:cocoa_" .. tostring(math.random(1, 3)), - param2 = minetest.dir_to_facedir(vector.subtract(treepos, pos)) - }) - end - - end - end - - -- Pass 2: Generate vines at jungle wood and jungle leaves - perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500) - perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1) - perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75) - perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10) - perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500) - local junglething - for i=1, 2 do - if i==1 then junglething = jungletree - else junglething = jungleleaves end - - for n = 1, #junglething do - pos = junglething[n] - - treepos = table.copy(pos) - - local dirs = { - {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 d = 1, #dirs do - local pos = vector.add(pos, dirs[d]) - - local nn = minetest.get_node(pos).name - - if perlin_vines:get2d(pos) > 0.1 and perlin_vines_fine:get3d(pos) > math.max(0.3333, perlin_vines_density:get2d(pos)) and nn == "air" then - - local newnode = { - name = "mcl_core:vine", - param2 = minetest.dir_to_wallmounted(vector.subtract(treepos, pos)) - } - - -- Determine growth direction - local grow_upwards = false - -- Only possible on the wood, not on the leaves - if i == 1 then - grow_upwards = perlin_vines_upwards:get3d(pos) > 0.8 - end - if grow_upwards then - -- Grow vines up 1-4 nodes, even through jungleleaves. - -- This may give climbing access all the way to the top of the tree :-) - -- But this will be fairly rare. - local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 4) - for l=0, length-1 do - local tnn = minetest.get_node(treepos).name - local nn = minetest.get_node(pos).name - if (nn == "air" or nn == "mcl_core:jungleleaves") and mcl_core.supports_vines(tnn) then - minetest.set_node(pos, newnode) - else - break + if #nodes >= 100 then -- >= 80% + mcl_structures.call_struct(p1, "fossil") + end end - pos.y = pos.y + 1 - treepos.y = treepos.y + 1 end - else - -- Grow vines down 1-7 nodes - local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 7) - for l=0, length-1 do - if minetest.get_node(pos).name == "air" then - minetest.set_node(pos, newnode) + + -- Witch hut + if ground_y <= 0 and nn == "mcl_core:dirt" then + local prob = minecraft_chunk_probability(48, minp, maxp) + if math.random(1, prob) == 1 then + + local swampland = minetest.get_biome_id("Swampland") + local swampland_shore = minetest.get_biome_id("Swampland_shore") + + -- Where do witches live? + + local here_be_witches = false + if mg_name == "v6" then + -- v6: In Normal biome + if biomeinfo.get_v6_biome(p) == "Normal" then + here_be_witches = true + end else - break + -- Other mapgens: In swampland biome + local bi = xz_to_biomemap_index(p.x, p.z, minp, maxp) + if biomemap[bi] == swampland or biomemap[bi] == swampland_shore then + here_be_witches = true + end + end + + if here_be_witches then + local r = tostring(math.random(0, 3) * 90) -- "0", "90", "180" or 270" + local p1 = {x=p.x-1, y=WITCH_HUT_HEIGHT+2, z=p.z-1} + local size + if r == "0" or r == "180" then + size = {x=10, y=4, z=8} + else + size = {x=8, y=4, z=10} + end + local p2 = vector.add(p1, size) + + -- This checks free space at the “body” of the hut and a bit around. + -- ALL nodes must be free for the placement to succeed. + local free_nodes = minetest.find_nodes_in_area(p1, p2, {"air", "mcl_core:water_source", "mcl_flowers:waterlily"}) + if #free_nodes >= ((size.x+1)*(size.y+1)*(size.z+1)) then + local place = {x=p.x, y=WITCH_HUT_HEIGHT-1, z=p.z} + + -- FIXME: For some mysterious reason (black magic?) this + -- function does sometimes NOT spawn the witch hut. One can only see the + -- oak wood nodes in the water, but no hut. :-/ + mcl_structures.call_struct(place, "witch_hut", r) + + -- TODO: Spawn witch in or around hut when the mob sucks less. + + local place_tree_if_free = function(pos, prev_result) + local nn = minetest.get_node(pos).name + if nn == "mcl_flowers:waterlily" or nn == "mcl_core:water_source" or nn == "mcl_core:water_flowing" or nn == "air" then + minetest.set_node(pos, {name="mcl_core:tree", param2=0}) + return prev_result + else + return false + end + end + local offsets + if r == "0" then + offsets = { + {x=1, y=0, z=1}, + {x=1, y=0, z=5}, + {x=6, y=0, z=1}, + {x=6, y=0, z=5}, + } + elseif r == "180" then + offsets = { + {x=2, y=0, z=1}, + {x=2, y=0, z=5}, + {x=7, y=0, z=1}, + {x=7, y=0, z=5}, + } + elseif r == "270" then + offsets = { + {x=1, y=0, z=1}, + {x=5, y=0, z=1}, + {x=1, y=0, z=6}, + {x=5, y=0, z=6}, + } + elseif r == "90" then + offsets = { + {x=1, y=0, z=2}, + {x=5, y=0, z=2}, + {x=1, y=0, z=7}, + {x=5, y=0, z=7}, + } + end + for o=1, #offsets do + local ok = true + for y=place.y-1, place.y-64, -1 do + local tpos = vector.add(place, offsets[o]) + tpos.y = y + ok = place_tree_if_free(tpos, ok) + if not ok then + break + end + end + end + end + end + end + end + + -- Ice spikes in v6 + -- In other mapgens, ice spikes are generated as decorations. + if mg_name == "v6" and not chunk_has_igloo and nn == "mcl_core:snowblock" then + local spike = math.random(1, 58000) + if spike < 3 then + -- Check surface + local floor = {x=p.x+4, y=p.y-1, z=p.z+4} + local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock"}) + -- Check for collision with spruce + local spruce_collisions = minetest.find_nodes_in_area({x=p.x+1,y=p.y+2,z=p.z+1}, {x=p.x+4, y=p.y+6, z=p.z+4}, {"mcl_core:sprucetree", "mcl_core:spruceleaves"}) + + if #surface >= 9 and #spruce_collisions == 0 then + mcl_structures.call_struct(p, "ice_spike_large") + end + elseif spike < 100 then + -- Check surface + local floor = {x=p.x+6, y=p.y-1, z=p.z+6} + local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock", "mcl_core:dirt_with_grass_snow"}) + + -- Check for collision with spruce + local spruce_collisions = minetest.find_nodes_in_area({x=p.x+1,y=p.y+1,z=p.z+1}, {x=p.x+6, y=p.y+6, z=p.z+6}, {"mcl_core:sprucetree", "mcl_core:spruceleaves"}) + + if #surface >= 25 and #spruce_collisions == 0 then + mcl_structures.call_struct(p, "ice_spike_small") + end end - pos.y = pos.y - 1 end end end - end + end end + end + -- End exit portal + elseif minp.y <= END_EXIT_PORTAL_POS.y and maxp.y >= END_EXIT_PORTAL_POS.y and + minp.x <= END_EXIT_PORTAL_POS.x and maxp.x >= END_EXIT_PORTAL_POS.x and + minp.z <= END_EXIT_PORTAL_POS.z and maxp.z >= END_EXIT_PORTAL_POS.z then + local built = false + for y=maxp.y, minp.y, -1 do + local p = {x=END_EXIT_PORTAL_POS.x, y=y, z=END_EXIT_PORTAL_POS.z} + if minetest.get_node(p).name == "mcl_end:end_stone" then + mcl_structures.call_struct(p, "end_exit_portal") + built = true + break + end + end + if not built then + mcl_structures.call_struct(END_EXIT_PORTAL_POS, "end_exit_portal") + end end end --- Generate mushrooms in caves -local generate_underground_mushrooms = function(minp, maxp) +-- Buffers for LuaVoxelManip +local lvm_buffer = {} +local lvm_buffer_param2 = {} + +-- Generate tree decorations in the bounding box. This adds: +-- * Cocoa at jungle trees +-- * Jungle tree vines +-- * Oak vines in swamplands +local function generate_tree_decorations(minp, maxp, seed, data, param2_data, area, biomemap, lvm_used) + if maxp.y < 0 then + return lvm_used + end + + local oaktree, oakleaves, jungletree, jungleleaves = {}, {}, {}, {} + local swampland = minetest.get_biome_id("Swampland") + local swampland_shore = minetest.get_biome_id("Swampland_shore") + local jungle = minetest.get_biome_id("Jungle") + local jungle_shore = minetest.get_biome_id("Jungle_shore") + local jungle_m = minetest.get_biome_id("JungleM") + local jungle_m_shore = minetest.get_biome_id("JungleM_shore") + local jungle_edge = minetest.get_biome_id("JungleEdge") + local jungle_edge_shore = minetest.get_biome_id("JungleEdge_shore") + local jungle_edge_m = minetest.get_biome_id("JungleEdgeM") + local jungle_edge_m_shore = minetest.get_biome_id("JungleEdgeM_shore") + + -- Modifier for Jungle M biome: More vines and cocoas + local dense_vegetation = false + + if biomemap then + -- Biome map available: Check if the required biome (jungle or swampland) + -- is in this mapchunk. We are only interested in trees in the correct biome. + -- The nodes are added if the correct biome is *anywhere* in the mapchunk. + -- TODO: Strictly generate vines in the correct biomes only. + local swamp_biome_found, jungle_biome_found = false, false + for b=1, #biomemap do + local id = biomemap[b] + + if not swamp_biome_found and (id == swampland or id == swampland_shore) then + oaktree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:tree"}) + oakleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:leaves"}) + swamp_biome_found = true + end + if not jungle_biome_found and (id == jungle or id == jungle_shore or id == jungle_m or id == jungle_m_shore or id == jungle_edge or id == jungle_edge_shore or id == jungle_edge_m or id == jungle_edge_m_shore) then + jungletree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) + jungleleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) + jungle_biome_found = true + end + if not dense_vegetation and (id == jungle_m or id == jungle_m_shore) then + dense_vegetation = true + end + if swamp_biome_found and jungle_biome_found and dense_vegetation then + break + end + end + else + -- If there is no biome map, we just count all jungle things we can find. + -- Oak vines will not be generated. + jungletree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) + jungleleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) + end + + local pos, treepos, dir + + local cocoachance = 40 + if dense_vegetation then + cocoachance = 32 + end + + -- Pass 1: Generate cocoas at jungle trees + for n = 1, #jungletree do + + pos = table.copy(jungletree[n]) + treepos = table.copy(pos) + + if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then + + dir = math.random(1, cocoachance) + + if dir == 1 then + pos.z = pos.z + 1 + elseif dir == 2 then + pos.z = pos.z - 1 + elseif dir == 3 then + pos.x = pos.x + 1 + elseif dir == 4 then + pos.x = pos.x -1 + end + + local p_pos = area:index(pos.x, pos.y, pos.z) + local l = minetest.get_node_light(pos) + + if dir < 5 + and data[p_pos] == c_air + and l ~= nil and l > 12 then + local c = math.random(1, 3) + if c == 1 then + data[p_pos] = c_cocoa_1 + elseif c == 2 then + data[p_pos] = c_cocoa_2 + else + data[p_pos] = c_cocoa_3 + end + param2_data[p_pos] = minetest.dir_to_facedir(vector.subtract(treepos, pos)) + lvm_used = true + end + + end + end + + -- Pass 2: Generate vines at jungle wood, jungle leaves in jungle and oak wood, oak leaves in swampland + perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500) + perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1) + perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75) + perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10) + perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500) + + -- Extra long vines in Jungle M + local maxvinelength = 7 + if dense_vegetation then + maxvinelength = 14 + end + local treething + for i=1, 4 do + if i==1 then + treething = jungletree + elseif i == 2 then + treething = jungleleaves + elseif i == 3 then + treething = oaktree + elseif i == 4 then + treething = oakleaves + end + + for n = 1, #treething do + pos = treething[n] + + treepos = table.copy(pos) + + local dirs = { + {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 d = 1, #dirs do + local pos = vector.add(pos, dirs[d]) + local p_pos = area:index(pos.x, pos.y, pos.z) + + local vine_threshold = math.max(0.33333, perlin_vines_density:get_2d(pos)) + if dense_vegetation then + vine_threshold = vine_threshold * (2/3) + end + + if perlin_vines:get_2d(pos) > -1.0 and perlin_vines_fine:get_3d(pos) > vine_threshold and data[p_pos] == c_air then + + local rdir = {} + rdir.x = -dirs[d].x + rdir.y = dirs[d].y + rdir.z = -dirs[d].z + local param2 = minetest.dir_to_wallmounted(rdir) + + -- Determine growth direction + local grow_upwards = false + -- Only possible on the wood, not on the leaves + if i == 1 then + grow_upwards = perlin_vines_upwards:get_3d(pos) > 0.8 + end + if grow_upwards then + -- Grow vines up 1-4 nodes, even through jungleleaves. + -- This may give climbing access all the way to the top of the tree :-) + -- But this will be fairly rare. + local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * 4) + for l=0, length-1 do + local t_pos = area:index(treepos.x, treepos.y, treepos.z) + + if (data[p_pos] == c_air or data[p_pos] == c_jungleleaves or data[p_pos] == c_leaves) and mcl_core.supports_vines(minetest.get_name_from_content_id(data[t_pos])) then + data[p_pos] = c_vine + param2_data[p_pos] = param2 + lvm_used = true + + else + break + end + pos.y = pos.y + 1 + p_pos = area:index(pos.x, pos.y, pos.z) + treepos.y = treepos.y + 1 + end + else + -- Grow vines down, length between 1 and maxvinelength + local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * maxvinelength) + for l=0, length-1 do + if data[p_pos] == c_air then + data[p_pos] = c_vine + param2_data[p_pos] = param2 + lvm_used = true + + else + break + end + pos.y = pos.y - 1 + p_pos = area:index(pos.x, pos.y, pos.z) + end + end + end + end + + end + end + return lvm_used +end + +local pr_shroom = PseudoRandom(os.time()-24359) +-- Generate mushrooms in caves manually. +-- Minetest's API does not support decorations in caves yet. :-( +local generate_underground_mushrooms = function(minp, maxp, seed) -- Generate rare underground mushrooms -- TODO: Make them appear in groups, use Perlin noise - if minp.y > 0 or maxp.y < -32 then + local min, max = mcl_vars.mg_lava_overworld_max + 4, 0 + if minp.y > max or maxp.y < min then return end @@ -1192,8 +1671,9 @@ local generate_underground_mushrooms = function(minp, maxp) for n = 1, #stone do bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z } - if math.random(1,1000) < 4 and minetest.get_node_light(bpos, 0.5) <= 12 then - if math.random(1,2) == 1 then + local l = minetest.get_node_light(bpos, 0.5) + if bpos.y >= min and bpos.y <= max and l ~= nil and l <= 12 and pr_shroom:next(1,1000) < 4 then + if pr_shroom:next(1,2) == 1 then minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) else minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) @@ -1202,120 +1682,356 @@ local generate_underground_mushrooms = function(minp, maxp) end end +local pr_nether = PseudoRandom(os.time()+667) +local nether_wart_chance +if mg_name == "v6" then + nether_wart_chance = 85 +else + nether_wart_chance = 170 +end +-- Generate Nether decorations manually: Eternal fire, mushrooms, nether wart +-- Minetest's API does not support decorations in caves yet. :-( +local generate_nether_decorations = function(minp, maxp, seed) + if minp.y > mcl_vars.mg_nether_max or maxp.y < mcl_vars.mg_nether_min then + return + end + + -- TODO: Generate everything based on Perlin noise instead of PseudoRandom + + local bpos + local rack = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:netherrack"}) + local magma = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:magma"}) + local ssand = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:soul_sand"}) + + -- Helper function to spawn “fake” decoration + local special_deco = function(nodes, spawn_func) + for n = 1, #nodes do + bpos = {x = nodes[n].x, y = nodes[n].y + 1, z = nodes[n].z } + + spawn_func(bpos) + end + + end + + -- Eternal fire on netherrack + special_deco(rack, function(bpos) + -- Eternal fire on netherrack + if pr_nether:next(1,100) <= 3 then + minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) + end + end) + + -- Eternal fire on magma cubes + special_deco(magma, function(bpos) + if pr_nether:next(1,150) == 1 then + minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) + end + end) + + -- Mushrooms on netherrack + -- Note: Spawned *after* the fire because of light level checks + special_deco(rack, function(bpos) + local l = minetest.get_node_light(bpos, 0.5) + if bpos.y > mcl_vars.mg_lava_nether_max + 6 and l ~= nil and l <= 12 and pr_nether:next(1,1000) <= 4 then + -- TODO: Make mushrooms appear in groups, use Perlin noise + if pr_nether:next(1,2) == 1 then + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) + else + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) + end + end + end) + + -- Nether wart on soul sand + -- TODO: Spawn in Nether fortresses + special_deco(ssand, function(bpos) + if pr_nether:next(1, nether_wart_chance) == 1 then + minetest.set_node(bpos, {name = "mcl_nether:nether_wart"}) + end + end) + +end -- Below the bedrock, generate air/void -minetest.register_on_generated(function(minp, maxp) +minetest.register_on_generated(function(minp, maxp, seed) local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local data = vm:get_data(lvm_buffer) + local param2_data = vm:get_param2_data(lvm_buffer_param2) local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) + local aream = VoxelArea:new({MinEdge={x=minp.x, y=0, z=minp.z}, MaxEdge={x=maxp.x, y=0, z=maxp.z}}) local lvm_used = false + local biomemap - -- Generate bedrock and lava layers - if minp.y <= GEN_MAX then - local c_bedrock = minetest.get_content_id("mcl_core:bedrock") - local c_void = minetest.get_content_id("mcl_core:void") - local c_lava = minetest.get_content_id("mcl_core:lava_source") - local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") - local c_air = minetest.get_content_id("air") + local ymin, ymax - local max_y = math.min(maxp.y, GEN_MAX) + -- Generate basic layer-based nodes: void, bedrock, realm barrier, lava seas, etc. + -- Also perform some basic node replacements. - for y = minp.y, max_y do - for x = minp.x, maxp.x do - for z = minp.z, maxp.z do - local p_pos = area:index(x, y, z) - local setdata = nil - if mcl_vars.mg_bedrock_is_rough then - local is_bedrock = function(y) - -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer - -- This code assumes a bedrock height of 5 layers. - - local diff = mcl_vars.mg_bedrock_overworld_max - y -- Overworld bedrock - local ndiff1 = mcl_vars.mg_bedrock_nether_bottom_max - y -- Nether bedrock, bottom - local ndiff2 = mcl_vars.mg_bedrock_nether_top_max - y -- Nether bedrock, ceiling - - local top - if diff == 0 or ndiff1 == 0 or ndiff2 == 4 then - -- 50% bedrock chance - top = 2 - elseif diff == 1 or ndiff1 == 1 or ndiff2 == 3 then - -- 66.666...% - top = 3 - elseif diff == 2 or ndiff1 == 2 or ndiff2 == 2 then - -- 75% - top = 4 - elseif diff == 3 or ndiff1 == 3 or ndiff2 == 1 then - -- 90% - top = 10 - elseif diff == 4 or ndiff1 == 4 or ndiff2 == 0 then - -- 100% - return true - else - -- Not in bedrock layer - return false + -- Helper function to set all nodes in the layers between min and max. + -- content_id: Node to set + -- check: optional. + -- If content_id, node will be set only if it is equal to check. + -- If function(pos_to_check, content_id_at_this_pos), will set node only if returns true. + -- min, max: Minimum and maximum Y levels of the layers to set + -- minp, maxp: minp, maxp of the on_generated + -- lvm_used: Set to true if any node in this on_generated has been set before. + -- + -- returns true if any node was set and lvm_used otherwise + local function set_layers(content_id, check, min, max, minp, maxp, lvm_used) + if (maxp.y >= min and minp.y <= max) then + for y = math.max(min, minp.y), math.min(max, maxp.y) do + for x = minp.x, maxp.x do + for z = minp.z, maxp.z do + local p_pos = area:index(x, y, z) + if check then + if type(check) == "function" and check({x=x,y=y,z=z}, data[p_pos]) then + data[p_pos] = content_id + lvm_used = true + elseif check == data[p_pos] then + data[p_pos] = content_id + lvm_used = true end - - return math.random(1, top) <= top-1 - end - if is_bedrock(y) then - setdata = c_bedrock - elseif mcl_util.is_in_void({x=x,y=y,z=z}) then - setdata = c_void - end - else - -- Perfectly flat bedrock layer(s) - if (y >= mcl_vars.mg_bedrock_overworld_min and y <= mcl_vars.mg_bedrock_overworld_max) or - (y >= mcl_vars.mg_bedrock_nether_bottom_min or y <= mcl_vars.mg_bedrock_bottom_max) or - (y >= mcl_vars.mg_bedrock_nether_top_min or y <= mcl_vars.mg_bedrock_top_max) then - setdata = c_bedrock - elseif mcl_util.is_in_void({x=x,y=y,z=z}) then - setdata = c_void - end - end - - if setdata then - data[p_pos] = setdata - lvm_used = true - elseif mcl_vars.mg_lava and data[p_pos] == c_air then - if y <= mcl_vars.mg_lava_overworld_max and y >= mcl_vars.mg_overworld_min then - data[p_pos] = c_lava - lvm_used = true - elseif y <= mcl_vars.mg_lava_nether_max and y >= mcl_vars.mg_nether_min then - data[p_pos] = c_nether_lava + else + data[p_pos] = content_id lvm_used = true end end end end end + return lvm_used end - -- Put top snow on grassy snow blocks created by the v6 mapgen - -- This is because the snowy grass block must only be used when it is below snow or top snow - if mg_name == "v6" then - local c_top_snow = minetest.get_content_id("mcl_core:snow") - local snowdirt = minetest.find_nodes_in_area_under_air(minp, maxp, "mcl_core:dirt_with_grass_snow") - for n = 1, #snowdirt do - -- CHECKME: What happens at chunk borders? - local p_pos = area:index(snowdirt[n].x, snowdirt[n].y + 1, snowdirt[n].z) - if p_pos then - data[p_pos] = c_top_snow + -- The Void + lvm_used = set_layers(c_void, nil, -31000, mcl_vars.mg_nether_min-1, minp, maxp, lvm_used) + lvm_used = set_layers(c_void, nil, mcl_vars.mg_nether_max+1, mcl_vars.mg_end_min-1, minp, maxp, lvm_used) + lvm_used = set_layers(c_void, nil, mcl_vars.mg_end_max+1, mcl_vars.mg_realm_barrier_overworld_end_min-1, minp, maxp, lvm_used) + lvm_used = set_layers(c_void, nil, mcl_vars.mg_realm_barrier_overworld_end_max+1, mcl_vars.mg_overworld_min-1, minp, maxp, lvm_used) + + -- Realm barrier between the Overworld void and the End + lvm_used = set_layers(c_realm_barrier, nil, mcl_vars.mg_realm_barrier_overworld_end_min, mcl_vars.mg_realm_barrier_overworld_end_max, minp, maxp, lvm_used) + + if mg_name ~= "singlenode" then + -- Bedrock + local bedrock_check + if mcl_vars.mg_bedrock_is_rough then + bedrock_check = function(pos) + local y = pos.y + -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer + -- This code assumes a bedrock height of 5 layers. + + local diff = mcl_vars.mg_bedrock_overworld_max - y -- Overworld bedrock + local ndiff1 = mcl_vars.mg_bedrock_nether_bottom_max - y -- Nether bedrock, bottom + local ndiff2 = mcl_vars.mg_bedrock_nether_top_max - y -- Nether bedrock, ceiling + + local top + if diff == 0 or ndiff1 == 0 or ndiff2 == 4 then + -- 50% bedrock chance + top = 2 + elseif diff == 1 or ndiff1 == 1 or ndiff2 == 3 then + -- 66.666...% + top = 3 + elseif diff == 2 or ndiff1 == 2 or ndiff2 == 2 then + -- 75% + top = 4 + elseif diff == 3 or ndiff1 == 3 or ndiff2 == 1 then + -- 90% + top = 10 + elseif diff == 4 or ndiff1 == 4 or ndiff2 == 0 then + -- 100% + return true + else + -- Not in bedrock layer + return false + end + + return math.random(1, top) <= top-1 + end + else + bedrock_check = nil + end + + lvm_used = set_layers(c_bedrock, bedrock_check, mcl_vars.mg_bedrock_overworld_min, mcl_vars.mg_bedrock_overworld_max, minp, maxp, lvm_used) + lvm_used = set_layers(c_bedrock, bedrock_check, mcl_vars.mg_bedrock_nether_bottom_min, mcl_vars.mg_bedrock_nether_bottom_max, minp, maxp, lvm_used) + lvm_used = set_layers(c_bedrock, bedrock_check, mcl_vars.mg_bedrock_nether_top_min, mcl_vars.mg_bedrock_nether_top_max, minp, maxp, lvm_used) + + -- Flat Nether + if mg_name == "flat" then + lvm_used = set_layers(c_air, nil, mcl_vars.mg_flat_nether_floor, mcl_vars.mg_flat_nether_ceiling, minp, maxp, lvm_used) + end + + -- Big lava seas by replacing air below a certain height + if mcl_vars.mg_lava then + lvm_used = set_layers(c_lava, c_air, mcl_vars.mg_overworld_min, mcl_vars.mg_lava_overworld_max, emin, emax, lvm_used) + lvm_used = set_layers(c_nether_lava, c_air, mcl_vars.mg_nether_min, mcl_vars.mg_lava_nether_max, emin, emax, lvm_used) + end + + -- Clay, vines, cocoas + lvm_used = generate_clay(minp, maxp, seed, data, area, lvm_used) + + biomemap = minetest.get_mapgen_object("biomemap") + lvm_used = generate_tree_decorations(minp, maxp, seed, data, param2_data, area, biomemap, lvm_used) + + ----- Interactive block fixing section ----- + ----- The section to perform basic block overrides of the core mapgen generated world. ----- + + -- Snow and sand fixes. This code implements snow consistency + -- and fixes floating sand and cut plants. + -- A snowy grass block must be below a top snow or snow block at all times. + if emin.y <= mcl_vars.mg_overworld_max and emax.y >= mcl_vars.mg_overworld_min then + -- v6 mapgen: + if mg_name == "v6" then + + --[[ Remove broken double plants caused by v6 weirdness. + v6 might break the bottom part of double plants because of how it works. + There are 3 possibilities: + 1) Jungle: Top part is placed on top of a jungle tree or fern (=v6 jungle grass). + This is because the schematic might be placed even if some nodes of it + could not be placed because the destination was already occupied. + TODO: A better fix for this would be if schematics could abort placement + altogether if ANY of their nodes could not be placed. + 2) Cavegen: Removes the bottom part, the upper part floats + 3) Mudflow: Same as 2) ]] + local plants = minetest.find_nodes_in_area(emin, emax, "group:double_plant") + for n = 1, #plants do + local node = vm:get_node_at(plants[n]) + local is_top = minetest.get_item_group(node.name, "double_plant") == 2 + if is_top then + local p_pos = area:index(plants[n].x, plants[n].y-1, plants[n].z) + if p_pos then + node = vm:get_node_at({x=plants[n].x, y=plants[n].y-1, z=plants[n].z}) + local is_bottom = minetest.get_item_group(node.name, "double_plant") == 1 + if not is_bottom then + p_pos = area:index(plants[n].x, plants[n].y, plants[n].z) + data[p_pos] = c_air + lvm_used = true + end + end + end + end + + + -- Non-v6 mapgens: + else + -- Set param2 (=color) of grass blocks. + -- Clear snowy grass blocks without snow above to ensure consistency. + local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"}) + for n=1, #nodes do + local p_pos = area:index(nodes[n].x, nodes[n].y, nodes[n].z) + local p_pos_above = area:index(nodes[n].x, nodes[n].y+1, nodes[n].z) + local p_pos_below = area:index(nodes[n].x, nodes[n].y-1, nodes[n].z) + local b_pos = aream:index(nodes[n].x, 0, nodes[n].z) + local bn = minetest.get_biome_name(biomemap[b_pos]) + if bn then + local biome = minetest.registered_biomes[bn] + if biome then + if biome._mcl_biome_type then + param2_data[p_pos] = biome._mcl_palette_index + lvm_used = true + end + end + end + if data[p_pos] == c_dirt_with_grass_snow and p_pos_above and data[p_pos_above] ~= c_top_snow and data[p_pos_above] ~= c_snow_block then + data[p_pos] = c_dirt_with_grass + lvm_used = true + end + end + end + + -- Nether block fixes: + -- * Replace water with Nether lava. + -- * Replace stone, sand dirt in v6 so the Nether works in v6. + elseif emin.y <= mcl_vars.mg_nether_max and emax.y >= mcl_vars.mg_nether_min then + local nodes + if mg_name == "v6" then + nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) + else + nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source"}) + end + for n=1, #nodes do + local p_pos = area:index(nodes[n].x, nodes[n].y, nodes[n].z) + if data[p_pos] == c_water then + data[p_pos] = c_nether_lava + lvm_used = true + elseif data[p_pos] == c_stone then + data[p_pos] = c_netherrack + lvm_used = true + elseif data[p_pos] == c_sand or data[p_pos] == c_dirt then + data[p_pos] = c_soul_sand + lvm_used = true + end + end + + -- End block fixes: + -- * Replace water with end stone or air (depending on height). + -- * Remove stone, sand, dirt in v6 so our End map generator works in v6. + -- * Generate spawn platform (End portal destination) + elseif emin.y <= mcl_vars.mg_end_max and emax.y >= mcl_vars.mg_end_min then + local nodes + if mg_name == "v6" then + nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) + else + nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source"}) + end + for n=1, #nodes do + local y = nodes[n].y + local p_pos = area:index(nodes[n].x, y, nodes[n].z) + + if data[p_pos] == c_water or data[p_pos] == c_stone or data[p_pos] == c_dirt or data[p_pos] == c_sand then + data[p_pos] = c_air + lvm_used = true + end + + end + + -- Obsidian spawn platform + if minp.y <= mcl_vars.mg_end_platform_pos.y and maxp.y >= mcl_vars.mg_end_platform_pos.y and + minp.x <= mcl_vars.mg_end_platform_pos.x and maxp.x >= mcl_vars.mg_end_platform_pos.z and + minp.z <= mcl_vars.mg_end_platform_pos.z and maxp.z >= mcl_vars.mg_end_platform_pos.z then + for x=math.max(minp.x, mcl_vars.mg_end_platform_pos.x-2), math.min(maxp.x, mcl_vars.mg_end_platform_pos.x+2) do + for z=math.max(minp.z, mcl_vars.mg_end_platform_pos.z-2), math.min(maxp.z, mcl_vars.mg_end_platform_pos.z+2) do + for y=math.max(minp.y, mcl_vars.mg_end_platform_pos.y), math.min(maxp.y, mcl_vars.mg_end_platform_pos.y+2) do + local p_pos = area:index(x, y, z) + if y == mcl_vars.mg_end_platform_pos.y then + data[p_pos] = c_obsidian + else + data[p_pos] = c_air + end + end + end + end + lvm_used = true end end - if #snowdirt > 1 then - lvm_used = true - end end + -- Final hackery: Set sun light level in the End. + -- -26912 is at a mapchunk border. + local shadow + if minp.y >= -26912 and maxp.y <= mcl_vars.mg_end_max then + vm:set_lighting({day=15, night=15}) + lvm_used = true + end + if minp.y >= mcl_vars.mg_end_min and maxp.y <= -26911 then + shadow = false + lvm_used = true + end + + -- Write stuff if lvm_used then vm:set_data(data) - vm:calc_lighting() - vm:update_liquids() + vm:set_param2_data(param2_data) + vm:calc_lighting(nil, nil, shadow) vm:write_to_map() + vm:update_liquids() end - generate_underground_mushrooms(minp, maxp) - generate_jungle_tree_decorations(minp, maxp) + if mg_name ~= "singlenode" then + -- Generate special decorations + generate_underground_mushrooms(minp, maxp, seed) + generate_nether_decorations(minp, maxp, seed) + generate_structures(minp, maxp, seed, biomemap) + end end) diff --git a/mods/MAPGEN/mcl_strongholds/depends.txt b/mods/MAPGEN/mcl_strongholds/depends.txt new file mode 100644 index 00000000..76570fa3 --- /dev/null +++ b/mods/MAPGEN/mcl_strongholds/depends.txt @@ -0,0 +1,3 @@ +mcl_init +mcl_structures +mcl_mapgen_core diff --git a/mods/MAPGEN/mcl_strongholds/description.txt b/mods/MAPGEN/mcl_strongholds/description.txt new file mode 100644 index 00000000..2f761edb --- /dev/null +++ b/mods/MAPGEN/mcl_strongholds/description.txt @@ -0,0 +1 @@ +Generates strongholds with end portals in the Overworld diff --git a/mods/MAPGEN/mcl_strongholds/init.lua b/mods/MAPGEN/mcl_strongholds/init.lua new file mode 100644 index 00000000..92313bee --- /dev/null +++ b/mods/MAPGEN/mcl_strongholds/init.lua @@ -0,0 +1,104 @@ +-- Generate strongholds. + +-- A total of 128 strongholds are generated in rings around the world origin. +-- This is the list of rings, starting with the innermost ring first. +local stronghold_rings = { + -- amount: Number of strongholds in ring. + -- min, max: Minimum and maximum distance from (X=0, Z=0). + { amount = 3, min = 1408, max = 2688 }, + { amount = 6, min = 4480, max = 5760 }, + { amount = 10, min = 7552, max = 8832 }, + { amount = 15, min = 10624, max = 11904 }, + { amount = 21, min = 13696, max = 14976 }, + { amount = 28, min = 16768, max = 18048 }, + { amount = 36, min = 19840, max = 21120 }, + { amount = 9, min = 22912, max = 24192 }, +} + +local strongholds = {} +local strongholds_inited = false + +local mg_name = minetest.get_mapgen_setting("mg_name") +local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" + +-- Determine the stronghold positions and store them into the strongholds table. +-- The stronghold positions are based on the world seed. +-- The actual position might be offset by a few blocks because it might be shifted +-- to make sure the end portal room is completely within the boundaries of a mapchunk. +local init_strongholds = function() + if strongholds_inited then + return + end + -- Don't generate strongholds in singlenode + if mg_name == "singlenode" then + strongholds_inited = true + return + end + local seed = tonumber(minetest.get_mapgen_setting("seed")) + local pr = PseudoRandom(seed) + for s=1, #stronghold_rings do + local ring = stronghold_rings[s] + + -- Get random angle + local angle = pr:next() + -- Scale angle to 0 .. 2*math.pi + angle = (angle / 32767) * (math.pi*2) + for a=1, ring.amount do + local dist = pr:next(ring.min, ring.max) + local y + if superflat then + y = mcl_vars.mg_bedrock_overworld_max + 3 + else + y = pr:next(mcl_vars.mg_bedrock_overworld_max+1, mcl_vars.mg_overworld_min+48) + end + local pos = { x = math.cos(angle) * dist, y = y, z = math.sin(angle) * dist } + pos = vector.round(pos) + table.insert(strongholds, { pos = pos, generated = false }) + + -- Rotate angle by (360 / amount) degrees. + -- This will cause the angles to be evenly distributed in the stronghold ring + angle = math.fmod(angle + ((math.pi*2) / ring.amount), math.pi*2) + end + end + + mcl_structures.register_structures("stronghold", table.copy(strongholds)) + + strongholds_inited = true +end + +-- Stronghold generation for register_on_generated. +local generate_strongholds = function(minp, maxp) + for s=1, #strongholds do + if not strongholds[s].generated then + local pos = strongholds[s].pos + if minp.x <= pos.x and maxp.x >= pos.x and minp.z <= pos.z and maxp.z >= pos.z and minp.y <= pos.y and maxp.y >= pos.y then + -- Make sure the end portal room is completely within the current mapchunk + -- The original pos is changed intentionally. + if pos.x - 6 < minp.x then + pos.x = minp.x + 7 + end + if pos.x + 6 > maxp.x then + pos.x = maxp.x - 7 + end + if pos.z - 6 < minp.z then + pos.z = minp.z + 7 + end + if pos.z + 6 > maxp.z then + pos.z = maxp.z - 7 + end + + mcl_structures.call_struct(pos, "end_portal_shrine") + strongholds[s].generated = true + end + end + end +end + +init_strongholds() + +--[[ Note this mod depends on mcl_mapgen_core to make sure the core mapgen runs FIRST. +This is important because we need this to make sure the stronghold isn't instantly +overwritten by the core mapgen (since it uses LuaVoxelManip). ]] +minetest.register_on_generated(function(minp, maxp, blockseed) + generate_strongholds(minp, maxp) +end) diff --git a/mods/MAPGEN/mcl_strongholds/mod.conf b/mods/MAPGEN/mcl_strongholds/mod.conf new file mode 100644 index 00000000..22c99de4 --- /dev/null +++ b/mods/MAPGEN/mcl_strongholds/mod.conf @@ -0,0 +1 @@ +name = mcl_strongholds diff --git a/mods/MAPGEN/mcl_structures/depends.txt b/mods/MAPGEN/mcl_structures/depends.txt index eab89039..dc513fc7 100644 --- a/mods/MAPGEN/mcl_structures/depends.txt +++ b/mods/MAPGEN/mcl_structures/depends.txt @@ -1,12 +1 @@ -mcl_core mcl_loot -xpanes -mcl_doors -mcl_stairs -mcl_colorblocks -mcl_wool -mcl_fences -mcl_chests -mcl_inventory -mesecons_pressureplates -mcl_tnt diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 942e235f..083f9539 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -1,4 +1,4 @@ -local init = os.clock() +local S = minetest.get_translator("mcl_structures") mcl_structures ={} mcl_structures.get_struct = function(file) @@ -15,167 +15,159 @@ mcl_structures.get_struct = function(file) return allnode end +local mapseed = tonumber(minetest.get_mapgen_setting("seed")) +-- Random number generator for all generated structures +local pr = PseudoRandom(mapseed) --- World edit function - -mcl_structures.valueversion_WE = function(value) - if value:find("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)") and not value:find("%{") then --previous list format - return 3 - elseif value:find("^[^\"']+%{%d+%}") then - if value:find("%[\"meta\"%]") then --previous meta flat table format - return 2 - end - return 1 --original flat table format - elseif value:find("%{") then --current nested table format - return 4 +-- Call on_construct on pos. +-- Useful to init chests from formspec. +local init_node_construct = function(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + if def and def.on_construct then + def.on_construct(pos) + return true end - return 0 --unknown format + return false end -mcl_structures.allocate_WE = function(originpos, value) - local huge = math.huge - local pos1x, pos1y, pos1z = huge, huge, huge - local pos2x, pos2y, pos2z = -huge, -huge, -huge - local originx, originy, originz = originpos.x, originpos.y, originpos.z - local count = 0 - local version = mcl_structures.valueversion_WE (value) - if version == 4 then --current nested table format - --wip: this is a filthy hack that works surprisingly well - value = value:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1) - local escaped = value:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end) - local startpos, startpos1, endpos = 1, 1 - local nodes = {} - while true do - startpos, endpos = escaped:find("},%s*{", startpos) - if not startpos then - break - end - local current = value:sub(startpos1, startpos) - table.insert(nodes, minetest.deserialize("return " .. current)) - startpos, startpos1 = endpos, endpos - end - table.insert(nodes, minetest.deserialize("return " .. value:sub(startpos1))) - - --local nodes = minetest.deserialize(value) --wip: this is broken for larger tables in the current version of LuaJIT - - count = #nodes - for index = 1, count do - local entry = nodes[index] - local x, y, z = originx + entry.x, originy + entry.y, originz + entry.z - if x < pos1x then pos1x = x end - if y < pos1y then pos1y = y end - if z < pos1z then pos1z = z end - if x > pos2x then pos2x = x end - if y > pos2y then pos2y = y end - if z > pos2z then pos2z = z end - end - else - minetest.log("error", "[mcl_structures] Unsupported WorldEdit file format ("..version..")") - return - end - local pos1 = {x=pos1x, y=pos1y, z=pos1z} - local pos2 = {x=pos2x, y=pos2y, z=pos2z} - return pos1, pos2, count -end - ---[[ -Deserialize WorldEdit string and set the nodes in the world. -Returns: count, chests -* count: Number of nodes set -* chests: Table of chest positions (use these to spawn treasures -]] -mcl_structures.deserialise_WE = function(originpos, value) - --make area stay loaded - local pos1, pos2 = mcl_structures.allocate_WE(originpos, value) - local count = 0 - local chests = {} -- Remember positions of all chests - if not pos1 then - return count, chests - end - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos1, pos2) - - local originx, originy, originz = originpos.x, originpos.y, originpos.z - local add_node, get_meta = minetest.add_node, minetest.get_meta - local version = mcl_structures.valueversion_WE(value) - if version == 4 then --current nested table format - --wip: this is a filthy hack that works surprisingly well - value = value:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1) - local escaped = value:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end) - local startpos, startpos1, endpos = 1, 1 - local nodes = {} - while true do - startpos, endpos = escaped:find("},%s*{", startpos) - if not startpos then - break - end - local current = value:sub(startpos1, startpos) - table.insert(nodes, minetest.deserialize("return " .. current)) - startpos, startpos1 = endpos, endpos - end - table.insert(nodes, minetest.deserialize("return " .. value:sub(startpos1))) - - --local nodes = minetest.deserialize(value) --wip: this is broken for larger tables in the current version of LuaJIT - - --load the nodes and remember chests - count = #nodes - for index = 1, count do - local entry = nodes[index] - entry.x, entry.y, entry.z = originx + entry.x, originy + entry.y, originz + entry.z - add_node(entry, entry) --entry acts both as position and as node - if entry.name == "mcl_chests:chest" then - table.insert(chests, {x=entry.x, y=entry.y, z=entry.z}) - end - end - - --load the metadata - for index = 1, count do - local entry = nodes[index] - get_meta(entry):from_table(entry.meta) - end - end - return count, chests -end - --- End of world edit deserialise part - -- The call of Struct -mcl_structures.call_struct= function(pos, struct_style) +mcl_structures.call_struct = function(pos, struct_style, rotation) + if not rotation then + rotation = "random" + end if struct_style == "village" then - mcl_structures.geerate_village(pos) + return mcl_structures.generate_village(pos, rotation) elseif struct_style == "desert_temple" then - mcl_structures.generate_desert_temple(pos) + return mcl_structures.generate_desert_temple(pos, rotation) elseif struct_style == "desert_well" then - mcl_structures.generate_desert_well(pos) + return mcl_structures.generate_desert_well(pos, rotation) elseif struct_style == "igloo" then - mcl_structures.generate_igloo_top(pos) + return mcl_structures.generate_igloo(pos, rotation) elseif struct_style == "witch_hut" then - mcl_structures.generate_witch_hut(pos) + return mcl_structures.generate_witch_hut(pos, rotation) elseif struct_style == "ice_spike_small" then - mcl_structures.generate_ice_spike_small(pos) + return mcl_structures.generate_ice_spike_small(pos, rotation) elseif struct_style == "ice_spike_large" then - mcl_structures.generate_ice_spike_large(pos) + return mcl_structures.generate_ice_spike_large(pos, rotation) elseif struct_style == "boulder" then - mcl_structures.generate_boulder(pos) + return mcl_structures.generate_boulder(pos, rotation) elseif struct_style == "fossil" then - mcl_structures.generate_fossil(pos) + return mcl_structures.generate_fossil(pos, rotation) + elseif struct_style == "end_exit_portal" then + return mcl_structures.generate_end_exit_portal(pos, rotation) + elseif struct_style == "end_portal_shrine" then + return mcl_structures.generate_end_portal_shrine(pos, rotation) end end mcl_structures.generate_village = function(pos) - -- No Generating for the moment only place it :D - local city = mcl_structures.get_struct("pnj_town_1.we") - local newpos = {x=pos.x,y=pos.y,z=pos.z} - if newpos == nil then - return - end - mcl_structures.deserialise_WE(newpos, city ) + -- No generating for the moment, only place it :D + -- TODO: Do complete overhaul of the algorithm + local newpos = {x=pos.x,y=pos.y-1,z=pos.z} + local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_village.mts" + return minetest.place_schematic(newpos, path, "random", nil, true) end mcl_structures.generate_desert_well = function(pos) local newpos = {x=pos.x,y=pos.y-2,z=pos.z} local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_desert_well.mts" - minetest.place_schematic(newpos, path, "0", nil, true) + return minetest.place_schematic(newpos, path, "0", nil, true) +end + +mcl_structures.generate_igloo = function(pos) + -- Place igloo + local success, rotation = mcl_structures.generate_igloo_top(pos) + -- Place igloo basement with 50% chance + local r = math.random(1,2) + if success and r == 1 then + -- Select basement depth + local dim = mcl_worlds.pos_to_dimension(pos) + local buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) + if dim == "nether" then + buffer = pos.y - (mcl_vars.mg_lava_nether_max + 10) + elseif dim == "end" then + buffer = pos.y - (mcl_vars.mg_end_min + 1) + elseif dim == "overworld" then + buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) + else + return success + end + if buffer <= 19 then + return success + end + local depth = math.random(19, buffer) + local bpos = {x=pos.x, y=pos.y-depth, z=pos.z} + -- trapdoor position + local tpos + local dir, tdir + if rotation == "0" then + dir = {x=-1, y=0, z=0} + tdir = {x=1, y=0, z=0} + tpos = {x=pos.x+7, y=pos.y-1, z=pos.z+3} + elseif rotation == "90" then + dir = {x=0, y=0, z=-1} + tdir = {x=0, y=0, z=-1} + tpos = {x=pos.x+3, y=pos.y-1, z=pos.z+1} + elseif rotation == "180" then + dir = {x=1, y=0, z=0} + tdir = {x=-1, y=0, z=0} + tpos = {x=pos.x+1, y=pos.y-1, z=pos.z+3} + elseif rotation == "270" then + dir = {x=0, y=0, z=1} + tdir = {x=0, y=0, z=1} + tpos = {x=pos.x+3, y=pos.y-1, z=pos.z+7} + else + return success + end + local set_brick = function(pos) + local c = math.random(1, 3) -- cracked chance + local m = math.random(1, 10) -- chance for monster egg + local brick + if m == 1 then + if c == 1 then + brick = "mcl_monster_eggs:monster_egg_stonebrickcracked" + else + brick = "mcl_monster_eggs:monster_egg_stonebrick" + end + else + if c == 1 then + brick = "mcl_core:stonebrickcracked" + else + brick = "mcl_core:stonebrick" + end + end + minetest.set_node(pos, {name=brick}) + end + local ladder_param2 = minetest.dir_to_wallmounted(tdir) + local real_depth = 0 + -- Check how deep we can actuall dig + for y=1, depth-5 do + real_depth = real_depth + 1 + local node = minetest.get_node({x=tpos.x,y=tpos.y-y,z=tpos.z}) + local def = minetest.registered_nodes[node.name] + if (not def) or (not def.walkable) or (def.liquidtype ~= "none") or (not def.is_ground_content) then + bpos.y = tpos.y-y+1 + break + end + end + if real_depth <= 6 then + return success + end + -- Place hidden trapdoor + minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) -- TODO: more reliable param2 + -- Generate ladder to basement + for y=1, real_depth-1 do + set_brick({x=tpos.x-1,y=tpos.y-y,z=tpos.z }) + set_brick({x=tpos.x+1,y=tpos.y-y,z=tpos.z }) + set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z-1}) + set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z+1}) + minetest.set_node({x=tpos.x,y=tpos.y-y,z=tpos.z}, {name="mcl_core:ladder", param2=ladder_param2}) + end + -- Place basement + mcl_structures.generate_igloo_basement(bpos, rotation) + end + return success end mcl_structures.generate_igloo_top = function(pos) @@ -183,167 +175,224 @@ mcl_structures.generate_igloo_top = function(pos) -- Furnace does ot work atm because apparently meta is not set. :-( local newpos = {x=pos.x,y=pos.y-1,z=pos.z} local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_igloo_top.mts" - minetest.place_schematic(newpos, path, "random", nil, true) + local rotation = tostring(math.random(0,3)*90) + return minetest.place_schematic(newpos, path, rotation, nil, true), rotation end mcl_structures.generate_igloo_basement = function(pos, orientation) -- TODO: Add brewing stand + -- TODO: Add monster eggs + -- TODO: Spawn villager and zombie villager local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_igloo_basement.mts" - minetest.place_schematic(pos, path, orientation, nil, true) + + local success = minetest.place_schematic(pos, path, orientation, nil, true) + if success then + local chest_offset + if orientation == "0" then + chest_offset = {x=5, y=1, z=5} + elseif orientation == "90" then + chest_offset = {x=5, y=1, z=3} + elseif orientation == "180" then + chest_offset = {x=3, y=1, z=1} + elseif orientation == "270" then + chest_offset = {x=1, y=1, z=5} + else + return success + end + local size = {x=9,y=5,z=7} + local lootitems = mcl_loot.get_multi_loot({ + { + stacks_min = 1, + stacks_max = 1, + items = { + { itemstring = "mcl_core:apple_gold", weight = 1 }, + } + }, + { + stacks_min = 2, + stacks_max = 8, + items = { + { itemstring = "mcl_core:coal_lump", weight = 15, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_core:apple", weight = 15, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_farming:wheat_item", weight = 10, amount_min = 2, amount_max = 3 }, + { itemstring = "mcl_core:gold_nugget", weight = 10, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, + { itemstring = "mcl_tools:axe_stone", weight = 2 }, + { itemstring = "mcl_core:emerald", weight = 1 }, + } + }}, pr) + + local chest_pos = vector.add(pos, chest_offset) + init_node_construct(chest_pos) + local meta = minetest.get_meta(chest_pos) + local inv = meta:get_inventory() + mcl_loot.fill_inventory(inv, "main", lootitems) + end + return success end mcl_structures.generate_boulder = function(pos) -- Choose between 2 boulder sizes (2×2×2 or 3×3×3) local r = math.random(1, 10) - local w + local path if r <= 3 then - w = 2 + path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_boulder_small.mts" else - w = 3 - end - local data, yslice_prob - if w == 2 then - local a = { name = "mcl_core:mossycobble" } - local p = { name = "mcl_core:mossycobble", prob = 127 } - data = { - a, a, - p, p, - - a, a, - p, p, - } - elseif w == 3 then - local a = { name = "mcl_core:mossycobble" } -- bottom layer - local x = { name = "mcl_core:mossycobble", prob = 192 } -- corner in middle layer - local b, c -- middle and top layer - local e = { name = "air", prob = 0 } -- empty - -- This selects the amount of erosion (random removal of blocks) - if r == 10 then - -- Erosion occours on top 2 layers - -- Top layer is completely eroded and middle layer is randomly eroded - b = { name = "mcl_core:mossycobble", prob = 127 } - x.prob = 127 - c = e - else - -- Erosion occours randomly on top layer only - b = a - c = { name = "mcl_core:mossycobble", prob = 127 } - end - local e = { name = "air", prob = 0 } - data = { - e, a, e, - x, b, x, - e, c, e, - - a, a, a, - b, b, b, - c, c, c, - - e, a, e, - x, b, x, - e, c, e, - } - - -- Chance to destroy the bottom slice - yslice_prob = { { ypos=1, prob=140 } } + path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_boulder.mts" end - local schematic = { - size = { x=w, y=w, z=w}, - data = data, - yslice_prob = yslice_prob, - } - - minetest.place_schematic(pos, schematic) + local newpos = {x=pos.x,y=pos.y-1,z=pos.z} + return minetest.place_schematic(newpos, path) end -mcl_structures.generate_witch_hut = function(pos) +mcl_structures.generate_witch_hut = function(pos, rotation) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_witch_hut.mts" - minetest.place_schematic(pos, path, "random", nil, true) + return minetest.place_schematic(pos, path, rotation, nil, true) end mcl_structures.generate_ice_spike_small = function(pos) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_ice_spike_small.mts" - minetest.place_schematic(pos, path, "random", nil, false) + return minetest.place_schematic(pos, path, "random", nil, false) end mcl_structures.generate_ice_spike_large = function(pos) - local h = math.random(20, 40) - local r = math.random(1,3) - local top = false - local simple_spike_bonus = 2 - -- Decide between MTS file-based top or simple top - if r == 1 then - -- MTS file - top = true - else - -- Simple top, just some stacked nodes - h = h + simple_spike_bonus - end - local w = 3 - local data = {} - local middle = 2 - for z=1, w do - for y=1, h do - for x=1, w do - local prob - -- This creates a simple 1 node wide spike top - if not top and ((y > h - simple_spike_bonus) and (x==1 or x==w or z==1 or z==w)) then - prob = 0 - -- Chance to leave out ice spike piece at corners, but never at bottom - elseif y~=1 and ((x==1 and z==1) or (x==1 and z==w) or (x==w and z==1) or (x==w and z==w)) then - prob = 140 -- 54.6% chance to stay - end - table.insert(data, {name = "mcl_core:packed_ice", prob = prob }) - end - end - end - - local base_schematic = { - size = { x=w, y=h, z=w}, - data = data, - } - - minetest.place_schematic(pos, base_schematic) - - if top then - local toppos = {x=pos.x-1, y=pos.y+h, z=pos.z-1} - local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_ice_spike_large_top.mts" - minetest.place_schematic(toppos, path, "random") - end + local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_ice_spike_large.mts" + return minetest.place_schematic(pos, path, "random", nil, false) end mcl_structures.generate_fossil = function(pos) -- Generates one out of 8 possible fossil pieces local newpos = {x=pos.x,y=pos.y-1,z=pos.z} local fossils = { - "mcl_structures_fossil_skull_1.mts", - "mcl_structures_fossil_skull_2.mts", - "mcl_structures_fossil_skull_3.mts", - "mcl_structures_fossil_skull_4.mts", - "mcl_structures_fossil_spine_1.mts", - "mcl_structures_fossil_spine_2.mts", - "mcl_structures_fossil_spine_3.mts", - "mcl_structures_fossil_spine_4.mts", + "mcl_structures_fossil_skull_1.mts", -- 4×5×5 + "mcl_structures_fossil_skull_2.mts", -- 5×5×5 + "mcl_structures_fossil_skull_3.mts", -- 5×5×7 + "mcl_structures_fossil_skull_4.mts", -- 7×5×5 + "mcl_structures_fossil_spine_1.mts", -- 3×3×13 + "mcl_structures_fossil_spine_2.mts", -- 5×4×13 + "mcl_structures_fossil_spine_3.mts", -- 7×4×13 + "mcl_structures_fossil_spine_4.mts", -- 8×5×13 } local r = math.random(1, #fossils) local path = minetest.get_modpath("mcl_structures").."/schematics/"..fossils[r] - minetest.place_schematic(newpos, path, "random", nil, false) + return minetest.place_schematic(newpos, path, "random", nil, true) +end + +mcl_structures.generate_end_exit_portal = function(pos) + local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_exit_portal.mts" + return minetest.place_schematic(pos, path, "0", nil, true) +end + +mcl_structures.generate_end_portal_shrine = function(pos) + local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_portal_room_simple.mts" + local offset = {x=6, y=8, z=6} + local size = {x=13, y=8, z=13} + local newpos = { x = pos.x - offset.x, y = pos.y, z = pos.z - offset.z } + local ret = minetest.place_schematic(newpos, path, "0", nil, true) + if ret == nil then + return ret + end + + local area_start, area_end = newpos, vector.add(newpos, size) + -- Find and setup spawner with silverfish + local spawners = minetest.find_nodes_in_area(area_start, area_end, "mcl_mobspawners:spawner") + for s=1, #spawners do + local meta = minetest.get_meta(spawners[s]) + mcl_mobspawners.setup_spawner(spawners[s], "mobs_mc:silverfish") + end + + -- Shuffle stone brick types + local bricks = minetest.find_nodes_in_area(area_start, area_end, "mcl_core:stonebrick") + for b=1, #bricks do + local r_bricktype = pr:next(1, 100) + local r_infested = pr:next(1, 100) + local bricktype + if r_infested <= 5 then + if r_bricktype <= 30 then -- 30% + bricktype = "mcl_monster_eggs:monster_egg_stonebrickmossy" + elseif r_bricktype <= 50 then -- 20% + bricktype = "mcl_monster_eggs:monster_egg_stonebrickcracked" + else -- 50% + bricktype = "mcl_monster_eggs:monster_egg_stonebrick" + end + else + if r_bricktype <= 30 then -- 30% + bricktype = "mcl_core:stonebrickmossy" + elseif r_bricktype <= 50 then -- 20% + bricktype = "mcl_core:stonebrickcracked" + end + -- 50% stonebrick (no change necessary) + end + if bricktype ~= nil then + minetest.set_node(bricks[b], { name = bricktype }) + end + end + + -- Also replace stairs + local stairs = minetest.find_nodes_in_area(area_start, area_end, {"mcl_stairs:stair_stonebrick", "mcl_stairs:stair_stonebrick_outer", "mcl_stairs:stair_stonebrick_inner"}) + for s=1, #stairs do + local stair = minetest.get_node(stairs[s]) + local r_type = pr:next(1, 100) + if r_type <= 30 then -- 30% mossy + if stair.name == "mcl_stairs:stair_stonebrick" then + stair.name = "mcl_stairs:stair_stonebrickmossy" + elseif stair.name == "mcl_stairs:stair_stonebrick_outer" then + stair.name = "mcl_stairs:stair_stonebrickmossy_outer" + elseif stair.name == "mcl_stairs:stair_stonebrick_inner" then + stair.name = "mcl_stairs:stair_stonebrickmossy_inner" + end + minetest.set_node(stairs[s], stair) + elseif r_type <= 50 then -- 20% cracky + if stair.name == "mcl_stairs:stair_stonebrick" then + stair.name = "mcl_stairs:stair_stonebrickcracked" + elseif stair.name == "mcl_stairs:stair_stonebrick_outer" then + stair.name = "mcl_stairs:stair_stonebrickcracked_outer" + elseif stair.name == "mcl_stairs:stair_stonebrick_inner" then + stair.name = "mcl_stairs:stair_stonebrickcracked_inner" + end + minetest.set_node(stairs[s], stair) + end + -- 50% no change + end + + -- Randomly add ender eyes into end portal frames, but never fill the entire frame + local frames = minetest.find_nodes_in_area(area_start, area_end, "mcl_portals:end_portal_frame") + local eyes = 0 + for f=1, #frames do + local r_eye = pr:next(1, 10) + if r_eye == 1 then + eyes = eyes + 1 + if eyes < #frames then + local frame_node = minetest.get_node(frames[f]) + frame_node.name = "mcl_portals:end_portal_frame_eye" + minetest.set_node(frames[f], frame_node) + end + end + end + + return ret end mcl_structures.generate_desert_temple = function(pos) -- No Generating for the temple ... Why using it ? No Change - local temple = mcl_structures.get_struct("mcl_structures_desert_temple.we") + local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_desert_temple.mts" local newpos = {x=pos.x,y=pos.y-12,z=pos.z} + local size = {x=22, y=24, z=22} if newpos == nil then return end - local count, chests = mcl_structures.deserialise_WE(newpos, temple) + local ret = minetest.place_schematic(newpos, path, "random", nil, true) + if ret == nil then + return ret + end + + -- Find chests. + -- FIXME: Searching this large area just for the chets is not efficient. Need a better way to find the chests; + -- probably let's just infer it from newpos because the schematic always the same. + local chests = minetest.find_nodes_in_area({x=newpos.x-size.x, y=newpos.y, z=newpos.z-size.z}, vector.add(newpos, size), "mcl_chests:chest") -- Add desert temple loot into chests for c=1, #chests do - -- FIXME: Use better seeding - local pr = PseudoRandom(math.random(0, 4294967295)) local lootitems = mcl_loot.get_multi_loot({ { stacks_min = 2, @@ -380,65 +429,103 @@ mcl_structures.generate_desert_temple = function(pos) } }}, pr) + local meta = minetest.get_meta(chests[c]) + init_node_construct(chests[c]) local meta = minetest.get_meta(chests[c]) local inv = meta:get_inventory() - for i=1, #lootitems do - inv:add_item("main", lootitems[i]) + mcl_loot.fill_inventory(inv, "main", lootitems) + end + + -- Initialize pressure plates and randomly remove up to 5 plates + local pplates = minetest.find_nodes_in_area({x=newpos.x-size.x, y=newpos.y, z=newpos.z-size.z}, vector.add(newpos, size), "mesecons_pressureplates:pressure_plate_stone_off") + local pplates_remove = 5 + for p=1, #pplates do + if pplates_remove > 0 and pr:next(1, 100) >= 50 then + -- Remove plate + minetest.remove_node(pplates[p]) + pplates_remove = pplates_remove - 1 + else + -- Initialize plate + minetest.registered_nodes["mesecons_pressureplates:pressure_plate_stone_off"].on_construct(pplates[p]) end end + + return ret +end + +local registered_structures = {} + +--[[ Returns a table of structure of the specified type. +Currently the only valid parameter is "stronghold". +Format of return value: +{ + { pos = , generated= }, -- first structure + { pos = , generated= }, -- second structure + -- and so on +} + +TODO: Implement this function for all other structure types as well. +]] +mcl_structures.get_registered_structures = function(structure_type) + if registered_structures[structure_type] then + return table.copy(registered_structures[structure_type]) + else + return {} + end end +-- Register a structures table for the given type. The table format is the same as for +-- mcl_structures.get_registered_structures. +mcl_structures.register_structures = function(structure_type, structures) + registered_structures[structure_type] = structures +end -- Debug command minetest.register_chatcommand("spawnstruct", { - params = "desert_temple | desert_well | igloo | village | witch_hut | boulder | ice_spike_small | ice_spike_large | fossil", - description = "Generate a pre-defined structure near your position.", + params = "desert_temple | desert_well | igloo | village | witch_hut | boulder | ice_spike_small | ice_spike_large | fossil | end_exit_portal | end_portal_shrine", + description = S("Generate a pre-defined structure near your position."), privs = {debug = true}, func = function(name, param) - local pos= minetest.get_player_by_name(name):getpos() + local pos = minetest.get_player_by_name(name):get_pos() if not pos then return end + pos = vector.round(pos) local errord = false + local message = S("Structure placed.") if param == "village" then mcl_structures.generate_village(pos) - minetest.chat_send_player(name, "Village built.") + message = S("Village built. WARNING: Villages are experimental and might have bugs.") elseif param == "desert_temple" then mcl_structures.generate_desert_temple(pos) - minetest.chat_send_player(name, "Desert temple built.") elseif param == "desert_well" then mcl_structures.generate_desert_well(pos) - minetest.chat_send_player(name, "Desert well built.") elseif param == "igloo" then - mcl_structures.generate_igloo_top(pos) - minetest.chat_send_player(name, "Igloo built.") + mcl_structures.generate_igloo(pos) elseif param == "witch_hut" then mcl_structures.generate_witch_hut(pos) - minetest.chat_send_player(name, "Witch hut built.") elseif param == "boulder" then mcl_structures.generate_boulder(pos) - minetest.chat_send_player(name, "Moss stone boulder placed.") elseif param == "fossil" then mcl_structures.generate_fossil(pos) - minetest.chat_send_player(name, "Fossil placed.") elseif param == "ice_spike_small" then mcl_structures.generate_ice_spike_small(pos) - minetest.chat_send_player(name, "Small ice spike placed.") elseif param == "ice_spike_large" then mcl_structures.generate_ice_spike_large(pos) - minetest.chat_send_player(name, "Large ice spike placed.") + elseif param == "end_exit_portal" then + mcl_structures.generate_end_exit_portal(pos) + elseif param == "end_portal_shrine" then + mcl_structures.generate_end_portal_shrine(pos) elseif param == "" then - minetest.chat_send_player(name, "Error: No structure type given. Please use “/spawnstruct ”.") + message = S("Error: No structure type given. Please use “/spawnstruct ”.") errord = true else - minetest.chat_send_player(name, "Error: Unknown structure type. Please use “/spawnstruct ”.") + message = S("Error: Unknown structure type. Please use “/spawnstruct ”.") errord = true end + minetest.chat_send_player(name, message) if errord then - minetest.chat_send_player(name, "Use /help spawnstruct to see a list of avaiable types.") + minetest.chat_send_player(name, S("Use /help spawnstruct to see a list of avaiable types.")) end end }) - -local time_to_load= os.clock() - init -print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load)) diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.de.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.de.tr new file mode 100644 index 00000000..e701b787 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.de.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.=Erzeugt ein vordefiniertes Gebäude in Ihrer Nähe. +Structure placed.=Gebäude platziert. +Village built. WARNING: Villages are experimental and might have bugs.=Dorf gebaut. ACHTUNG: Dörfer sind experimentell und können fehlerhaft sein. +Error: No structure type given. Please use “/spawnstruct ”.=Fehler: Kein Gebäudetyp angegeben. Bitte benutzen Sie „/spawnstruct “. +Error: Unknown structure type. Please use “/spawnstruct ”.=Fehler: Unbekannter Gebäudetyp. Bitte benutzen Sie „/spawnstruct “. +Use /help spawnstruct to see a list of avaiable types.=Benutzen Sie „/help spawnstruct“, um eine Liste der vorhandenen Typen zu sehen. diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.es.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.es.tr new file mode 100644 index 00000000..ae909b9c --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.es.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.=Genere una estructura predefinida cerca de su posición. +Structure placed.=Estructura colocada. +Village built. WARNING: Villages are experimental and might have bugs.=Pueblo construido. ADVERTENCIA: los pueblos son experimentales y pueden tener errores. +Error: No structure type given. Please use “/spawnstruct ”.=Error: no se especifica ningún tipo de estructura. Utilice "/spawnstruct ". +Error: Unknown structure type. Please use “/spawnstruct ”.=Error: tipo de estructura desconocido. Utilice "/spawnstruct ". +Use /help spawnstruct to see a list of avaiable types.=Utiliza "/help spawnstruct" para ver una lista de los tipos disponibles. diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.fr.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.fr.tr new file mode 100644 index 00000000..7c1ba272 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.fr.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.=Générez une structure prédéfinie près de votre position. +Structure placed.=Structure placée. +Village built. WARNING: Villages are experimental and might have bugs.=Village construit. AVERTISSEMENT: les villages sont expérimentaux et peuvent avoir des bugs. +Error: No structure type given. Please use “/spawnstruct ”.=Erreur: Aucun type de structure indiqué. Veuillez utiliser "/spawnstruct ". +Error: Unknown structure type. Please use “/spawnstruct ”.=Erreur: Type de structure inconnu. Veuillez utiliser "/spawnstruct ". +Use /help spawnstruct to see a list of avaiable types.=Utilisez /help spawnstruct pour voir une liste des types disponibles. diff --git a/mods/MAPGEN/mcl_structures/locale/template.txt b/mods/MAPGEN/mcl_structures/locale/template.txt new file mode 100644 index 00000000..76f85c4c --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.= +Structure placed.= +Village built. WARNING: Villages are experimental and might have bugs.= +Error: No structure type given. Please use “/spawnstruct ”.= +Error: Unknown structure type. Please use “/spawnstruct ”.= +Use /help spawnstruct to see a list of avaiable types.= diff --git a/mods/MAPGEN/mcl_structures/schematics/README.txt b/mods/MAPGEN/mcl_structures/schematics/README.txt deleted file mode 100644 index 346ffbb6..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/README.txt +++ /dev/null @@ -1 +0,0 @@ -IMPORTANT: Only schematics (*.mts) and WorldEdit files (*.we) version 4 are supported at the moment. diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_boulder.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_boulder.mts new file mode 100644 index 00000000..0f4aa6da Binary files /dev/null and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_boulder.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_boulder_small.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_boulder_small.mts new file mode 100644 index 00000000..8340a9fe Binary files /dev/null and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_boulder_small.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_desert_temple.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_desert_temple.mts new file mode 100644 index 00000000..b60bce2d Binary files /dev/null and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_desert_temple.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_desert_temple.we b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_desert_temple.we deleted file mode 100644 index 0fb6c4e5..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_desert_temple.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 0, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 1, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstonecarved", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstonecarved", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstonecarved", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_core:sandstonecarved", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_core:sandstonecarved", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 1, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 1, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 13}, {["y"] = 21, ["x"] = 1, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 2, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 2, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 2, ["name"] = "mcl_colorblocks:hardened_clay_red", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 2, ["name"] = "mcl_colorblocks:hardened_clay_red", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 2, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 2, ["name"] = "mcl_core:sandstonecarved", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 2, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 2, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 2, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 2, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 2, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 22, ["x"] = 2, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 13}, {["y"] = 22, ["x"] = 2, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 3, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 7}, {["y"] = 12, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 7}, {["y"] = 12, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 3, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 3, ["name"] = "mcl_stairs:slab_sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 7}, {["y"] = 13, ["x"] = 3, ["name"] = "mcl_stairs:slab_sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 7}, {["y"] = 13, ["x"] = 3, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 3, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstonecarved", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 3, ["name"] = "mcl_core:sandstonecarved", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 3, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 3, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 3, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 3, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 3, ["name"] = "mcl_core:sandstonecarved", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 3, ["name"] = "mcl_core:sandstonecarved", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 3, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 3, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 3, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 3, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 13}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 13}, {["y"] = 22, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 22, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 22, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 13}, {["y"] = 22, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 22, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 22, ["x"] = 3, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 13}, {["y"] = 23, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 23, ["x"] = 3, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 4, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 4, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 4, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 4, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 4, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 4, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 4, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 4, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 4, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 4, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 4, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 4, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 4, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 22, ["x"] = 4, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 13}, {["y"] = 22, ["x"] = 4, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 5, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 11}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 11}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 5, ["name"] = "mcl_core:sandstone", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 21, ["x"] = 5, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 13}, {["y"] = 21, ["x"] = 5, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 6, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 6, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 6, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 6, ["name"] = "mcl_core:sandstonecarved", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 6, ["name"] = "mcl_core:sandstonecarved", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 6, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 6, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 13}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_stairs:stair_sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 13}, {["y"] = 15, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 6, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 7, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 7, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 8, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 8, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 8, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 8, ["name"] = "mcl_core:sandstonecarved", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 8, ["name"] = "mcl_core:sandstonecarved", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 8, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 8, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 8, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_chests:chest", ["z"] = 10, ["meta"] = {["inventory"] = {["main"] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""}}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sandstonecarved", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sandstonecarved", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 9, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 9, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_tnt:tnt", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_tnt:tnt", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_tnt:tnt", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 10, ["name"] = "mesecons_pressureplates:pressure_plate_stone_off", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 10, ["name"] = "mesecons_pressureplates:pressure_plate_stone_off", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sandstonecarved", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 10, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 10, ["name"] = "mcl_core:sandstonecarved", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 10, ["name"] = "mcl_core:sandstonecarved", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 10, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 10, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_tnt:tnt", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_tnt:tnt", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_tnt:tnt", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_chests:chest", ["z"] = 8, ["meta"] = {["inventory"] = {["main"] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""}}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 11, ["name"] = "mesecons_pressureplates:pressure_plate_stone_off", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_chests:chest", ["z"] = 12, ["meta"] = {["inventory"] = {["main"] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""}}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_colorblocks:hardened_clay_blue", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 11, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 11, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 11, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 11, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_tnt:tnt", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_tnt:tnt", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_tnt:tnt", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 12, ["name"] = "mesecons_pressureplates:pressure_plate_stone_off", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 12, ["name"] = "mesecons_pressureplates:pressure_plate_stone_off", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sandstonecarved", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 12, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 12, ["name"] = "mcl_core:sandstonecarved", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 12, ["name"] = "mcl_core:sandstonecarved", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 12, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 20, ["x"] = 12, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_chests:chest", ["z"] = 10, ["meta"] = {["inventory"] = {["main"] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""}}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sandstonecarved", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sandstonecarved", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 13, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 14, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 16, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 19, ["x"] = 13, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_colorblocks:hardened_clay_orange", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 14, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 14, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 14, ["name"] = "mcl_core:sandstonecarved", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 14, ["name"] = "mcl_core:sandstonecarved", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 14, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 14, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 14, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 16, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 18, ["x"] = 14, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 14, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 16, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 17, ["x"] = 15, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 16, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 16, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 16, ["name"] = "mcl_core:sandstonecarved", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 16, ["name"] = "mcl_core:sandstonecarved", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 14, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 16, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 16, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 16, ["x"] = 16, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 14, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 15, ["x"] = 17, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 18, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 18, ["name"] = "mcl_core:sandstonesmooth", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 18, ["name"] = "mcl_core:sandstonecarved", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 18, ["name"] = "mcl_core:sandstonecarved", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 14, ["x"] = 18, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 19, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 13, ["x"] = 19, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 20, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 12, ["x"] = 20, ["name"] = "mcl_core:sandstone", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 6, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 7, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 8, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 9, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 10, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 11, ["x"] = 21, ["name"] = "mcl_core:sand", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}} diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_end_exit_portal.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_end_exit_portal.mts new file mode 100644 index 00000000..bc24f800 Binary files /dev/null and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_end_exit_portal.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_end_portal_room_simple.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_end_portal_room_simple.mts new file mode 100644 index 00000000..73c327ce Binary files /dev/null and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_end_portal_room_simple.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_1.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_1.mts index d57cb511..a9584ee0 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_1.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_1.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_2.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_2.mts index a17637c8..78269c33 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_2.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_2.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_3.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_3.mts index 76f6ff8d..17e6a615 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_3.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_3.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_4.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_4.mts index bed74c3e..c3be1676 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_4.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_skull_4.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_1.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_1.mts index 64559407..7ec39bac 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_1.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_1.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_2.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_2.mts index dd4ff15e..bafc8899 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_2.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_2.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_3.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_3.mts index d884d742..39809dda 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_3.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_3.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_4.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_4.mts index cf0cb458..2acfefe7 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_4.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_fossil_spine_4.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_large.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_large.mts new file mode 100644 index 00000000..75b08655 Binary files /dev/null and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_large.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_large_top.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_large_top.mts deleted file mode 100644 index 64732492..00000000 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_large_top.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_small.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_small.mts index e7d0282e..7407c8f7 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_small.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ice_spike_small.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_igloo_basement.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_igloo_basement.mts index 8fcd7eb9..c2a774e7 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_igloo_basement.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_igloo_basement.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_igloo_top.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_igloo_top.mts index 3368c16c..e3705236 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_igloo_top.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_igloo_top.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_village.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_village.mts new file mode 100644 index 00000000..cda9bbba Binary files /dev/null and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_village.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_witch_hut.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_witch_hut.mts index d028a8a0..ee5f9673 100644 Binary files a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_witch_hut.mts and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_witch_hut.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/pnj_field_1.we b/mods/MAPGEN/mcl_structures/schematics/pnj_field_1.we deleted file mode 100644 index b9d6026f..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/pnj_field_1.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:water_source", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:water_source", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:water_source", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:water_source", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:water_source", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:water_source", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:water_source", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:wheat_3", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_farming:soil_wet", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_farming:soil_wet", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:water_source", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_farming:soil_wet", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_farming:soil_wet", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_farming:wheat", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_farming:wheat", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_farming:wheat", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_farming:wheat", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}} diff --git a/mods/MAPGEN/mcl_structures/schematics/pnj_house_1.we b/mods/MAPGEN/mcl_structures/schematics/pnj_house_1.we deleted file mode 100644 index 1e99320a..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/pnj_house_1.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "xpanes:pane_natural", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 109}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "xpanes:pane_natural", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}} diff --git a/mods/MAPGEN/mcl_structures/schematics/pnj_house_2.we b/mods/MAPGEN/mcl_structures/schematics/pnj_house_2.we deleted file mode 100644 index 4ef7662e..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/pnj_house_2.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "xpanes:pane_natural", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_fences:fence_23", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_fences:fence_3", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_fences:fence_3", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_fences:fence_3", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 5, ["x"] = 1, ["name"] = "mcl_fences:fence_22", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_fences:fence_32", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 5, ["x"] = 2, ["name"] = "mcl_fences:fence_32", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_fences:fence_32", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 5, ["x"] = 3, ["name"] = "mcl_fences:fence_32", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:ladder", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 4, ["param1"] = 90}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:ladder", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 4, ["param1"] = 107}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:ladder", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 4, ["param1"] = 92}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:ladder", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 4, ["param1"] = 77}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_fences:fence_32", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 5, ["x"] = 4, ["name"] = "mcl_fences:fence_32", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "xpanes:pane_natural", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_fences:fence_13", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 159}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_fences:fence_3", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_fences:fence_3", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_fences:fence_3", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 5, ["x"] = 5, ["name"] = "mcl_fences:fence_12", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}} diff --git a/mods/MAPGEN/mcl_structures/schematics/pnj_house_3.we b/mods/MAPGEN/mcl_structures/schematics/pnj_house_3.we deleted file mode 100644 index d4bb2ba5..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/pnj_house_3.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 3, ["name"] = "xpanes:pane_natural", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 2, ["x"] = 3, ["name"] = "xpanes:pane_natural", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 3, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_core:wood", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:wood", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}} diff --git a/mods/MAPGEN/mcl_structures/schematics/pnj_light.we b/mods/MAPGEN/mcl_structures/schematics/pnj_light.we deleted file mode 100644 index 02c43cb3..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/pnj_light.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 3, ["x"] = 0, ["name"] = "mcl_torches:torch_wall", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_torches:torch_wall", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_wool:black", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_torches:torch_wall", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 3, ["x"] = 2, ["name"] = "mcl_torches:torch_wall", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}} diff --git a/mods/MAPGEN/mcl_structures/schematics/pnj_town_1.we b/mods/MAPGEN/mcl_structures/schematics/pnj_town_1.we deleted file mode 100644 index e7bdcfef..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/pnj_town_1.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:wheat_3", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 3, ["x"] = 12, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 47}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_torches:torch_wall", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_wool:black", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_torches:torch_wall", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:wheat_2", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 138}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 121}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 155}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 170}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 171}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 154}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 138}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 123}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 107}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 92}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 153}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_torches:torch_wall", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_torches:torch_wall", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 6, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 7, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 7, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 121}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 170}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_torches:torch_wall", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 156}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_torches:torch_wall", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_wool:black", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_torches:torch_wall", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_torches:torch_wall", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 173}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "xpanes:pane_natural", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 189}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "xpanes:pane_natural", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_torches:torch_wall", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_torches:torch_wall", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_fences:fence", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_fences:fence", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_fences:fence", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "xpanes:pane_natural", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 22, ["name"] = "xpanes:pane_natural", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_torches:torch_wall", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_wool:black", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_torches:torch_wall", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_torches:torch_wall", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 23, ["name"] = "mcl_torches:torch_wall", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 3, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 23, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 23, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "xpanes:pane_natural", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "xpanes:pane_natural", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 6, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 6, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 25, ["name"] = "mcl_core:tree", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 25, ["name"] = "mcl_torches:torch_wall", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 25, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 4, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 5, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 5, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 6, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 6, ["x"] = 25, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:sprucewood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:sprucewood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 26, ["name"] = "xpanes:pane_natural", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 26, ["name"] = "xpanes:pane_natural", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 26, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 4, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 4, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 5, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 5, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 6, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 6, ["x"] = 26, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 27, ["name"] = "xpanes:pane_natural", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 2, ["x"] = 27, ["name"] = "xpanes:pane_natural", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 27, ["name"] = "mcl_torches:torch_wall", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 27, ["name"] = "mcl_wool:black", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 27, ["name"] = "mcl_torches:torch_wall", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 4, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 4, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 109}, {["y"] = 5, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 5, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 109}, {["y"] = 6, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 6, ["x"] = 27, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 109}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:sprucewood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:sprucewood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "xpanes:pane_natural", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "xpanes:pane_natural", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "xpanes:pane_natural", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 156}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 45}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 77}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 77}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 139}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 29, ["name"] = "xpanes:bar", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 205}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "xpanes:bar", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 109}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 77}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:sprucewood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:sprucewood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:sprucewood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_fences:fence", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 154}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 139}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 173}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 30, ["name"] = "xpanes:bar", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mesecons_pressureplates:pressure_plate_wood_off", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 171}, {["y"] = 2, ["x"] = 30, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_torches:torch_wall", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 189}, {["y"] = 3, ["x"] = 30, ["name"] = "xpanes:bar", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_torches:torch_wall", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 173}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:sprucewood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 31, ["name"] = "xpanes:pane_natural", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "xpanes:pane_natural", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "xpanes:pane_natural", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_torches:torch_wall", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:sprucewood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:sprucewood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:sprucewood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 159}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 32, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 2, ["x"] = 32, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 32, ["name"] = "xpanes:pane_natural", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_torches:torch_wall", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_wool:black", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_torches:torch_wall", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_torches:torch_wall", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:sprucewood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_torches:torch_wall", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 173}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 140}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 156}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "xpanes:pane_natural", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 172}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "xpanes:pane_natural", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_torches:torch_wall", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 173}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 2, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 2, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 173}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 189}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 173}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_torches:torch_wall", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_wool:black", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_torches:torch_wall", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 36, ["name"] = "mcl_torches:torch_wall", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 4, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 37, ["name"] = "mcl_torches:torch_wall", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 3, ["x"] = 37, ["name"] = "mcl_torches:torch_wall", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 173}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 172}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 188}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 140}, {["y"] = 2, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 156}, {["y"] = 2, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 172}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 156}, {["y"] = 3, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 172}, {["y"] = 3, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 188}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_torches:torch_wall", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_wool:black", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_torches:torch_wall", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_torches:torch_wall", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_wool:black", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_torches:torch_wall", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 173}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "crafting:workbench", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 187}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 173}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 189}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_torches:torch_wall", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_torches:torch_wall", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_torches:torch_wall", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_torches:torch_wall", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 61}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 61}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 2, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 40, ["name"] = "mcl_torches:torch_wall", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 61}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 45}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 45}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 61}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_fences:fence", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 104}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_fences:fence", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 138}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 155}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 41, ["name"] = "mesecons_pressureplates:pressure_plate_wood_off", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 121}, {["y"] = 2, ["x"] = 41, ["name"] = "mesecons_pressureplates:pressure_plate_wood_off", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 155}, {["y"] = 2, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 89}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 106}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 122}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 138}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "xpanes:pane_natural", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 124}, {["y"] = 2, ["x"] = 43, ["name"] = "xpanes:pane_natural", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 108}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 108}, {["y"] = 2, ["x"] = 43, ["name"] = "xpanes:pane_natural", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 124}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 4, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 4, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 4, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 4, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 4, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 4, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 4, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 4, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 4, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}} diff --git a/mods/MAPGEN/mcl_structures/schematics/pnj_town_withway_1.we b/mods/MAPGEN/mcl_structures/schematics/pnj_town_withway_1.we deleted file mode 100644 index 73eb4932..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/pnj_town_withway_1.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 3, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 15}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 5, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 5, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 6, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 15}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 6, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 6, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 7, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 7, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 7, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 8, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:water_source", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 8, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 8, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 9, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 9, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 10, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 10, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 11, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_farming:soil_wet", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 11, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 11, ["name"] = "mcl_farming:wheat", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 12, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_farming:soil_wet", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 12, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_farming:wheat_3", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 12, ["name"] = "mcl_farming:wheat", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 4, ["x"] = 12, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 13, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 47}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:water_source", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 13, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 13, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 13, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_torches:torch_wall", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_wool:black", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 13, ["name"] = "mcl_torches:torch_wall", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 14, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_farming:soil_wet", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 31}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_farming:wheat", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 14, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 7, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 14, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 8, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 14, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 15, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_farming:soil_wet", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_farming:wheat", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_farming:wheat_2", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 138}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 121}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 155}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 170}, {["y"] = 3, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 171}, {["y"] = 4, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 154}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 138}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 123}, {["y"] = 7, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 107}, {["y"] = 8, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 92}, {["y"] = 9, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:ladder", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 10, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 15, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 16, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 153}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 16, ["name"] = "mcl_torches:torch_wall", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_torches:torch_wall", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 7, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 8, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 8, ["x"] = 16, ["name"] = "xpanes:pane_natural", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 16, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 17, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 121}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 170}, {["y"] = 3, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_torches:torch_wall", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 17, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 18, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 156}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_torches:torch_wall", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_wool:black", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_torches:torch_wall", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 18, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 7, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 18, ["name"] = "xpanes:pane_natural", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 8, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 9, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 10, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 11, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 12, ["x"] = 18, ["name"] = "mcl_core:cobble", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 19, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:dirt", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:dirt", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:dirt", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 19, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_torches:torch_wall", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 19, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 20, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:dirt", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:dirt", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:dirt", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 173}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "xpanes:pane_natural", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 189}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "xpanes:pane_natural", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_torches:torch_wall", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 20, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 20, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 21, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:dirt", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 21, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_torches:torch_wall", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 21, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 22, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_fences:fence", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:dirt", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:dirt", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:dirt", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_fences:fence", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_fences:fence", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "xpanes:pane_natural", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 22, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 22, ["name"] = "xpanes:pane_natural", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_torches:torch_wall", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_wool:black", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_torches:torch_wall", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:cobble", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_torches:torch_wall", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 22, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 23, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 23, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 23, ["name"] = "mcl_core:dirt", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 23, ["name"] = "mcl_core:dirt", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 23, ["name"] = "mcl_core:dirt", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 23, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 23, ["name"] = "mcl_torches:torch_wall", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 4, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 23, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 23, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 23, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 24, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "xpanes:pane_natural", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 24, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "xpanes:pane_natural", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 24, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 6, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 7, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 7, ["x"] = 24, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 24, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 25, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 25, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 25, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 25, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 25, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 25, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 25, ["name"] = "mcl_core:tree", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 25, ["name"] = "mcl_torches:torch_wall", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 25, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 25, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 5, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 6, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 6, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 7, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 7, ["x"] = 25, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 25, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 26, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:sprucewood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:sprucewood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 26, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 26, ["name"] = "xpanes:pane_natural", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 26, ["name"] = "xpanes:pane_natural", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 4, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 26, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 26, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 5, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 5, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 6, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 6, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 7, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 7, ["x"] = 26, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 26, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 125}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 27, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 29}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 27, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 47}, {["y"] = 2, ["x"] = 27, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 27, ["name"] = "xpanes:pane_natural", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 3, ["x"] = 27, ["name"] = "xpanes:pane_natural", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 3, ["x"] = 27, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 4, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 27, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 27, ["name"] = "mcl_torches:torch_wall", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 27, ["name"] = "mcl_wool:black", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 27, ["name"] = "mcl_torches:torch_wall", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 5, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 5, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 109}, {["y"] = 6, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 6, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 109}, {["y"] = 7, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 7, ["x"] = 27, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 27, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 109}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 28, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:sprucewood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:sprucewood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 1, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 28, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "xpanes:pane_natural", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "xpanes:pane_natural", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "xpanes:pane_natural", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 156}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 28, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 28, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 6, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 7, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 7, ["x"] = 28, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 28, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 45}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 77}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 77}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:water_source", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 139}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 29, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 3, ["x"] = 29, ["name"] = "xpanes:pane_iron_5", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 205}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "xpanes:pane_iron_5", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 109}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 29, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 7, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 7, ["x"] = 29, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 29, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 77}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:sprucewood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:sprucewood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:sprucewood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 141}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_fences:fence", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 154}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 139}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 173}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 63}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 30, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 3, ["x"] = 30, ["name"] = "xpanes:pane_iron_4", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mesecons_pressureplates:pressure_plate_wood_off", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 171}, {["y"] = 3, ["x"] = 30, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_torches:torch_wall", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 30, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 189}, {["y"] = 4, ["x"] = 30, ["name"] = "xpanes:pane_iron_4", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_torches:torch_wall", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 173}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 30, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 7, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 7, ["x"] = 30, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 30, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 93}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 31, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:sprucewood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 31, ["name"] = "xpanes:pane_natural", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "xpanes:pane_natural", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "xpanes:pane_natural", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_torches:torch_wall", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 31, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 7, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 7, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 7, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 7, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 31, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 7, ["x"] = 31, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:sprucewood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:sprucewood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:sprucewood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 159}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 32, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 3, ["x"] = 32, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 32, ["name"] = "xpanes:pane_natural", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_fences:fence", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_torches:torch_wall", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_wool:black", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_torches:torch_wall", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_torches:torch_wall", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 6, ["x"] = 32, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 7, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 7, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 7, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 7, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 7, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 7, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 7, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 7, ["x"] = 32, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:sprucewood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:sprucewood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:sprucewood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:sprucewood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 143}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_torches:torch_wall", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_torches:torch_wall", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 109}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 173}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 33, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 34, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_farming:soil_wet", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_farming:soil_wet", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:water_source", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_farming:soil_wet", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_farming:soil_wet", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 140}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_farming:wheat", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 95}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_farming:wheat", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 79}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_farming:wheat", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 111}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_farming:wheat", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 127}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 156}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "xpanes:pane_natural", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 172}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "xpanes:pane_natural", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_fences:fence", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_torches:torch_wall", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:wood", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 173}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 34, ["name"] = "mcl_core:tree", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 6, ["x"] = 34, ["name"] = "mcl_stairs:slab_stone", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 77}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 35, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 1, ["x"] = 35, ["name"] = "mcl_core:tree", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 3, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 173}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 189}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 173}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 157}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 125}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_stairs:stair_wood", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 141}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_fences:fence", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 141}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_torches:torch_wall", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_wool:black", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 35, ["name"] = "mcl_torches:torch_wall", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 5, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 35, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:water_source", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 57}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:water_source", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 41}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 36, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 36, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 36, ["name"] = "mcl_torches:torch_wall", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 5, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 36, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:water_source", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 73}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:water_source", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 57}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 37, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 37, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 1, ["x"] = 37, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 1, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 37, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_torches:torch_wall", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 4, ["x"] = 37, ["name"] = "mcl_torches:torch_wall", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 15}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 173}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 37, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 38, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 38, ["name"] = "mcl_stairs:stair_cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 172}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 188}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 140}, {["y"] = 3, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 156}, {["y"] = 3, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 172}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 156}, {["y"] = 4, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 172}, {["y"] = 4, ["x"] = 38, ["name"] = "xpanes:pane_natural", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 188}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_torches:torch_wall", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_wool:black", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_torches:torch_wall", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_torches:torch_wall", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 15}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_wool:black", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_torches:torch_wall", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 15}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 4, ["x"] = 38, ["name"] = "mcl_fences:fence", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 38, ["name"] = "mcl_core:cobble", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 6, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 6, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 6, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 6, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 6, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 6, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 6, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 157}, {["y"] = 6, ["x"] = 38, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 173}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:gravel", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "crafting:workbench", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 187}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_doors:wooden_door_b_1", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 173}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_doors:wooden_door_t_1", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 189}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_torches:torch_wall", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_torches:torch_wall", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_torches:torch_wall", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_torches:torch_wall", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 15}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 39, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 7, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 7, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 7, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 61}, {["y"] = 7, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 61}, {["y"] = 7, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 7, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 7, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 7, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 125}, {["y"] = 7, ["x"] = 39, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 141}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 125}, {["y"] = 3, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 4, ["x"] = 40, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 189}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_torches:torch_wall", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 40, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 40, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 8, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 8, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 61}, {["y"] = 8, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 45}, {["y"] = 8, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 45}, {["y"] = 8, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 61}, {["y"] = 8, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 77}, {["y"] = 8, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 93}, {["y"] = 8, ["x"] = 40, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 109}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_fences:fence", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 104}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_fences:fence", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 138}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 155}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 41, ["name"] = "mesecons_pressureplates:pressure_plate_wood_off", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 121}, {["y"] = 3, ["x"] = 41, ["name"] = "mesecons_pressureplates:pressure_plate_wood_off", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 155}, {["y"] = 3, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 3, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 3, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 157}, {["y"] = 4, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 4, ["x"] = 41, ["name"] = "xpanes:pane_natural", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 173}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 41, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 7, ["x"] = 41, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 8, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 8, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 8, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 8, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 8, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 8, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 8, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 8, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 8, ["x"] = 41, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 89}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 106}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 122}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 138}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_books:bookshelf", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 2, ["param1"] = 0}, {["y"] = 5, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 6, ["x"] = 42, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 7, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 7, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 7, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 7, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 7, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 7, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 7, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 7, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 7, ["x"] = 42, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 43, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "xpanes:pane_natural", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 124}, {["y"] = 3, ["x"] = 43, ["name"] = "xpanes:pane_natural", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 108}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "xpanes:pane_natural", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 108}, {["y"] = 3, ["x"] = 43, ["name"] = "xpanes:pane_natural", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 124}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 3, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:cobble", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 5, ["x"] = 43, ["name"] = "mcl_core:tree", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 1, ["param1"] = 0}, {["y"] = 6, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 6, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 6, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 6, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 6, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 29}, {["y"] = 6, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 6, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 6, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 6, ["x"] = 43, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 14, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 15, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 16, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 17, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 18, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 19, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 20, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 21, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 22, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 23, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 24, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 25, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 26, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 27, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 28, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 29, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 30, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 31, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 32, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 33, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 34, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 35, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 36, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 37, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 38, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 39, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 40, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 41, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 42, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 43, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 44, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 45, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 46, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 47, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 48, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 49, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 50, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 51, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 52, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 53, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 54, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 55, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 56, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 57, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 58, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 44, ["name"] = "mcl_core:dirt_with_grass", ["z"] = 59, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 5, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 5, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 6, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 5, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 7, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 5, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 8, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 5, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 9, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 45}, {["y"] = 5, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 10, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 61}, {["y"] = 5, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 11, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 5, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 12, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 77}, {["y"] = 5, ["x"] = 44, ["name"] = "mcl_stairs:stair_wood", ["z"] = 13, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 3, ["param1"] = 93}} diff --git a/mods/MAPGEN/mcl_structures/schematics/pnj_watersource.we b/mods/MAPGEN/mcl_structures/schematics/pnj_watersource.we deleted file mode 100644 index a9da7ce4..00000000 --- a/mods/MAPGEN/mcl_structures/schematics/pnj_watersource.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:gravel", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:gravel", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:gravel", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:gravel", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:gravel", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 0, ["name"] = "mcl_core:gravel", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:gravel", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:gravel", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:gravel", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_core:gravel", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_fences:fence", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 93}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 3, ["x"] = 1, ["name"] = "mcl_fences:fence", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 109}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:gravel", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:water_source", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 10}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:water_source", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 26}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 2, ["name"] = "mcl_core:gravel", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:water_source", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 27}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:water_source", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 240, ["param1"] = 43}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:gravel", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:water_source", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 10}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:water_source", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 10}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 3, ["name"] = "mcl_core:gravel", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:water_source", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 11}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:water_source", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 27}, {["y"] = 1, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:gravel", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:gravel", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:gravel", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 4, ["name"] = "mcl_core:gravel", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 1, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 2, ["x"] = 4, ["name"] = "mcl_fences:fence", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 45}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_fences:fence", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 13}, {["y"] = 3, ["x"] = 4, ["name"] = "mcl_fences:fence", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 61}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "mcl_core:cobble", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:gravel", ["z"] = 0, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:gravel", ["z"] = 1, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:gravel", ["z"] = 2, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:gravel", ["z"] = 3, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:gravel", ["z"] = 4, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}, {["y"] = 0, ["x"] = 5, ["name"] = "mcl_core:gravel", ["z"] = 5, ["meta"] = {["inventory"] = {}, ["fields"] = {}}, ["param2"] = 0, ["param1"] = 0}} diff --git a/mods/MAPGEN/modpack.conf b/mods/MAPGEN/modpack.conf new file mode 100644 index 00000000..eb9c54ab --- /dev/null +++ b/mods/MAPGEN/modpack.conf @@ -0,0 +1,2 @@ +name = MAPGEN +description = Meta-modpack containing map generating mods for MineClone 2 diff --git a/mods/MAPGEN/modpack.txt b/mods/MAPGEN/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/MAPGEN/tsm_railcorridors/README.md b/mods/MAPGEN/tsm_railcorridors/README.md index 33e2abe6..de9df489 100644 --- a/mods/MAPGEN/tsm_railcorridors/README.md +++ b/mods/MAPGEN/tsm_railcorridors/README.md @@ -1,11 +1,10 @@ # Railway corridors [`tsm_railcorridors`] MineClone 2 adaption. NO TREASURER SUPPORT! -* Current version 0.12.0 +* Current version 0.14.0 -Minetest mod for adding underground corridors with rails and wood constructions with -a few treasure chests now and then. Optional Treasurer support is available for adding -treasures from various mods. +Minetest mod for adding underground corridors with rails and wood constructions with a few treasure chests now and then. +Optional support for the Treasurer mod is available for adding treasures from various mods. Cobwebs are added if the `mobs_monster` mod is found. Use the advanced settings to finetune the railway corridors. @@ -13,6 +12,6 @@ Use the advanced settings to finetune the railway corridors. * Forum thread: https://forum.minetest.net/viewtopic.php?t=10339 * License: MIT License. -## Info for modders -Want to include this mod in a subgame, but you hate the dependencies? -You can edit the node names in gameconfig.lua to fit your needs. :-) +## Info for game makers +Want to include this mod in a game, but you have problems with the dependencies? +Edit `gameconfig.lua` to fit your needs. :-) diff --git a/mods/MAPGEN/tsm_railcorridors/depends.txt b/mods/MAPGEN/tsm_railcorridors/depends.txt index 3bd882cd..a22565d7 100644 --- a/mods/MAPGEN/tsm_railcorridors/depends.txt +++ b/mods/MAPGEN/tsm_railcorridors/depends.txt @@ -1,5 +1,5 @@ mcl_init -mcl_util +mcl_worlds mcl_core mcl_loot mcl_tnt diff --git a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua index c048fe57..615abdc8 100644 --- a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua +++ b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua @@ -1,4 +1,4 @@ --- This file stores the various node types. This makes it easier to plug this mod into subgames +-- This file stores the various node types. This makes it easier to plug this mod into games -- in which you need to change the node names. -- Adapted for MineClone 2! @@ -12,15 +12,30 @@ tsm_railcorridors.nodes = { torch_wall = "mcl_torches:torch_wall", cobweb = "mcl_core:cobweb", spawner = "mcl_mobspawners:spawner", +} +local mg_name = minetest.get_mapgen_setting("mg_name") + +if mg_name == "v6" then + -- In v6, wood is chosen randomly. --[[ Wood types for the corridors. Corridors are made out of full wood blocks and posts. For each corridor system, a random wood type is chosen with the chance specified in per mille. ]] - corridor_woods = { + tsm_railcorridors.nodes.corridor_woods = { { wood = "mcl_core:wood", post = "mcl_fences:fence", chance = 900}, { wood = "mcl_core:darkwood", post = "mcl_fences:dark_oak_fence", chance = 100}, - }, -} + } +else + -- This generates dark oak wood in mesa biomes and oak wood everywhere else. + tsm_railcorridors.nodes.corridor_woods_function = function(pos, node) + if minetest.get_item_group(node.name, "hardened_clay") ~= 0 then + return "mcl_core:darkwood", "mcl_fences:dark_oak_fence" + else + return "mcl_core:wood", "mcl_fences:fence" + end + end +end + -- TODO: Use minecart with chest instead of normal minecart tsm_railcorridors.carts = { "mcl_minecarts:minecart" } @@ -38,23 +53,23 @@ end -- All spawners spawn cave spiders function tsm_railcorridors.on_construct_spawner(pos) - mcl_mobspawners.setup_spawner(pos, "mobs_mc:cave_spider") + mcl_mobspawners.setup_spawner(pos, "mobs_mc:cave_spider", 0, 7) end -- MineClone 2's treasure function. Gets all treasures for a single chest. -- Based on information from Minecraft Wiki. function tsm_railcorridors.get_treasures(pr) - local items = mcl_loot.get_multi_loot({ + local loottable = { { stacks_min = 1, stacks_max = 1, items = { - { itemstring = "mobs:nametag", weight = 30 }, + { itemstring = "mcl_mobs:nametag", weight = 30 }, { itemstring = "mcl_core:apple_gold", weight = 20 }, { itemstring = "mcl_books:book", weight = 10 }, -- TODO: Enchanted Book { itemstring = "", weight = 5}, { itemstring = "mcl_core:pick_iron", weight = 5 }, - { itemstring = "mcl:core:apple_gold", weight = 1 }, -- TODO: Enchanted Golden Apple + { itemstring = "mcl_core:apple_gold", weight = 1 }, -- TODO: Enchanted Golden Apple } }, { @@ -79,11 +94,35 @@ function tsm_railcorridors.get_treasures(pr) items = { { itemstring = "mcl_minecarts:rail", weight = 20, amount_min = 4, amount_max = 8 }, { itemstring = "mcl_torches:torch", weight = 15, amount_min = 1, amount_max = 16 }, - { itemstring = "mcl_minecarts:rail", weight = 5, amount_min = 1, amount_max = 4 }, -- TODO: Activator Rail - { itemstring = "mcl_minecarts:rail", weight = 5, amount_min = 1, amount_max = 4 }, -- TODO: Detector Rail + { itemstring = "mcl_minecarts:activator_rail", weight = 5, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_minecarts:detector_rail", weight = 5, amount_min = 1, amount_max = 4 }, { itemstring = "mcl_minecarts:golden_rail", weight = 5, amount_min = 1, amount_max = 4 }, } - }}, pr) + }, + -- non-MC loot: 50% chance to add a minecart, offered as alternative to spawning minecarts on rails. + -- TODO: Remove this when minecarts spawn on rails. + { + stacks_min = 0, + stacks_max = 1, + items = { + { itemstring = "mcl_minecarts:minecart", weight = 1 }, + } + } + } + + -- Bonus loot for v6 mapgen: Otherwise unobtainable saplings. + if mg_name == "v6" then + table.insert(loottable, { + stacks_min = 1, + stacks_max = 3, + items = { + { itemstring = "mcl_core:darksapling", weight = 1, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_core:birchsapling", weight = 1, amount_min = 1, amount_max = 2 }, + { itemstring = "", weight = 6 }, + }, + }) + end + local items = mcl_loot.get_multi_loot(loottable, pr) return items end diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index ad0d0c27..3cc0d75d 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -12,15 +12,13 @@ local P = function (float) return math.floor(32767 * float) end --- Wahrscheinlichkeit für jeden Chunk, solche Gänge mit Schienen zu bekommen --- Probability for every newly generated chunk to get corridors -local probability_railcaves_in_chunk = P(0.3) -setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_railcaves_in_chunk")) +-- Probability for every newly generated mapchunk to get corridors +local probability_railcaves_in_mapchunk = P(0.33333) +setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_railcaves_in_mapchunk")) if setting then - probability_railcaves_in_chunk = P(setting) + probability_railcaves_in_mapchunk = P(setting) end --- Innerhalb welcher Parameter soll sich die Pfadlänge bewegen? (Forks heben den Maximalwert auf) -- Minimal and maximal value of path length (forks don't look up this value) local way_min = 4; local way_max = 7; @@ -33,7 +31,6 @@ if setting then way_max = setting end --- Wahrsch. für jeden geraden Teil eines Korridors, Fackeln zu bekommen -- Probability for every horizontal part of a corridor to be with torches local probability_torches_in_segment = P(0.5) setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_torches_in_segment")) @@ -41,7 +38,6 @@ if setting then probability_torches_in_segment = P(setting) end --- Wahrsch. für jeden Teil eines Korridors, nach oben oder nach unten zu gehen -- Probability for every part of a corridor to go up or down local probability_up_or_down = P(0.2) setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_up_or_down")) @@ -49,7 +45,6 @@ if setting then probability_up_or_down = P(setting) end --- Wahrscheinlichkeit für jeden Teil eines Korridors, sich zu verzweigen – vorsicht, wenn fast jeder Gang sich verzweigt, kann der Algorithums unlösbar werden und MT hängt sich auf -- Probability for every part of a corridor to fork – caution, too high values may cause MT to hang on. local probability_fork = P(0.04) setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_fork")) @@ -57,7 +52,6 @@ if setting then probability_fork = P(setting) end --- Wahrscheinlichkeit für jeden geraden Teil eines Korridors eine Kiste zu enthalten -- Probability for every part of a corridor to contain a chest local probability_chest = P(0.05) setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_chest")) @@ -100,32 +94,54 @@ if mcl_vars.mg_lava then else height_min = mcl_vars.mg_bedrock_overworld_max + 2 end -local height_max = mcl_util.layer_to_y(60) +local height_max = mcl_worlds.layer_to_y(60) -- Chaos Mode: If enabled, rail corridors don't stop generating when hitting obstacles local chaos_mode = minetest.settings:get_bool("tsm_railcorridors_chaos") or false --- Parameter Ende +-- End of parameters --- Random generators -local pr, webperlin_major, webperlin_minor -local pr_initialized = false +if not tsm_railcorridors.nodes.corridor_woods_function then + local accumulated_chance = 0 + for w=1, #tsm_railcorridors.nodes.corridor_woods do + accumulated_chance = accumulated_chance + tsm_railcorridors.nodes.corridor_woods[w].chance + end + assert(accumulated_chance == 1000, "Rail corridor wood chances add up to "..accumulated_chance.." per mille! (should be 1000 per mille)") +end + +-- Random Perlin noise generators +local pr, pr_carts, pr_treasures, pr_deco, webperlin_major, webperlin_minor local function InitRandomizer(seed) -- Mostly used for corridor gen. pr = PseudoRandom(seed) + -- Dirt room decorations + pr_deco = PseudoRandom(seed+25) + -- Separate randomizer for carts because spawning carts is very timing-dependent + pr_carts = PseudoRandom(seed-654) + -- Chest contents randomizer + pr_treasures = PseudoRandom(seed+777) -- Used for cobweb generation, both noises have to reach a high value for cobwebs to appear webperlin_major = PerlinNoise(934, 3, 0.6, 500) webperlin_minor = PerlinNoise(834, 3, 0.6, 50) - pr_initialized = true end +local carts_table = {} + +local dirt_room_coords + +-- Returns true if pos is inside the dirt room of the current corridor system +local function IsInDirtRoom(pos) + local min = dirt_room_coords.min + local max = dirt_room_coords.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 -- Checks if the mapgen is allowed to carve through this structure and only sets -- the node if it is allowed. Does never build in liquids. -- If check_above is true, don't build if the node above is attached (e.g. rail) -- or a liquid. -local function SetNodeIfCanBuild(pos, node, check_above) +local function SetNodeIfCanBuild(pos, node, check_above, can_replace_rail) if check_above then local abovename = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name local abovedef = minetest.registered_nodes[abovename] @@ -138,8 +154,13 @@ local function SetNodeIfCanBuild(pos, node, check_above) end local name = minetest.get_node(pos).name local def = minetest.registered_nodes[name] - if name ~= "unknown" and name ~= "ignore" and def.is_ground_content and - (def.liquidtype == "none" or name == tsm_railcorridors.nodes.cobweb) then + if name ~= "unknown" and name ~= "ignore" and + ((def.is_ground_content and def.liquidtype == "none") or + name == tsm_railcorridors.nodes.cobweb or + name == tsm_railcorridors.nodes.torch_wall or + name == tsm_railcorridors.nodes.torch_floor or + (can_replace_rail and name == tsm_railcorridors.nodes.rail) + ) then minetest.set_node(pos, node) return true else @@ -169,8 +190,9 @@ end -- Returns true if rails are allowed to be placed on top of this node local function IsRailSurface(pos) local nodename = minetest.get_node(pos).name + local nodename_above = minetest.get_node({x=pos.x,y=pos.y+2,z=pos.z}).name local nodedef = minetest.registered_nodes[nodename] - return nodename ~= "unknown" and nodename ~= "ignore" and nodedef.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") + return nodename ~= "unknown" and nodename ~= "ignore" and nodedef.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") and nodename_above ~= tsm_railcorridors.nodes.rail end -- Checks if the node is empty space which requires to be filled by a platform @@ -178,36 +200,91 @@ local function NeedsPlatform(pos) local node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) local node2 = minetest.get_node({x=pos.x,y=pos.y-2,z=pos.z}) local nodedef = minetest.registered_nodes[node.name] - return node.name ~= "ignore" and node.name ~= "unknown" and nodedef.is_ground_content and ((nodedef.walkable == false and node2.name ~= tsm_railcorridors.nodes.dirt) or (nodedef.groups and nodedef.groups.falling_node)) + local falling = minetest.get_item_group(node.name, "falling_node") == 1 + return + -- Node can be replaced if ground content or rail + (node.name ~= "ignore" and node.name ~= "unknown" and nodedef.is_ground_content) and + -- Node needs platform if node below is not walkable. + -- Unless 2 nodes below there is dirt: This is a special case for the starter cube. + ((nodedef.walkable == false and node2.name ~= tsm_railcorridors.nodes.dirt) or + -- Falling nodes always need to be replaced by a platform, we want a solid and safe ground + falling), + -- second return value + falling end -- Create a cube filled with the specified nodes -- Specialties: --- * Avoids floating rails for non-solid nodes like air +-- * Avoids floating rails +-- * May cut into wood structures of the corridors (alongside with their torches) +-- Arguments: +-- * p: Center position +-- * radius: How many nodes from the center the cube will extend +-- * node: Node to set +-- * replace_air_only: If true, only air can be replaced +-- * wood, post: Wood and post nodes of the railway corridor to cut into (optional) + -- Returns true if all nodes could be set -- Returns false if setting one or more nodes failed -local function Cube(p, radius, node, replace_air_only) +local function Cube(p, radius, node, replace_air_only, wood, post) local y_top = p.y+radius local nodedef = minetest.registered_nodes[node.name] local solid = nodedef.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") and nodedef.liquidtype == "none" -- Check if all the nodes could be set local built_all = true - for zi = p.z-radius, p.z+radius do - for yi = y_top, p.y-radius, -1 do - for xi = p.x-radius, p.x+radius do + + -- If wood has been removed, remod + local cleanup_torches = {} + for xi = p.x-radius, p.x+radius do + for zi = p.z-radius, p.z+radius do + local column_last_attached = nil + for yi = y_top, p.y-radius, -1 do local ok = false - if not solid and yi == y_top then - local topdef = minetest.registered_nodes[minetest.get_node({x=xi,y=yi+1,z=zi}).name] - if not (topdef.groups and topdef.groups.attached_node) and topdef.liquidtype == "none" then + local thisnode = minetest.get_node({x=xi,y=yi,z=zi}) + if not solid then + if yi == y_top then + local topnode = minetest.get_node({x=xi,y=yi+1,z=zi}) + local topdef = minetest.registered_nodes[topnode.name] + if minetest.get_item_group(topnode.name, "attached_node") ~= 1 and topdef.liquidtype == "none" then + ok = true + end + elseif column_last_attached and yi == column_last_attached - 1 then + ok = false + else ok = true end + if minetest.get_item_group(thisnode.name, "attached_node") == 1 then + column_last_attached = yi + end else ok = true end local built = false if ok then if replace_air_only ~= true then - built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, node) + -- Cut into wood structures (post/wood) + if post and (xi == p.x or zi == p.z) and thisnode.name == post then + minetest.set_node({x=xi,y=yi,z=zi}, node) + built = true + elseif wood and (xi == p.x or zi == p.z) and thisnode.name == wood then + local topnode = minetest.get_node({x=xi,y=yi+1,z=zi}) + local topdef = minetest.registered_nodes[topnode.name] + if topdef.walkable and topnode.name ~= wood then + minetest.set_node({x=xi,y=yi,z=zi}, node) + -- Check for torches around the wood and schedule them + -- for removal + if node.name == "air" then + table.insert(cleanup_torches, {x=xi+1,y=yi,z=zi}) + table.insert(cleanup_torches, {x=xi-1,y=yi,z=zi}) + table.insert(cleanup_torches, {x=xi,y=yi,z=zi+1}) + table.insert(cleanup_torches, {x=xi,y=yi,z=zi-1}) + end + built = true + end + -- Set node normally + else + built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, node) + end else if minetest.get_node({x=xi,y=yi,z=zi}).name == "air" then built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, node) @@ -220,15 +297,74 @@ local function Cube(p, radius, node, replace_air_only) end end end + -- Remove torches we have detected before + for c=1, #cleanup_torches do + local check = minetest.get_node(cleanup_torches[c]) + if check.name == tsm_railcorridors.nodes.torch_wall or check.name == tsm_railcorridors.nodes.torch_floor then + minetest.set_node(cleanup_torches[c], node) + end + end return built_all end -local function Platform(p, radius, node) +local function DirtRoom(p, radius, height, dirt_mode, decorations_mode) + local y_bottom = p.y + local y_top = y_bottom + height + 1 + dirt_room_coords = { + min = { x = p.x-radius, y = y_bottom, z = p.z-radius }, + max = { x = p.x+radius, y = y_top, z = p.z+radius }, + } + local built_all = true + for xi = p.x-radius, p.x+radius do + for zi = p.z-radius, p.z+radius do + for yi = y_top, y_bottom, -1 do + local thisnode = minetest.get_node({x=xi,y=yi,z=zi}) + local built = false + if xi == p.x-radius or xi == p.x+radius or zi == p.z-radius or zi == p.z+radius or yi == y_bottom or yi == y_top then + if dirt_mode == 1 or yi == y_bottom then + built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, {name=tsm_railcorridors.nodes.dirt}) + elseif (dirt_mode == 2 or dirt_mode == 3) and yi == y_top then + if minetest.get_item_group(thisnode.name, "falling_node") == 1 then + built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, {name=tsm_railcorridors.nodes.dirt}) + end + end + else + if yi == y_bottom + 1 then + -- crazy rails + if decorations_mode == 1 then + local r = pr_deco:next(1,3) + if r == 2 then + built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, {name=tsm_railcorridors.nodes.rail}) + end + end + end + if not built then + built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, {name="air"}) + end + end + if not built then + built_all = false + end + end + end + end + return built_all +end + +local function Platform(p, radius, node, node2) + -- node2 is secondary platform material for replacing falling nodes + if not node2 then + node2 = { name = tsm_railcorridors.nodes.dirt } + end for zi = p.z-radius, p.z+radius do for xi = p.x-radius, p.x+radius do - local np = NeedsPlatform({x=xi,y=p.y,z=zi}) + local np, np2 = NeedsPlatform({x=xi,y=p.y,z=zi}) if np then - minetest.set_node({x=xi,y=p.y-1,z=zi}, node) + if np2 then + minetest.set_node({x=xi,y=p.y-1,z=zi}, node2) + else + minetest.set_node({x=xi,y=p.y-1,z=zi}, node) + end end end end @@ -240,43 +376,29 @@ local function PlaceChest(pos, param2) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local items = tsm_railcorridors.get_treasures(pr) - for i=1, math.min(#items, inv:get_size("main")) do - inv:set_stack("main", i, ItemStack(items[i])) - end + mcl_loot.fill_inventory(inv, "main", items) end end -- This function checks if a cart has ACTUALLY been spawned. --- If not, it tries to spawn it again, and again, until it succeeded or --- it failed too often. -- To be calld by minetest.after. --- This is a HORRIBLE workaround thanks to the fact that minetest.add_entity is unreliable as fuck +-- This is a workaround thanks to the fact that minetest.add_entity is unreliable as fuck -- See: https://github.com/minetest/minetest/issues/4759 -- FIXME: Kill this horrible hack with fire as soon you can. local function RecheckCartHack(params) local pos = params[1] local cart_id = params[2] - local tries = params[3] - tries = tries - 1 -- Find cart for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do if obj ~= nil and obj:get_luaentity().name == cart_id then -- Cart found! We can now safely call the callback func. -- (calling it earlier has the danger of failing) + minetest.log("info", "[tsm_railcorridors] Cart spawn succeeded: "..minetest.pos_to_string(pos)) tsm_railcorridors.on_construct_cart(pos, obj) return end end - if tries <= 0 then - -- Abort if too many tries to avoid excessive function calls - return - end - -- No cart found! :-( Try again … - if minetest.get_node(pos).name == tsm_railcorridors.nodes.rail then - minetest.add_entity(pos, cart_id) - minetest.after(5, RecheckCartHack, {pos, cart_id, tries}) - end - -- The rail may have been destroyed in the meantime, that's why the node is checked. + minetest.log("info", "[tsm_railcorridors] Cart spawn FAILED: "..minetest.pos_to_string(pos)) end -- Try to place a cobweb. @@ -315,27 +437,108 @@ local function TryPlaceCobweb(pos, needs_check, side_vector) return false end end - -local function WoodBulk(pos, wood) - SetNodeIfCanBuild({x=pos.x+1, y=pos.y, z=pos.z+1}, {name=wood}) - SetNodeIfCanBuild({x=pos.x-1, y=pos.y, z=pos.z+1}, {name=wood}) - SetNodeIfCanBuild({x=pos.x+1, y=pos.y, z=pos.z-1}, {name=wood}) - SetNodeIfCanBuild({x=pos.x-1, y=pos.y, z=pos.z-1}, {name=wood}) + +-- 4 wooden pillars around pos at height +local function WoodBulk(pos, height, wood) + for y=0, height-1 do + SetNodeIfCanBuild({x=pos.x+1, y=pos.y+y, z=pos.z+1}, {name=wood}, false, true) + SetNodeIfCanBuild({x=pos.x-1, y=pos.y+y, z=pos.z+1}, {name=wood}, false, true) + SetNodeIfCanBuild({x=pos.x+1, y=pos.y+y, z=pos.z-1}, {name=wood}, false, true) + SetNodeIfCanBuild({x=pos.x-1, y=pos.y+y, z=pos.z-1}, {name=wood}, false, true) + end end --- Gänge mit Schienen --- Corridors with rails +-- Build a wooden support frame +local function WoodSupport(p, wood, post, torches, dir, torchdir) + local node_wood = {name=wood} + local node_fence = {name=post} + + local calc = { + p.x+dir[1], p.z+dir[2], -- X and Z, added by direction + p.x-dir[1], p.z-dir[2], -- subtracted + p.x+dir[2], p.z+dir[1], -- orthogonal + p.x-dir[2], p.z-dir[1], -- orthogonal, the other way + } + --[[ Shape: + WWW + P.P + PrP + pfp + W = wood + P = post (above floor level) + p = post (in floor level, only placed if no floor) + + From previous generation (for reference): + f = floor + r = rail + . = air + ]] + + -- Don't place those wood structs below open air + if not (minetest.get_node({x=calc[1], y=p.y+2, z=calc[2]}).name == "air" and + minetest.get_node({x=calc[3], y=p.y+2, z=calc[4]}).name == "air" and + minetest.get_node({x=p.x, y=p.y+2, z=p.z}).name == "air") then + + -- Left post and planks + local left_ok + left_ok = SetNodeIfCanBuild({x=calc[1], y=p.y-1, z=calc[2]}, node_fence) + if left_ok then left_ok = SetNodeIfCanBuild({x=calc[1], y=p.y , z=calc[2]}, node_fence) end + if left_ok then left_ok = SetNodeIfCanBuild({x=calc[1], y=p.y+1, z=calc[2]}, node_wood, false, true) end + + -- Right post and planks + local right_ok + right_ok = SetNodeIfCanBuild({x=calc[3], y=p.y-1, z=calc[4]}, node_fence) + if right_ok then right_ok = SetNodeIfCanBuild({x=calc[3], y=p.y , z=calc[4]}, node_fence) end + if right_ok then right_ok = SetNodeIfCanBuild({x=calc[3], y=p.y+1, z=calc[4]}, node_wood, false, true) end + + -- Middle planks + local top_planks_ok = false + if left_ok and right_ok then top_planks_ok = SetNodeIfCanBuild({x=p.x, y=p.y+1, z=p.z}, node_wood) end + + if minetest.get_node({x=p.x,y=p.y-2,z=p.z}).name=="air" then + if left_ok then SetNodeIfCanBuild({x=calc[1], y=p.y-2, z=calc[2]}, node_fence) end + if right_ok then SetNodeIfCanBuild({x=calc[3], y=p.y-2, z=calc[4]}, node_fence) end + end + -- Torches on the middle planks + if torches and top_planks_ok then + -- Place torches at horizontal sides + SetNodeIfCanBuild({x=calc[5], y=p.y+1, z=calc[6]}, {name=tsm_railcorridors.nodes.torch_wall, param2=torchdir[1]}, true) + SetNodeIfCanBuild({x=calc[7], y=p.y+1, z=calc[8]}, {name=tsm_railcorridors.nodes.torch_wall, param2=torchdir[2]}, true) + end + elseif torches then + -- Try to build torches instead of the wood structs + local node = {name=tsm_railcorridors.nodes.torch_floor, param2=minetest.dir_to_wallmounted({x=0,y=-1,z=0})} + + -- Try two different height levels + local pos1 = {x=calc[1], y=p.y-2, z=calc[2]} + local pos2 = {x=calc[3], y=p.y-2, z=calc[4]} + local nodedef1 = minetest.registered_nodes[minetest.get_node(pos1).name] + local nodedef2 = minetest.registered_nodes[minetest.get_node(pos2).name] + + if nodedef1.walkable then + pos1.y = pos1.y + 1 + end + SetNodeIfCanBuild(pos1, node, true) + + if nodedef2.walkable then + pos2.y = pos2.y + 1 + end + SetNodeIfCanBuild(pos2, node, true) + + end +end + +-- Dig out a single corridor section and place wooden structures and torches -- Returns , -- success: true if corridor could be placed entirely -- segments: Number of segments successfully placed -local function corridor_part(start_point, segment_vector, segment_count, wood, post, first_or_final, up_or_down_prev) +local function dig_corridor_section(start_point, segment_vector, segment_count, wood, post, up_or_down_prev) local p = {x=start_point.x, y=start_point.y, z=start_point.z} local torches = pr:next() < probability_torches_in_segment local dir = {0, 0} local torchdir = {1, 1} local node_wood = {name=wood} - local node_fence = {name=post} if segment_vector.x == 0 and segment_vector.z ~= 0 then dir = {1, 0} torchdir = {5, 4} @@ -344,7 +547,12 @@ local function corridor_part(start_point, segment_vector, segment_count, wood, p torchdir = {3, 2} end for segmentindex = 0, segment_count-1 do - local dug = Cube(p, 1, {name="air"}) + local dug + if segment_vector.y == 0 then + dug = Cube(p, 1, {name="air"}, false, wood, post) + else + dug = Cube(p, 1, {name="air"}, false) + end if not chaos_mode and segmentindex > 0 and not dug then return false, segmentindex end -- Add wooden platform, if neccessary. To avoid floating rails if segment_vector.y == 0 then @@ -358,92 +566,27 @@ local function corridor_part(start_point, segment_vector, segment_count, wood, p -- Normal 3×3 platform Platform({x=p.x, y=p.y-1, z=p.z}, 1, node_wood) end + else + -- Sloped bridge + Platform({x=p.x-dir[1], y=p.y-2, z=p.z-dir[2]}, 0, node_wood) + Platform({x=p.x, y=p.y-2, z=p.z}, 0, node_wood) + Platform({x=p.x+dir[1], y=p.y-2, z=p.z+dir[2]}, 0, node_wood) end - -- Diese komischen Holz-Konstruktionen - -- These strange wood structs if segmentindex % 2 == 1 and segment_vector.y == 0 then - local calc = { - p.x+dir[1], p.z+dir[2], -- X and Z, added by direction - p.x-dir[1], p.z-dir[2], -- subtracted - p.x+dir[2], p.z+dir[1], -- orthogonal - p.x-dir[2], p.z-dir[1], -- orthogonal, the other way - } - --[[ Shape: - WWW - P.P - PrP - pfp - W = wood - P = post (above floor level) - p = post (in floor level, only placed if no floor) - - From previous generation (for reference): - f = floor - r = rail - . = air - ]] - - -- Don't place those wood structs below open air - if not (minetest.get_node({x=calc[1], y=p.y+2, z=calc[2]}).name == "air" and - minetest.get_node({x=calc[3], y=p.y+2, z=calc[4]}).name == "air" and - minetest.get_node({x=p.x, y=p.y+2, z=p.z}).name == "air") then - - -- Left post and planks - local left_ok = true - left_ok = SetNodeIfCanBuild({x=calc[1], y=p.y-1, z=calc[2]}, node_fence) - if left_ok then left_ok = SetNodeIfCanBuild({x=calc[1], y=p.y , z=calc[2]}, node_fence) end - if left_ok then left_ok = SetNodeIfCanBuild({x=calc[1], y=p.y+1, z=calc[2]}, node_wood) end - - -- Right post and planks - local right_ok = true - right_ok = SetNodeIfCanBuild({x=calc[3], y=p.y-1, z=calc[4]}, node_fence) - if right_ok then right_ok = SetNodeIfCanBuild({x=calc[3], y=p.y , z=calc[4]}, node_fence) end - if right_ok then right_ok = SetNodeIfCanBuild({x=calc[3], y=p.y+1, z=calc[4]}, node_wood) end - - -- Middle planks - local top_planks_ok = false - if left_ok and right_ok then top_planks_ok = SetNodeIfCanBuild({x=p.x, y=p.y+1, z=p.z}, node_wood) end - - if minetest.get_node({x=p.x,y=p.y-2,z=p.z}).name=="air" then - if left_ok then SetNodeIfCanBuild({x=calc[1], y=p.y-2, z=calc[2]}, node_fence) end - if right_ok then SetNodeIfCanBuild({x=calc[3], y=p.y-2, z=calc[4]}, node_fence) end - end - -- Torches on the middle planks - if torches and top_planks_ok then - -- Place torches at horizontal sides - SetNodeIfCanBuild({x=calc[5], y=p.y+1, z=calc[6]}, {name=tsm_railcorridors.nodes.torch_wall, param2=torchdir[1]}, true) - SetNodeIfCanBuild({x=calc[7], y=p.y+1, z=calc[8]}, {name=tsm_railcorridors.nodes.torch_wall, param2=torchdir[2]}, true) - end - elseif torches then - -- Try to build torches instead of the wood structs - local node = {name=tsm_railcorridors.nodes.torch_floor, param2=minetest.dir_to_wallmounted({x=0,y=-1,z=0})} - - -- Try two different height levels - local pos1 = {x=calc[1], y=p.y-2, z=calc[2]} - local pos2 = {x=calc[3], y=p.y-2, z=calc[4]} - local nodedef1 = minetest.registered_nodes[minetest.get_node(pos1).name] - local nodedef2 = minetest.registered_nodes[minetest.get_node(pos2).name] - - if nodedef1.walkable then - pos1.y = pos1.y + 1 - end - SetNodeIfCanBuild(pos1, node, true) - - if nodedef2.walkable then - pos2.y = pos2.y + 1 - end - SetNodeIfCanBuild(pos2, node, true) - - end + WoodSupport(p, wood, post, torches, dir, torchdir) end - - -- nächster Punkt durch Vektoraddition - -- next way point + + -- Next way point p = vector.add(p, segment_vector) end -- End of the corridor segment; create the final piece - local dug = Cube(p, 1, {name="air"}) + local dug + if segment_vector.y == 0 then + dug = Cube(p, 1, {name="air"}, false, wood, post) + else + dug = Cube(p, 1, {name="air"}, false) + end if not chaos_mode and not dug then return false, segment_count end if segment_vector.y == 0 then Platform({x=p.x, y=p.y-1, z=p.z}, 1, node_wood) @@ -451,7 +594,11 @@ local function corridor_part(start_point, segment_vector, segment_count, wood, p return true, segment_count end -local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, up_or_down_prev, up, wood, post, first_or_final, damage, no_spawner) +-- Generate a corridor section. Corridor sections are part of a corridor line. +-- This is one short part of a corridor line. It can be one straight section or it goes up or down. +-- It digs out the corridor and places wood structs and torches using the helper function dig_corridor_function, +-- then it places rails, chests, and other goodies. +local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_down_next, up_or_down_prev, up, wood, post, first_or_final, damage, no_spawner) local segamount = 3 if up_or_down then segamount = 1 @@ -461,12 +608,12 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, end local vek = {x=0,y=0,z=0}; local start = table.copy(waypoint) - if coord == "x" then + if axis == "x" then vek.x=segamount if up_or_down and up == false then start.x=start.x+segamount end - elseif coord == "z" then + elseif axis == "z" then vek.z=segamount if up_or_down and up == false then start.z=start.z+segamount @@ -481,20 +628,19 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, end local segcount = pr:next(4,6) if up_or_down and up == false then - Cube(waypoint, 1, {name="air"}) + Cube(waypoint, 1, {name="air"}, false) end - local corridor_dug, corridor_segments_dug = corridor_part(start, vek, segcount, wood, post, first_or_final, up_or_down_prev) + local corridor_dug, corridor_segments_dug = dig_corridor_section(start, vek, segcount, wood, post, up_or_down_prev) local corridor_vek = {x=vek.x*segcount, y=vek.y*segcount, z=vek.z*segcount} - -- nachträglich Schienen legen - -- after this: rails + -- After this: rails segamount = 1 if sign then segamount = 0-segamount end - if coord == "x" then + if axis == "x" then vek.x=segamount - elseif coord == "z" then + elseif axis == "z" then vek.z=segamount end if up_or_down then @@ -535,7 +681,7 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, -- Randomly returns either the left or right side of the main rail. -- Also returns offset as second return value. local left_or_right = function(pos, vek) - local off, facedir + local off if pr:next(1, 2) == 1 then -- left off = {x = -vek.z, y= 0, z = vek.x} @@ -559,45 +705,43 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, -- Chest if i == chestplace then local cpos, offset = left_or_right(p, vek) - if minetest.get_node(cpos).name == post then + if minetest.get_node(cpos).name == post or IsInDirtRoom(p) then chestplace = chestplace + 1 else PlaceChest(cpos, minetest.dir_to_facedir(offset)) end end - -- Rail and cart - if i == cartplace then + -- A rail at the side of the track to put a cart on + if i == cartplace and #tsm_railcorridors.carts > 0 then local cpos = left_or_right(p, vek) if minetest.get_node(cpos).name == post then cartplace = cartplace + 1 else - local placed = PlaceRail(cpos, damage) + local placed + if IsRailSurface({x=cpos.x, y=cpos.y-1, z=cpos.z}) then + placed = PlaceRail(cpos, damage) + else + placed = false + end if placed then - local cart_type = pr:next(1, #tsm_railcorridors.carts) - -- FIXME: The cart sometimes fails to spawn - -- See - local cart_id = tsm_railcorridors.carts[cart_type] - local cart = minetest.add_entity(cpos, cart_id) - - -- This checks if the cart is actually spawned, it's a giant hack! - -- Note that the callback function is also called there. - -- TODO: Move callback function to this position when the - -- minetest.add_entity bug has been fixed. - minetest.after(2, RecheckCartHack, {cpos, cart_id, 10}) + -- We don't put on a cart yet, we put it in the carts table + -- for later placement + local cart_type = pr_carts:next(1, #tsm_railcorridors.carts) + table.insert(carts_table, {pos = cpos, cart_type = cart_type}) end end end -- Mob spawner (at center) if place_mob_spawners and tsm_railcorridors.nodes.spawner and not no_spawner and - webperlin_major:get3d(p) > 0.3 and webperlin_minor:get3d(p) > 0.5 then + webperlin_major:get_3d(p) > 0.3 and webperlin_minor:get_3d(p) > 0.5 then -- Place spawner (if activated in gameconfig), -- enclose in cobwebs and setup the spawner node. local spawner_placed = SetNodeIfCanBuild(p, {name=tsm_railcorridors.nodes.spawner}) if spawner_placed then local size = 1 - if webperlin_major:get3d(p) > 0.5 then + if webperlin_major:get_3d(p) > 0.5 then size = 2 end if place_cobwebs then @@ -620,7 +764,7 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, if pr:next(1,5) == 1 then local h = pr:next(0, 2) -- 3 possible cobweb heights local cpos = {x=basepos.x+vek.x, y=basepos.y+h, z=basepos.z+vek.z} - if webperlin_major:get3d(cpos) > 0.05 and webperlin_minor:get3d(cpos) > 0.1 then + if webperlin_major:get_3d(cpos) > 0.05 and webperlin_minor:get_3d(cpos) > 0.1 then if h == 0 then -- No check neccessary at height offset 0 since the cobweb is on the floor return TryPlaceCobweb(cpos) @@ -643,7 +787,7 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, end end - + local offset = table.copy(corridor_vek) local final_point = vector.add(waypoint, offset) if up_or_down then @@ -651,12 +795,13 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, offset.y = offset.y - 1 final_point = vector.add(waypoint, offset) else - offset[coord] = offset[coord] + segamount + offset[axis] = offset[axis] + segamount final_point = vector.add(waypoint, offset) - -- After going up or down, 1 missing rail piece must be added - if IsRailSurface({x=final_point.x,y=final_point.y-2,z=final_point.z}) then - PlaceRail({x=final_point.x,y=final_point.y-1,z=final_point.z}, damage) - end + end + -- After going up or down, 1 missing rail piece must be added + Platform({x=final_point.x,y=final_point.y-1,z=final_point.z}, 0, {name=wood}) + if IsRailSurface({x=final_point.x,y=final_point.y-2,z=final_point.z}) then + PlaceRail({x=final_point.x,y=final_point.y-1,z=final_point.z}, damage) end end if not corridor_dug then @@ -666,34 +811,46 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, end end -local function start_corridor(waypoint, coord, sign, length, psra, wood, post, damage, no_spawner) +-- Generate a line of corridors. +-- The corridor can go up/down, take turns and it can branch off, creating more corridor lines. +local function create_corridor_line(waypoint, axis, sign, length, wood, post, damage, no_spawner) local wp = waypoint - local c = coord + local a = axis local s = sign - local ud = false -- up or down - local udn = false -- up or down is next - local udp = false -- up or down was previous - local up + local ud = false -- Up or down + local udn = false -- Up or down is next + local udp = false -- Up or down was previous + local up = false -- true if going up + local upp = false -- true if was going up previously for i=1,length do - local needs_platform -- Update previous up/down status udp = ud + -- Can't go up/down if a platform is needed at waypoint + local needs_platform = NeedsPlatform({x=wp.x,y=wp.y-2,z=wp.z}) -- Update current up/down status - if udn then - needs_platform = NeedsPlatform(wp) - if needs_platform then - ud = false - end + if udn and not needs_platform then ud = true -- Force direction near the height limits if wp.y >= height_max - 12 then + if udp then + ud = false + end up = false elseif wp.y <= height_min + 12 then + if udp then + ud = false + end up = true else - -- Chose random direction in between - up = pr:next(0, 2) < 1 + -- If previous was up/down, keep the vertical direction + if udp and not chaos_mode then + up = upp + else + -- Chose random direction + up = pr:next(1, 2) == 1 + end end + upp = up else ud = false end @@ -703,113 +860,255 @@ local function start_corridor(waypoint, coord, sign, length, psra, wood, post, d elseif udn and not needs_platform then udn = false end - -- Make corridor / Korridor graben + -- Make corridor local first_or_final if i == length then first_or_final = "final" elseif i == 1 then first_or_final = "first" end - wp, no_spawner = corridor_func(wp,c,s, ud, udn, udp, up, wood, post, first_or_final, damage, no_spawner) + wp, no_spawner = create_corridor_section(wp,a,s, ud, udn, udp, up, wood, post, first_or_final, damage, no_spawner) if wp == false then return end - -- Verzweigung? - -- Fork? + -- Fork in the road? If so, starts 2-3 new corridor lines and terminates the current one. if pr:next() < probability_fork then + -- 75% chance to fork off in 3 directions (making a crossing) + -- 25% chance to fork off in 2 directions (making a t-junction) + local is_crossing = pr:next(0, 3) < 3 + local forks = 2 + if is_crossing then + forks = 3 + end local p = {x=wp.x, y=wp.y, z=wp.z} - start_corridor(wp, c, s, pr:next(way_min,way_max), psra, wood, post, damage, no_spawner) - if c == "x" then c="z" else c="x" end - start_corridor(wp, c, s, pr:next(way_min,way_max), psra, wood, post, damage, no_spawner) - start_corridor(wp, c, not s, pr:next(way_min,way_max), psra, wood, post, damage, no_spawner) - WoodBulk({x=p.x, y=p.y-1, z=p.z}, wood) - WoodBulk({x=p.x, y=p.y, z=p.z}, wood) - WoodBulk({x=p.x, y=p.y+1, z=p.z}, wood) - WoodBulk({x=p.x, y=p.y+2, z=p.z}, wood) + local a2 + if a == "x" then + a2="z" + else + a2="x" + end + local fork_dirs = { + {a2, s}, -- to the side + {a2, not s}, -- to the other side + {a, s}, -- straight ahead + } + for f=1, forks do + local r = pr:next(1, #fork_dirs) + create_corridor_line(wp, fork_dirs[r][1], fork_dirs[r][2], pr:next(way_min,way_max), wood, post, damage, no_spawner) + table.remove(fork_dirs, r) + end + if is_crossing and not IsInDirtRoom(p) then + -- 4 large wooden pillars around the center rail + WoodBulk({x=p.x, y=p.y-1, z=p.z}, 4, wood) + end return end - -- coord und sign verändern - -- randomly change sign and coord - if c=="x" then - c="z" - elseif c=="z" then - c="x" + -- Randomly change sign, toggle axis. + -- In other words, take a turn. + if a=="x" then + a="z" + elseif a=="z" then + a="x" end; - s = pr:next(0, 2) < 1 + s = pr:next(1, 2) == 1 end end -local function place_corridors(main_cave_coords, psra) - --[[ ALWAYS start building in the ground. Prevents corridors starting - in mid-air or in liquids. ]] - if not IsGround(main_cave_coords) then - return +-- Spawns all carts in the carts table and clears the carts table afterwards +local function spawn_carts() + for c=1, #carts_table do + local cpos = carts_table[c].pos + local cart_type = carts_table[c].cart_type + local node = minetest.get_node(cpos) + if node.name == tsm_railcorridors.nodes.rail then + -- FIXME: The cart sometimes fails to spawn + -- See + local cart_id = tsm_railcorridors.carts[cart_type] + minetest.log("info", "[tsm_railcorridors] Cart spawn attempt: "..minetest.pos_to_string(cpos)) + minetest.add_entity(cpos, cart_id) + + -- This checks if the cart is actually spawned, it's a giant hack! + -- Note that the callback function is also called there. + -- TODO: Move callback function to this position when the + -- minetest.add_entity bug has been fixed. + minetest.after(3, RecheckCartHack, {cpos, cart_id}) + end end + carts_table = {} +end + +-- Start generation of a rail corridor system +-- main_cave_coords is the center of the floor of the dirt room, from which +-- all corridors expand. +local function create_corridor_system(main_cave_coords) + + -- Dirt room size + local maxsize = 6 + if chaos_mode then + maxsize = 9 + end + local size = pr:next(3, maxsize) + + --[[ Only build if starter coords are in the ground. + Prevents corridors starting in mid-air or in liquids. ]] + local check_coords = { + -- Center of the room, on the floor + {x=0,y=0,z=0}, + -- Also check near the 4 bottom corners of the dirt room + {x= size-1, y=0, z=size-1}, + {x=-size+1, y=0, z=size-1}, + {x= size-1, y=0, z=-size+1}, + {x=-size+1, y=0, z=-size+1}, + } + for c=1, #check_coords do + if not IsGround(vector.add(main_cave_coords, check_coords[c])) then + return false + end + end + + local center_node = minetest.get_node(main_cave_coords) + + local height = pr:next(4, 7) + if height > size then + height = size + end + local floor_diff = 1 + if pr:next(0, 100) < 50 then + floor_diff = 0 + end + local dirt_mode = pr:next(1,2) + local rnd = pr:next(1,1000) + -- Small chance to fill dirt room with random rails + local decorations_mode = 0 + if rnd == 1000 then + decorations_mode = 1 + end + + --[[ Starting point: A big hollow dirt cube from which the corridors will extend. + Corridor generation starts here. ]] + DirtRoom(main_cave_coords, size, height, dirt_mode, decorations_mode) + main_cave_coords.y = main_cave_coords.y + 2 + floor_diff -- Determine if this corridor system is “damaged” (some rails removed) and to which extent local damage = 0 if pr:next() < probability_damage then damage = pr:next(10, 50) end - --[[ Starter cube: A big hollow dirt cube from which the corridors will extend. - Corridor generation starts here. ]] - if pr:next(0, 100) < 50 then - Cube(main_cave_coords, 4, {name=tsm_railcorridors.nodes.dirt}) - Cube(main_cave_coords, 3, {name="air"}) - -- Center rail - PlaceRail({x=main_cave_coords.x, y=main_cave_coords.y-3, z=main_cave_coords.z}, damage) - main_cave_coords.y =main_cave_coords.y - 1 + + -- Get wood and fence post types, using gameconfig. + + local wood, post + if tsm_railcorridors.nodes.corridor_woods_function then + -- Get wood type by gameconfig function + wood, post = tsm_railcorridors.nodes.corridor_woods_function(main_cave_coords, center_node) else - Cube(main_cave_coords, 3, {name=tsm_railcorridors.nodes.dirt}) - Cube(main_cave_coords, 2, {name="air"}) - -- Center rail - PlaceRail({x=main_cave_coords.x, y=main_cave_coords.y-2, z=main_cave_coords.z}, damage) - end - local xs = pr:next(0, 2) < 1 - local zs = pr:next(0, 2) < 1; + -- Select random wood type (found in gameconfig.lua) + local rnd = pr:next(1,1000) + local woodtype = 1 + local accumulated_chance = 0 - -- Select random wood type (found in gameconfig.lua) - local rnd = pr:next(1,1000) - - local woodtype = 1 - local accumulated_chance = 0 - for w=1, #tsm_railcorridors.nodes.corridor_woods do - local woodtable = tsm_railcorridors.nodes.corridor_woods[w] - accumulated_chance = accumulated_chance + woodtable.chance - if accumulated_chance > 1000 then - minetest.log("warning", "[tsm_railcorridors] Warning: Wood chances add up to over 100%!") - break + for w=1, #tsm_railcorridors.nodes.corridor_woods do + local woodtable = tsm_railcorridors.nodes.corridor_woods[w] + accumulated_chance = accumulated_chance + woodtable.chance + if rnd <= accumulated_chance then + woodtype = w + break + end end - if rnd <= accumulated_chance then - woodtype = w - break + wood = tsm_railcorridors.nodes.corridor_woods[woodtype].wood + post = tsm_railcorridors.nodes.corridor_woods[woodtype].post + end + + -- Start 2-4 corridors in each direction + local dirs = { + {axis="x", axis2="z", sign=false}, + {axis="x", axis2="z", sign=true}, + {axis="z", axis2="x", sign=false}, + {axis="z", axis2="x", sign=true}, + } + local first_corridor + local corridors = 2 + for _=1, 2 do + if pr:next(0,100) < 70 then + corridors = corridors + 1 end end - local wood = tsm_railcorridors.nodes.corridor_woods[woodtype].wood - local post = tsm_railcorridors.nodes.corridor_woods[woodtype].post - start_corridor(main_cave_coords, "x", xs, pr:next(way_min,way_max), psra, wood, post, damage, false) - start_corridor(main_cave_coords, "z", zs, pr:next(way_min,way_max), psra, wood, post, damage, false) - -- Auch mal die andere Richtung? - -- Try the other direction? - if pr:next(0, 100) < 70 then - start_corridor(main_cave_coords, "x", not xs, pr:next(way_min,way_max), psra, wood, post, damage, false) + -- Chance for 5th corridor in Chaos Mode + if chaos_mode and size > 4 then + if pr:next(0,100) < 50 then + corridors = corridors + 1 + end end - if pr:next(0, 100) < 70 then - start_corridor(main_cave_coords, "z", not zs, pr:next(way_min,way_max), psra, wood, post, damage, false) + local centered_crossing = false + if corridors <= 4 and pr:next(1, 20) >= 11 then + centered_crossing = true end + -- This moves the start of the corridors in the dirt room back and forth + local d_max = 3 + if floor_diff == 1 and height <= 4 then + d_max = d_max + 1 + end + local from_center_base = size - pr:next(1,d_max) + for i=1, math.min(4, corridors) do + local d = pr:next(1, #dirs) + local dir = dirs[d] + local side_offset = 0 + if not centered_crossing and size > 3 then + if i==1 and corridors == 5 then + side_offset = pr:next(2, size-2) + if pr:next(1,2) == 1 then + side_offset = -side_offset + end + else + side_offset = pr:next(-size+2, size-2) + end + end + local from_center = from_center_base + if dir.sign then + from_center = -from_center + end + if i == 1 then + first_corridor = {sign=dir.sign, axis=dir.axis, axis2=dir.axis2, side_offset=side_offset, from_center=from_center} + end + local coords = vector.add(main_cave_coords, {[dir.axis] = from_center, y=0, [dir.axis2] = side_offset}) + create_corridor_line(coords, dir.axis, dir.sign, pr:next(way_min,way_max), wood, post, damage, false) + table.remove(dirs, d) + end + if corridors == 5 then + local special_coords = vector.add(main_cave_coords, {[first_corridor.axis2] = -first_corridor.side_offset, y=0, [first_corridor.axis] = first_corridor.from_center}) + create_corridor_line(special_coords, first_corridor.axis, first_corridor.sign, pr:next(way_min,way_max), wood, post, damage, false) + end + + -- At this point, all corridors were generated and all nodes were set. + -- We spawn the carts now + spawn_carts() + + return true end +-- The rail corridor algorithm starts here minetest.register_on_generated(function(minp, maxp, blockseed) + -- We re-init the randomizer for every mapchunk as we start generating in the middle of each mapchunk. + -- We can't use the mapgen seed as this would make the algorithm depending on the order the mapchunk generate. InitRandomizer(blockseed) - if minp.y < height_max and maxp.y > height_min and pr:next() < probability_railcaves_in_chunk then - -- Get semi-random height in chunk - + if minp.y < height_max and maxp.y > height_min and pr:next() < probability_railcaves_in_mapchunk then + -- Keep some distance from the upper/lower mapchunk limits local buffer = 5 - local y = pr:next(minp.y + buffer, maxp.y - buffer) - y = math.floor(math.max(height_min + buffer, math.min(height_max - buffer, y))) - -- Mid point of the chunk - local p = {x=minp.x+math.floor((maxp.x-minp.x)/2), y=y, z=minp.z+math.floor((maxp.z-minp.z)/2)} - -- Haupthöhle und alle weiteren - -- Corridors; starting with main cave out of dirt - place_corridors(p, pr) + -- Do up to 10 tries to start a corridor system + for t=1,10 do + -- Get semi-random height in mapchunk + local y = pr:next(minp.y + buffer, maxp.y - buffer) + y = math.floor(math.max(height_min + buffer, math.min(height_max - buffer, y))) + + -- Mid point of the mapchunk + local p = {x=minp.x+math.floor((maxp.x-minp.x)/2), y=y, z=minp.z+math.floor((maxp.z-minp.z)/2)} + -- Start corridor system at p. Might fail if p is in open air + minetest.log("verbose", "[tsm_railcorridors] Attempting to start rail corridor system at "..minetest.pos_to_string(p)) + if create_corridor_system(p, pr) then + minetest.log("info", "[tsm_railcorridors] Generated rail corridor system at "..minetest.pos_to_string(p)) + break + else + minetest.log("info", "[tsm_railcorridors] Rail corridor system generation attempt failed at "..minetest.pos_to_string(p).. " (try "..t..")") + end + end end end) diff --git a/mods/MAPGEN/tsm_railcorridors/settingtypes.txt b/mods/MAPGEN/tsm_railcorridors/settingtypes.txt index 36d8365a..a2896290 100644 --- a/mods/MAPGEN/tsm_railcorridors/settingtypes.txt +++ b/mods/MAPGEN/tsm_railcorridors/settingtypes.txt @@ -1,5 +1,5 @@ -#Probability (0.0 to 1.0) for every newly generated chunk to get rail corridors. -tsm_railcorridors_probability_railcaves_in_chunk (Rail corridor probability) float 0.3 0.0 1.0 +#Probability (0.0 to 1.0) for every newly generated mapchunk to get rail corridors. +tsm_railcorridors_probability_railcaves_in_mapchunk (Rail corridor probability) float 0.33333 0.0 1.0 #Minimum rail corridor path length (excludes forks). tsm_railcorridors_way_min (Minimum rail corridor length) int 4 1 @@ -21,7 +21,15 @@ tsm_railcorridors_probability_fork (Fork probability) float 0.04 0.0 1.0 tsm_railcorridors_probability_chest (Chest probability) float 0.05 0.0 1.0 #Probability (0.0 to 1.0) for every part of a rail corridor to include a cart. -tsm_railcorridors_probability_cart (Cart probability) float 0.05 0.0 1.0 +#Note: The rail may still be subject to rail damage, so the probability +#of finding a cart in rail corridors with high rail damage will be lower. +#NOTE: Due to a bug in Minetest +#carts often fail to spawn even if they should. +tsm_railcorridors_probability_cart (Cart probability) float 0.0 0.0 1.0 + +#If enabled, cobwebs may be placed in some corridors. +#Currently, cobwebs are only supported with the Mobs Redo mod. +tsm_railcorridors_place_cobwebs (Cobwebs) bool true #Probability (0.0 to 1.0) for a rail corridor system to have damaged/incomplete railways tsm_railcorridors_probability_damage (Damaged railway probability) float 1.0 0.0 1.0 @@ -31,7 +39,3 @@ tsm_railcorridors_probability_damage (Damaged railway probability) float 1.0 0.0 #to pretty chaotic rail corridors, but they are also more free to spread. #If disabled, rail corridors spread in a orderly fashion. tsm_railcorridors_chaos (Chaos Mode) bool false - -#If enabled, cobwebs may be placed in some corridors. -#Currently, cobwebs are only supported with the Mobs Redo mod. -tsm_railcorridors_place_cobwebs (Cobwebs) bool true diff --git a/mods/MISC/findbiome/README.md b/mods/MISC/findbiome/README.md new file mode 100644 index 00000000..04c63199 --- /dev/null +++ b/mods/MISC/findbiome/README.md @@ -0,0 +1,23 @@ +# 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 biomes. + +Version: 1.0.1 + +## 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. + +## Authors +- paramat (MIT License) +- Wuzzy (MIT License) + +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/MISC/findbiome/init.lua b/mods/MISC/findbiome/init.lua new file mode 100644 index 00000000..ce7fd979 --- /dev/null +++ b/mods/MISC/findbiome/init.lua @@ -0,0 +1,320 @@ +local S = minetest.get_translator("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 maximum playable limit +local mapgen_limit = tonumber(minetest.get_mapgen_setting("mapgen_limit")) +local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) +local playable_limit = math.max(mapgen_limit - (chunksize + 1) * 16, 0) + +-- 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 + +-- 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 (math.abs(pos.x) > playable_limit or math.abs(pos.y) > playable_limit or math.abs(pos.z) > playable_limit) +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 + end + if biome[ax.."_max"] then + max = biome[ax.."_max"] + else + max = playable_limit + 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) + 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) + 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 b, biome 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 { x = 0, y = y, z = 0 } + end + local pos = {} + -- Just check a lot of random positions + -- It's a crappy algorithm but better than nothing. + for i=1, 100 do + pos.x = math.random(-playable_limit, playable_limit) + pos.y = math.random(-playable_limit, playable_limit) + pos.z = math.random(-playable_limit, playable_limit) + 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 + +local function find_biome(pos, biomes) + 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 = false + 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 iter = 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 = {x = spos.x, y = spawn_y, z = spos.z} + elseif not good_spawn_height then + spawn_pos = {x = spos.x, y = spos.y, z = spos.z} + elseif attempt >= 2 then + spawn_pos = {x = spos.x, y = spos.y, z = spos.z} + end + if spawn_pos then + local adjusted_pos, 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 iter = 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 = {x = pos.x, y = spawn_y, z = 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) + +-- Regiver 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 = 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) + if not mods_loaded then + return false + end + local biomes + local b = 0 + 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 + biomes = biomeinfo.get_active_v6_biomes() + b = #biomes + else + biomes = {} + for k,v in pairs(minetest.registered_biomes) do + table.insert(biomes, k) + b = b + 1 + end + end + if b == 0 then + return true, S("No biomes.") + else + table.sort(biomes) + for b=1, #biomes do + minetest.chat_send_player(name, biomes[b]) + end + return true + end + end, + }) +end diff --git a/mods/MISC/findbiome/license.txt b/mods/MISC/findbiome/license.txt new file mode 100644 index 00000000..a466aabd --- /dev/null +++ b/mods/MISC/findbiome/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/MISC/findbiome/locale/findbiome.de.tr b/mods/MISC/findbiome/locale/findbiome.de.tr new file mode 100644 index 00000000..d62332ea --- /dev/null +++ b/mods/MISC/findbiome/locale/findbiome.de.tr @@ -0,0 +1,10 @@ +# textdomain: findbiome +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/MISC/findbiome/locale/findbiome.fr.tr b/mods/MISC/findbiome/locale/findbiome.fr.tr new file mode 100644 index 00000000..0fc6aa57 --- /dev/null +++ b/mods/MISC/findbiome/locale/findbiome.fr.tr @@ -0,0 +1,10 @@ +# textdomain: findbiome +Find and teleport to biome=Rechercher et se téléporter sur le biome += +No player.=Aucun joueur. +Biome does not exist!=Le biome n'existe pas! +Biome found at @1.=Biome trouvé à @1. +No biome found!=Aucun biome trouvé! +List all biomes=Lister tous les biomes +No biomes.=Aucun biomes. +Not supported. The “biomeinfo” mod is required for v6 mapgen support!=Non supporté. Le mod «biomeinfo» est requis pour le support de mapgen v6! diff --git a/mods/MISC/findbiome/locale/template.txt b/mods/MISC/findbiome/locale/template.txt new file mode 100644 index 00000000..f3dcc195 --- /dev/null +++ b/mods/MISC/findbiome/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: findbiome +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/MISC/findbiome/mod.conf b/mods/MISC/findbiome/mod.conf new file mode 100644 index 00000000..a8ab4e3c --- /dev/null +++ b/mods/MISC/findbiome/mod.conf @@ -0,0 +1,3 @@ +name=findbiome +description=Add commands to list and find biomes +optional_depends=biomeinfo diff --git a/mods/MISC/gt2mc2/craftitems.lua b/mods/MISC/gt2mc2/craftitems.lua deleted file mode 100644 index d87be288..00000000 --- a/mods/MISC/gt2mc2/craftitems.lua +++ /dev/null @@ -1,317 +0,0 @@ --- mods/gt2mc/craftitems.lua - ---====================== ---default to mcl_core ---====================== ---tools -minetest.register_alias("default:stick", "mcl_core:stick") -minetest.register_alias("default:pick_wood", "mcl_tools:pick_wood") -minetest.register_alias("default:pick_stone", "mcl_tools:pick_stone") -minetest.register_alias("default:pick_steel", "mcl_tools:pick_iron") -minetest.register_alias("default:pick_gold", "mcl_tools:pick_gold") -minetest.register_alias("default:pick_mese", "mcl_tools:pick_gold") -minetest.register_alias("default:pick_diamond", "mcl_tools:pick_diamond") -minetest.register_alias("default:shovel_wood", "mcl_tools:shovel_wood") -minetest.register_alias("default:shovel_stone", "mcl_tools:shovel_stone") -minetest.register_alias("default:shovel_steel", "mcl_tools:shovel_iron") -minetest.register_alias("default:shovel_gold", "mcl_tools:shovel_gold") -minetest.register_alias("default:shovel_mese", "mcl_tools:shovel_gold") -minetest.register_alias("default:shovel_diamond", "mcl_tools:shovel_diamond") -minetest.register_alias("default:axe_wood", "mcl_tools:axe_wood") -minetest.register_alias("default:axe_stone", "mcl_tools:axe_stone") -minetest.register_alias("default:axe_steel", "mcl_tools:axe_iron") -minetest.register_alias("default:axe_gold", "mcl_tools:axe_gold") -minetest.register_alias("default:axe_diamond", "mcl_tools:axe_diamond") -minetest.register_alias("default:sword_wood", "mcl_tools:sword_wood") -minetest.register_alias("default:sword_stone", "mcl_tools:sword_stone") -minetest.register_alias("default:sword_steel", "mcl_tools:sword_iron") -minetest.register_alias("default:sword_gold", "mcl_tools:sword_gold") -minetest.register_alias("default:sword_mese", "mcl_tools:sword_gold") -minetest.register_alias("default:sword_diamond", "mcl_tools:sword_diamond") -minetest.register_alias("default:shears", "mcl_tools:shears") -minetest.register_alias("mobs:shears", "mcl_tools:shears") ---farming tools -minetest.register_alias("farming:hoe_stone", "mcl_farming:hoe_stone") -minetest.register_alias("farming:hoe_iron", "mcl_farming:hoe_iron") -minetest.register_alias("farming:hoe_steel", "mcl_farming:hoe_iron") -minetest.register_alias("farming:hoe_diamond", "mcl_farming:hoe_diamond") -minetest.register_alias("farming:hoe_gold", "mcl_farming:hoe_gold") -minetest.register_alias("farming:hoe_mese", "mcl_farming:hoe_gold") ---moredefault misc -minetest.register_alias("default:paper", "mcl_core:paper") -minetest.register_alias("mcl_books:paper", "mcl_core:paper") -minetest.register_alias("default:book", "mcl_books:book") -minetest.register_alias("default:book_written", "mcl_books:written_book") -minetest.register_alias("mcl_books:book_written", "mcl_books:written_book") -minetest.register_alias("default:bowl", "mcl_core:bowl") -minetest.register_alias("mobs:bowl", "mcl_core:bowl") ---default ores, ingots -minetest.register_alias("default:coal_lump", "mcl_core:coal_lump") -minetest.register_alias("default:charcoal", "mcl_core:charcoal") -minetest.register_alias("default:iron_lump", "mcl_core:stone_with_iron") -minetest.register_alias("default:steel_lump", "mcl_core:stone_with_iron") -minetest.register_alias("default:gold_lump", "mcl_core:stone_with_gold") -minetest.register_alias("default:steel_ingot", "mcl_core:iron_ingot") -minetest.register_alias("default:gold_ingot", "mcl_core:gold_ingot") -minetest.register_alias("mcl_core:steel_ingot", "mcl_core:iron_ingot") -minetest.register_alias("default:clay_lump", "mcl_core:clay_lump") -minetest.register_alias("default:mese_crystal_fragment", "mcl_core:iron_ingot") -minetest.register_alias("default:obsidian_shard", "mcl_core:iron_ingot") -minetest.register_alias("default:stone_with_coal", "mcl_core:stone_with_coal") -minetest.register_alias("default:iron_nugget", "mcl_core:ironnugget") -minetest.register_alias("default:gold_nugget", "mcl_core:goldnugget") -minetest.register_alias("default:mese_crystal", "mcl_core:redstone") -minetest.register_alias("mcl_core:redstone", "mesecons:redstone") -minetest.register_alias("default:emerald_crystal", "mcl_core:emerald") -minetest.register_alias("mcl_nether:quartz_crystal", "mcl_nether:quartz") -minetest.register_alias("default:quartz_crystal_piece", "mcl_nether:quartz") -minetest.register_alias("default:diamond", "mcl_core:diamond") -minetest.register_alias("default:clay_brick", "mcl_core:brick") - ---====================== ---bonemeal ---====================== -minetest.register_alias("bonemeal:bonemeal", "mcl_dye:white") -minetest.register_alias("bonemeal:bone", "mcl_mobitems:bone") - ---====================== ---armor ---====================== -minetest.register_alias("3d_armor:helmet_wood", "3d_armor:helmet_leather") -minetest.register_alias("3d_armor:chestplate_wood", "3d_armor:chestplate_leather") -minetest.register_alias("3d_armor:leggings_wood", "3d_armor:leggings_leather") -minetest.register_alias("3d_armor:boots_wood", "3d_armor:boots_leather") - -minetest.register_alias("3d_armor:helmet_bronze", "3d_armor:helmet_gold") -minetest.register_alias("3d_armor:chestplate_bronze", "3d_armor:chestplate_gold") -minetest.register_alias("3d_armor:leggings_bronze", "3d_armor:leggings_gold") -minetest.register_alias("3d_armor:boots_bronze", "3d_armor:boots_gold") - ---====================== ---Cake ---====================== -minetest.register_alias("cake:cake", "mcl_cake:cake") - ---====================== ---carts ---====================== -minetest.register_alias("carts:cart", "mcl_minecarts:minecart") - ---====================== ---clock and compass ---====================== -minetest.register_alias("clock:clock", "mcl_clock:clock") -minetest.register_alias("compass:compass", "mcl_compass:compass") - ---clocks compass -minetest.register_alias("clock:1", "mcl_clock:clock_1") -minetest.register_alias("clock:2", "mcl_clock:clock_2") -minetest.register_alias("clock:3", "mcl_clock:clock_3") -minetest.register_alias("clock:4", "mcl_clock:clock_4") -minetest.register_alias("clock:5", "mcl_clock:clock_5") -minetest.register_alias("clock:6", "mcl_clock:clock_6") -minetest.register_alias("clock:7", "mcl_clock:clock_7") -minetest.register_alias("clock:8", "mcl_clock:clock_8") -minetest.register_alias("clock:9", "mcl_clock:clock_9") -minetest.register_alias("clock:10", "mcl_clock:clock_10") -minetest.register_alias("clock:11", "mcl_clock:clock_11") -minetest.register_alias("clock:12", "mcl_clock:clock_12") -minetest.register_alias("clock:13", "mcl_clock:clock_13") -minetest.register_alias("clock:14", "mcl_clock:clock_14") -minetest.register_alias("clock:15", "mcl_clock:clock_15") -minetest.register_alias("clock:16", "mcl_clock:clock_16") -minetest.register_alias("clock:17", "mcl_clock:clock_17") -minetest.register_alias("clock:18", "mcl_clock:clock_18") -minetest.register_alias("clock:19", "mcl_clock:clock_19") -minetest.register_alias("clock:20", "mcl_clock:clock_20") -minetest.register_alias("clock:21", "mcl_clock:clock_21") -minetest.register_alias("clock:22", "mcl_clock:clock_22") -minetest.register_alias("clock:23", "mcl_clock:clock_23") -minetest.register_alias("clock:24", "mcl_clock:clock_24") -minetest.register_alias("clock:25", "mcl_clock:clock_25") -minetest.register_alias("clock:26", "mcl_clock:clock_26") -minetest.register_alias("clock:27", "mcl_clock:clock_27") -minetest.register_alias("clock:28", "mcl_clock:clock_28") -minetest.register_alias("clock:29", "mcl_clock:clock_29") -minetest.register_alias("clock:30", "mcl_clock:clock_30") -minetest.register_alias("clock:31", "mcl_clock:clock_31") -minetest.register_alias("clock:32", "mcl_clock:clock_32") -minetest.register_alias("clock:33", "mcl_clock:clock_33") -minetest.register_alias("mcl_clock:33", "mcl_clock:clock_33") -minetest.register_alias("clock:34", "mcl_clock:clock_34") -minetest.register_alias("clock:35", "mcl_clock:clock_35") -minetest.register_alias("clock:36", "mcl_clock:clock_36") -minetest.register_alias("clock:37", "mcl_clock:clock_37") -minetest.register_alias("clock:38", "mcl_clock:clock_38") -minetest.register_alias("clock:39", "mcl_clock:clock_39") -minetest.register_alias("clock:40", "mcl_clock:clock_40") - ---this is template ---minetest.register_alias("clock:57", "mcl_clock:clock_57") --- ---minetest.register_alias("compass:0", "mcl_compass:0") --- - - -minetest.register_alias("compass:compass", "mcl_compass:compass") -minetest.register_alias("compass:0", "mcl_compass:0") -minetest.register_alias("compass:1", "mcl_compass:1") -minetest.register_alias("compass:2", "mcl_compass:2") -minetest.register_alias("compass:3", "mcl_compass:3") -minetest.register_alias("compass:4", "mcl_compass:4") -minetest.register_alias("compass:5", "mcl_compass:5") -minetest.register_alias("compass:6", "mcl_compass:6") -minetest.register_alias("compass:7", "mcl_compass:7") -minetest.register_alias("compass:8", "mcl_compass:8") -minetest.register_alias("compass:9", "mcl_compass:9") -minetest.register_alias("compass:10", "mcl_compass:10") -minetest.register_alias("compass:11", "mcl_compass:11") -minetest.register_alias("compass:12", "mcl_compass:12") -minetest.register_alias("compass:13", "mcl_compass:13") -minetest.register_alias("compass:14", "mcl_compass:14") -minetest.register_alias("compass:15", "mcl_compass:15") -minetest.register_alias("compass:16", "mcl_compass:16") -minetest.register_alias("compass:17", "mcl_compass:17") -minetest.register_alias("compass:18", "mcl_compass:18") -minetest.register_alias("compass:19", "mcl_compass:19") -minetest.register_alias("compass:20", "mcl_compass:20") -minetest.register_alias("compass:21", "mcl_compass:17") -minetest.register_alias("compass:22", "mcl_compass:17") -minetest.register_alias("compass:23", "mcl_compass:17") -minetest.register_alias("compass:24", "mcl_compass:17") -minetest.register_alias("compass:25", "mcl_compass:17") -minetest.register_alias("compass:26", "mcl_compass:17") -minetest.register_alias("compass:27", "mcl_compass:17") -minetest.register_alias("compass:28", "mcl_compass:17") -minetest.register_alias("compass:29", "mcl_compass:29") -minetest.register_alias("compass:30", "mcl_compass:30") -minetest.register_alias("compass:31", "mcl_compass:31") -minetest.register_alias("compass:32", "mcl_compass:32") -minetest.register_alias("compass:33", "mcl_compass:33") - - ---====================== ---dye ---====================== -minetest.register_alias("dye:white", "mcl_dye:white") -minetest.register_alias("dye:brown", "mcl_dye:brown") -minetest.register_alias("dye:dark_grey", "mcl_dye:dark_grey") -minetest.register_alias("dye:lightblue", "mcl_dye:lightblue") -minetest.register_alias("dye:grey", "mcl_dye:grey") -minetest.register_alias("dye:green", "mcl_dye:green") -minetest.register_alias("dye:magenta", "mcl_dye:magenta") -minetest.register_alias("dye:pink", "mcl_dye:pink") -minetest.register_alias("dye:cyan", "mcl_dye:cyan") -minetest.register_alias("dye:violet", "mcl_dye:violet") -minetest.register_alias("dye:orange", "mcl_dye:orange") -minetest.register_alias("dye:yellow", "mcl_dye:yellow") -minetest.register_alias("dye:red", "mcl_dye:red") -minetest.register_alias("dye:black", "mcl_dye:black") -minetest.register_alias("dye:blue", "mcl_dye:blue") -minetest.register_alias("dye:dark_green", "mcl_dye:dark_green") - ---====================== ---farorb ---====================== -minetest.register_alias("farorb:farorb", "mcl_end:ender_eye") - ---====================== ---flintsteel ---====================== -minetest.register_alias("default:flint_and_steel", "mcl_fire:flint_and_steel") -minetest.register_alias("default:flint", "mcl_fire:flint") -minetest.register_alias("mcl_fire:flint", "mcl_core:flint") - ---====================== ---fishing ---====================== -minetest.register_alias("fishing:fish_raw", "mcl_fishing:fish_raw") -minetest.register_alias("fishing:fish_cooked", "mcl_fishing:fish_raw") -minetest.register_alias("fishing:sushi", "mcl_fishing:fish_raw") -minetest.register_alias("fishing:salmon_raw", "mcl_fishing:salmon_raw") -minetest.register_alias("fishing:salmon_cooked", "mcl_fishing:salmon_cooked") -minetest.register_alias("fishing:clownfish_raw", "mcl_fishing:clownfish_raw") -minetest.register_alias("fishing:bluewhite_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:exoticfish_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:carp_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:perch_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:carp_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:catfish_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:shark_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:pike_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:pike_cooked", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:shark_cooked", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:shark_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:shark_raw", "mcl_fishing:pufferfish_raw") -minetest.register_alias("fishing:pole_wood", "mcl_fishing:fishing_rod") -minetest.register_alias("fishing:pole_perfect", "mcl_fishing:fishing_rod") -minetest.register_alias("fishing:bait_worm", "mcl_fishing:fishing_rod") -minetest.register_alias("fishing:bait_corn", "mcl_fishing:fishing_rod") -minetest.register_alias("fishing:bait_bread", "mcl_fishing:fishing_rod") -minetest.register_alias("fishing:baitball", "mcl_fishing:fishing_rod") -minetest.register_alias("fishing:baitball_shark", "mcl_fishing:fishing_rod") - ---====================== ---GoldenApple ---====================== -minetest.register_alias("golden_apple:golden_apple", "mcl_core:apple_gold") -minetest.register_alias("default:golden_apple", "mcl_core:apple_gold") - ---====================== ---MC2 jukebox ---====================== -minetest.register_alias("jdukebox:box", "mcl_jukebox:jukebox") -minetest.register_alias("jdukebox:disc_1", "mcl_jukebox:record_1") -minetest.register_alias("jdukebox:disc_2", "mcl_jukebox:record_2") -minetest.register_alias("jdukebox:disc_3", "mcl_jukebox:record_3") -minetest.register_alias("jdukebox:disc_4", "mcl_jukebox:record_4") -minetest.register_alias("jdukebox:disc_5", "mcl_jukebox:record_5") -minetest.register_alias("jdukebox:disc_6", "mcl_jukebox:record_6") -minetest.register_alias("jdukebox:disc_7", "mcl_jukebox:record_7") -minetest.register_alias("jdukebox:disc_8", "mcl_jukebox:record_8") - - - ---====================== ---hoppers ---====================== -minetest.register_alias("hoppers:hopper", "mcl_hoppers:hopper") -minetest.register_alias("hoppers:hopper_side", "mcl_hoppers:hopper_side") - ---====================== ---MC2 boats ---====================== -minetest.register_alias("boats:boat", "mcl_boats:boat_spruce") -minetest.register_alias("boats:boat_oak", "mcl_boats:boat_oak") -minetest.register_alias("boats:boat_spruce", "mcl_boats:boat_spruce") -minetest.register_alias("boats:boat_birch", "mcl_boats:boat_birch") -minetest.register_alias("boats:boat_jungle", "mcl_boats:boat_jungle") -minetest.register_alias("boats:boat_acacia", "mcl_boats:boat_acacia") -minetest.register_alias("boats:boat_dark_oak", "mcl_boats:boat_dark_oak") - ---====================== ---screwdriver ---====================== -minetest.register_alias("screwdriver:screwdriver", "mcl_core:bowl") - - ---====================== ---tnt ---====================== -minetest.register_alias("tnt:tnt", "mcl_tnt:tnt") -minetest.register_alias("tnt:gunpowder", "mcl_tnt:tnt") - ---====================== ---vessels ---====================== -minetest.register_alias("vessels:shelf", "mcl_core:bowl") -minetest.register_alias("vessels:glass_bottle", "bucket:bucket_empty") -minetest.register_alias("vessels:drinking_glass", "bucket:bucket_empty") -minetest.register_alias("vessels:steel_bottle", "bucket:bucket_empty") -minetest.register_alias("vessels:glass_fragments", "bucket:bucket_empty") - ---====================== ---xdecor ---====================== -minetest.register_alias("xdecor:hammer", "bucket:bucket_empty") - diff --git a/mods/MISC/gt2mc2/depends.txt b/mods/MISC/gt2mc2/depends.txt deleted file mode 100644 index c7458965..00000000 --- a/mods/MISC/gt2mc2/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mobs? - diff --git a/mods/MISC/gt2mc2/enchanted.lua b/mods/MISC/gt2mc2/enchanted.lua deleted file mode 100644 index c6e232d9..00000000 --- a/mods/MISC/gt2mc2/enchanted.lua +++ /dev/null @@ -1,55 +0,0 @@ - - -minetest.register_alias("xdecor:enchantment_table", "mcl_enchanting:enchantment_table") -minetest.register_alias("xdecor:book_open", "mcl_enchanting:book_open") -mobs:alias_mob("xdecor:book_open", "mcl_enchanting:book_open") - - - - --- mods/gt2mc/init.lua - --- axe = {enchants = "durable, fast"}, --- pick = {enchants = "durable, fast"}, --- shovel = {enchants = "durable, fast"}, --- sword = {enchants = "sharp"} - - -minetest.register_alias("default:pick_stone", "mcl_tools:pick_stone") -minetest.register_alias("default:pick_steel", "mcl_tools:pick_iron") -minetest.register_alias("default:pick_gold", "mcl_tools:pick_gold") -minetest.register_alias("default:pick_mese", "mcl_tools:pick_gold") - - - -minetest.register_alias("default:enchanted_pick_diamond_durable", "mcl_tools:enchanted_pick_diamond_durable") -minetest.register_alias("default:enchanted_pick_diamond_fast", "mcl_tools:enchanted_pick_diamond_fast") - -minetest.register_alias("default:shovel_stone", "mcl_tools:shovel_stone") -minetest.register_alias("default:shovel_steel", "mcl_tools:shovel_iron") -minetest.register_alias("default:shovel_gold", "mcl_tools:shovel_gold") -minetest.register_alias("default:shovel_mese", "mcl_tools:shovel_gold") - - - -minetest.register_alias("default:enchanted_shovel_diamond_durable", "mcl_tools:enchanted_shovel_diamond_durable") -minetest.register_alias("default:enchanted_shovel_diamond_fast", "mcl_tools:enchanted_shovel_diamond_fast") - -minetest.register_alias("default:axe_stone", "mcl_tools:axe_stone") -minetest.register_alias("default:axe_steel", "mcl_tools:axe_iron") -minetest.register_alias("default:axe_gold", "mcl_tools:axe_gold") - - - -minetest.register_alias("default:enchanted_axe_diamond_durable", "mcl_tools:enchanted_axe_diamond_durable") -minetest.register_alias("default:enchanted_axe_diamond_fast", "mcl_tools:enchanted_axe_diamond_fast") - -minetest.register_alias("default:sword_stone", "mcl_tools:sword_stone") -minetest.register_alias("default:sword_steel", "mcl_tools:sword_iron") -minetest.register_alias("default:sword_gold", "mcl_tools:sword_gold") -minetest.register_alias("default:sword_mese", "mcl_tools:sword_gold") - - - -minetest.register_alias("default:enchanted_sword_diamond_sharp", "mcl_tools:enchanted_sword_diamond_sharp") - diff --git a/mods/MISC/gt2mc2/init.lua b/mods/MISC/gt2mc2/init.lua deleted file mode 100644 index c120277e..00000000 --- a/mods/MISC/gt2mc2/init.lua +++ /dev/null @@ -1,792 +0,0 @@ --- mods/gt2mc/init.lua - -dofile(minetest.get_modpath("gt2mc2").."/craftitems.lua") -dofile(minetest.get_modpath("gt2mc2").."/enchanted.lua") -dofile(minetest.get_modpath("gt2mc2").."/mob_items.lua") - ---====================== ---MC2 beds ---====================== -minetest.register_alias("beds:fancy_bed", "beds:bed") -minetest.register_alias("beds:simple_bed", "beds:bed") - ---====================== ---MC2 colorblocks ---====================== -minetest.register_alias("hardenedclay:hardened_clay_red", "mcl_colorblocks:hardened_clay_red") -minetest.register_alias("hardenedclay:hardened_clay_yellow", "mcl_colorblocks:hardened_clay_yellow") -minetest.register_alias("hardenedclay:hardened_clay_orange", "mcl_colorblocks:hardened_clay_orange") -minetest.register_alias("hardenedclay:hardened_clay_brown", "mcl_colorblocks:hardened_clay_brown") -minetest.register_alias("hardenedclay:hardened_clay_blue", "mcl_colorblocks:hardened_clay_blue") -minetest.register_alias("hardenedclay:hardened_clay_light_blue", "mcl_colorblocks:hardened_clay_light_blue") -minetest.register_alias("hardenedclay:hardened_clay_cyan", "mcl_colorblocks:hardened_clay_cyan") -minetest.register_alias("hardenedclay:hardened_clay_pink", "mcl_colorblocks:hardened_clay_pink") -minetest.register_alias("hardenedclay:hardened_clay_magenta", "mcl_colorblocks:hardened_clay_magenta") -minetest.register_alias("hardenedclay:hardened_clay_purple", "mcl_colorblocks:hardened_clay_purple") -minetest.register_alias("hardenedclay:hardened_clay_green", "mcl_colorblocks:hardened_clay_green") -minetest.register_alias("hardenedclay:hardened_clay_dark_green", "mcl_colorblocks:hardened_clay_dark_green") -minetest.register_alias("hardenedclay:hardened_clay_white", "mcl_colorblocks:hardened_clay_white") -minetest.register_alias("hardenedclay:hardened_clay_gray", "mcl_colorblocks:hardened_clay_grey") -minetest.register_alias("hardenedclay:hardened_clay_light_gray", "mcl_colorblocks:hardened_clay_grey") -minetest.register_alias("hardenedclay:hardened_clay_dark_gray", "mcl_colorblocks:hardened_clay_dark_grey") -minetest.register_alias("hardenedclay:hardened_clay_black", "mcl_colorblocks:hardened_clay_black") - ---====================== ---carpet3d ---====================== -minetest.register_alias("carpet3d:white", "mcl_wool:white_carpet") -minetest.register_alias("carpet3d:grey", "mcl_wool:grey_carpet") -minetest.register_alias("carpet3d:silver", "mcl_wool:silver_carpet") -minetest.register_alias("carpet3d:black", "mcl_wool:black_carpet") -minetest.register_alias("carpet3d:red", "mcl_wool:red_carpet") -minetest.register_alias("carpet3d:yellow", "mcl_wool:yellow_carpet") -minetest.register_alias("carpet3d:green", "mcl_wool:green_carpet") -minetest.register_alias("carpet3d:cyan", "mcl_wool:cyan_carpet") -minetest.register_alias("carpet3d:blue", "mcl_wool:blue_carpet") -minetest.register_alias("carpet3d:magenta", "mcl_wool:magenta_carpet") -minetest.register_alias("carpet3d:orange", "mcl_wool:orange_carpet") -minetest.register_alias("carpet3d:purple", "mcl_wool:purple_carpet") -minetest.register_alias("carpet3d:brown", "mcl_wool:brown_carpet") -minetest.register_alias("carpet3d:pink", "mcl_wool:pink_carpet") -minetest.register_alias("carpet3d:lime", "mcl_wool:lime_carpet") -minetest.register_alias("carpet3d:light_blue", "mcl_wool:light_blue_carpet") -minetest.register_alias("carpet3d:dark_grey", "mcl_wool:dark_grey_carpet") -minetest.register_alias("carpet3d:dark_green", "mcl_wool:dark_green_carpet") - ---====================== ---carts ---====================== -minetest.register_alias("carts:rail", "mcl_minecarts:rail") -minetest.register_alias("carts:powerrail", "mcl_minecarts:golden_rail") -minetest.register_alias("carts:brakerail", "mcl_minecarts:rail") - ---====================== ---default to mcl_core ---====================== -minetest.register_alias("default:stone", "mcl_core:stone") -minetest.register_alias("default:savannastone", "mcl_core:stone") -minetest.register_alias("default:desert_stone", "mcl_core:redsandstone") -minetest.register_alias("default:granite", "mcl_core:granite") -minetest.register_alias("default:granite_smooth", "mcl_core:granite_smooth") -minetest.register_alias("default:diorite", "mcl_core:diorite") -minetest.register_alias("default:diorite_smooth", "mcl_core:diorite_smooth") -minetest.register_alias("default:andesite", "mcl_core:andesite") -minetest.register_alias("default:andesite_smooth", "mcl_core:andesite_smooth") - - -minetest.register_alias("default:stone_with_coal", "mcl_core:stone_with_coal") -minetest.register_alias("default:desert_stone_with_coal", "mcl_core:stone_with_coal") -minetest.register_alias("default:stone_with_iron", "mcl_core:stone_with_iron") -minetest.register_alias("default:desert_stone_with_iron", "mcl_core:stone_with_iron") -minetest.register_alias("default:stone_with_gold", "mcl_core:stone_with_gold") -minetest.register_alias("default:desert_stone_with_gold", "mcl_core:stone_with_gold") -minetest.register_alias("default:stone_with_diamond", "mcl_core:stone_with_diamond") -minetest.register_alias("default:stone_with_emerald", "mcl_core:stone_with_emerald") -minetest.register_alias("default:sand_with_diamond", "mcl_core:stone_with_diamond") -minetest.register_alias("default:rack_with_diamond", "mcl_core:stone_with_diamond") -minetest.register_alias("default:stone_with_mese", "mcl_core:stone_with_redstone") -minetest.register_alias("mcl_core:stone_with_mese", "mcl_core:stone_with_redstone") - - -minetest.register_alias("default:dirt_with_grass", "mcl_core:dirt_with_grass") -minetest.register_alias("default:dirt_with_dry_grass", "mcl_core:coarse_dirt") -minetest.register_alias("default:grass_path", "mcl_core:grass_path") -minetest.register_alias("default:dirt_with_snow", "mcl_core:dirt_with_grass_snow") -minetest.register_alias("default:dirt_with_grass_footsteps", "mcl_core:dirt_with_grass_footsteps") -minetest.register_alias("default:podzol", "mcl_core:podzol") -minetest.register_alias("default:dirt_with_rainforest_litter", "mcl_core:podzol") -minetest.register_alias("default:mycelium", "mcl_core:mycelium") -minetest.register_alias("default:mycelium_snow", "mcl_core:mycelium_snow") -minetest.register_alias("default:dirt", "mcl_core:dirt") -minetest.register_alias("default:coarse_dirt", "mcl_core:coarse_dirt") - -minetest.register_alias("default:sand", "mcl_core:sand") -minetest.register_alias("default:sandstone", "mcl_core:sandstone") -minetest.register_alias("default:sandstone_block", "mcl_core:sandstonesmooth") -minetest.register_alias("default:sandstonebrick", "mcl_core:sandstonecarved") -minetest.register_alias("default:desert_sand", "mcl_core:redsand") -minetest.register_alias("default:desertsandstone", "mcl_core:redsandstone") -minetest.register_alias("default:desert_stone_block", "mcl_core:redsandstonesmooth") -minetest.register_alias("default:desert_stonebrick", "mcl_core:redsandstonecarved") - -minetest.register_alias("default:gravel", "mcl_core:gravel") -minetest.register_alias("default:clay", "mcl_core:clay") -minetest.register_alias("default:brick", "mcl_core:brick_block") -minetest.register_alias("default:fossil", "mcl_core:bone_block") -minetest.register_alias("default:coalblock", "mcl_core:coalblock") - -minetest.register_alias("default:stonebrick", "mcl_core:stonebrick") -minetest.register_alias("default:stone_block", "mcl_core:stonebrickcarved") -minetest.register_alias("default:stonebrickcarved", "mcl_core:stonebrickcarved") -minetest.register_alias("default:stonebrickcracked", "mcl_core:stonebrickcracked") - - -minetest.register_alias("default:obsidian", "mcl_core:obsidian") -minetest.register_alias("default:obsidianbrick", "mcl_nether:nether_brick") -minetest.register_alias("default:obsidianblock", "mcl_nether:nether_brick") - -minetest.register_alias("default:bush_leaves", "mcl_core:leaves") -minetest.register_alias("default:bush_stem", "mcl_core:tree") -minetest.register_alias("default:bush_sapling", "mcl_core:sapling") -minetest.register_alias("default:bush_acacia_leaves", "mcl_core:acacialeaves") -minetest.register_alias("default:acacia_bush_leaves", "mcl_core:acacialeaves") -minetest.register_alias("default:bush_acacia_stem", "mcl_core:acaciatree") -minetest.register_alias("default:acacia_bush_stem", "mcl_core:acaciatree") -minetest.register_alias("default:bush_acacia_sapling", "mcl_core:acaciasapling") - -minetest.register_alias("default:tree", "mcl_core:tree") -minetest.register_alias("default:jungletree", "mcl_core:jungletree") -minetest.register_alias("default:aspen_tree", "mcl_core:birchtree") ---minetest.register_alias("default:acacia_tree", "mcl_core:acaciatree") -minetest.register_alias("default:pine_tree", "mcl_core:sprucetree") - -minetest.register_alias("default:wood", "mcl_core:wood") -minetest.register_alias("default:junglewood", "mcl_core:junglewood") -minetest.register_alias("default:aspen_wood", "mcl_core:birchwood") -minetest.register_alias("default:acacia_wood", "mcl_core:acaciawood") -minetest.register_alias("default:pine_wood", "mcl_core:sprucewood") - -minetest.register_alias("default:leaves", "mcl_core:leaves") -minetest.register_alias("default:jungleleaves", "mcl_core:jungleleaves") -minetest.register_alias("default:aspen_leaves", "mcl_core:birchleaves") ---minetest.register_alias("default:acacia_leaves", "mcl_core:acacialeaves") -minetest.register_alias("default:pine_needles", "mcl_core:spruceleaves") - -minetest.register_alias("default:sapling", "mcl_core:sapling") -minetest.register_alias("default:junglesapling", "mcl_core:junglesapling") -minetest.register_alias("default:aspen_sapling", "mcl_core:birchsapling") -minetest.register_alias("default:acacia_sapling", "mcl_core:acaciasapling") -minetest.register_alias("default:pine_sapling", "mcl_core:sprucesapling") - -minetest.register_alias("default:junglegrass", "mcl_flowers:fern") -minetest.register_alias("default:grass", "mcl_flowers:tallgrass") -minetest.register_alias("default:grass_1", "mcl_flowers:tallgrass") -minetest.register_alias("default:grass_2", "mcl_flowers:tallgrass") -minetest.register_alias("default:grass_3", "mcl_flowers:tallgrass") -minetest.register_alias("default:grass_4", "mcl_flowers:tallgrass") -minetest.register_alias("default:grass_5", "mcl_flowers:tallgrass") -minetest.register_alias("default:dry_grass", "mcl_flowers:tallgrass") -minetest.register_alias("default:dry_grass_1", "mcl_flowers:tallgrass") -minetest.register_alias("default:dry_grass_2", "mcl_flowers:tallgrass") -minetest.register_alias("default:dry_grass_3", "mcl_flowers:tallgrass") -minetest.register_alias("default:dry_grass_4", "mcl_flowers:tallgrass") -minetest.register_alias("default:dry_grass_5", "mcl_flowers:tallgrass") - - -minetest.register_alias("default:cactus", "mcl_core:cactus") -minetest.register_alias("default:dry_shrub", "mcl_core:deadbush") -minetest.register_alias("default:papyrus", "mcl_core:reeds") - -minetest.register_alias("default:bookshelf", "mcl_books:bookshelf") -minetest.register_alias("default:glass", "mcl_core:glass") -minetest.register_alias("default:obsidian_glass", "mcl_core:glass") - -minetest.register_alias("default:ladder_wood", "mcl_core:ladder") -minetest.register_alias("default:ladder", "mcl_core:ladder") -minetest.register_alias("default:wood", "mcl_core:wood") -minetest.register_alias("default:mese", "mcl_core:redstone_block") -minetest.register_alias("default:cloud", "mcl_core:cloud") -minetest.register_alias("default:void", "mcl_core:void") -minetest.register_alias("default:dummy", "mcl_core:void") -minetest.register_alias("default:bedrock", "mcl_core:bedrock") -minetest.register_alias("default:water_flowing", "mcl_core:water_flowing") -minetest.register_alias("default:water_source", "mcl_core:water_source") -minetest.register_alias("default:river_water_flowing", "mcl_core:water_flowing") -minetest.register_alias("default:river_water_source", "mcl_core:water_source") -minetest.register_alias("default:lava_flowing", "mcl_core:lava_flowing") -minetest.register_alias("default:lava_source", "mcl_core:lava_source") -minetest.register_alias("default:torch", "mcl_core:torch") -minetest.register_alias("default:sign_wall", "mcl_signs:wall_sign") -minetest.register_alias("default:sign_wall_wood", "mcl_signs:wall_sign") - -minetest.register_alias("default:furnace", "mcl_core:furnace") -minetest.register_alias("bones:bones", "mcl_chests:chest") -minetest.register_alias("default:chest", "mcl_chests:chest") -minetest.register_alias("default:locked_chest", "mcl_chests:chest") -minetest.register_alias("default:cobble", "mcl_core:cobble") -minetest.register_alias("default:mossycobble", "mcl_core:mossycobble") -minetest.register_alias("default:stonebrickmossy", "mcl_core:stonebrickmossy") -minetest.register_alias("default:desert_cobble", "mcl_core:mossycobble") - -minetest.register_alias("default:steelblock", "mcl_core:ironblock") -minetest.register_alias("default:goldblock", "mcl_core:goldblock") -minetest.register_alias("default:diamondblock", "mcl_core:diamondblock") -minetest.register_alias("default:emeraldblock", "mcl_core:emeraldblock") -minetest.register_alias("default:meselamp", "mcl_nether:glowstone") -minetest.register_alias("default:meselamp", "mcl_nether:glowstone") -minetest.register_alias("default:mese", "mesecons_torch:redstoneblock") - -minetest.register_alias("default:coral_brown", "mcl_core:coalblock") -minetest.register_alias("default:coral_orange", "mcl_core:coalblock") -minetest.register_alias("default:coral_skeleton", "mcl_core:coalblock") - - - -minetest.register_alias("default:nyancat", "mcl_core:nyancat") -minetest.register_alias("default:nyancat_rainbow", "mcl_core:nyancat_rainbow") -minetest.register_alias("default:apple", "mcl_flowers:tallgrass") --did this to fix map - - - - -minetest.register_alias("default:torch", "mcl_torches:torch") -minetest.register_alias("torches:torch", "mcl_torches:torch") -minetest.register_alias("default:torch_wall", "mcl_torches:torch_wall") -minetest.register_alias("torches:wall", "mcl_torches:torch") -minetest.register_alias("default:torch_floor", "mcl_torches:torch_floor") -minetest.register_alias("torches:floor", "mcl_torches:torch") -minetest.register_alias("default:torch_ceiling", "mcl_torches:torch") -minetest.register_alias("torches:ceiling", "mcl_torches:torch") - - -minetest.register_alias("default:furnace", "mcl_furnaces:furnace") -minetest.register_alias("default:furnace_active", "mcl_furnaces:furnace_active") - - -minetest.register_alias("default:snow", "mcl_core:snow") -minetest.register_alias("default:snowblock", "mcl_core:snowblock") -minetest.register_alias("default:ice", "mcl_core:ice") - --- Aliases for corrected pine node names -minetest.register_alias("default:pinetree", "mcl_core:sprucetree") -minetest.register_alias("default:pinewood", "mcl_core:sprucewood") - -minetest.register_alias("default:sign_wall", "mcl_core:sign_wall_wood") -minetest.register_alias("default:fence_wood", "mcl_fences:fence") -minetest.register_alias("default:fence_oak_wood", "mcl_fences:dark_oak_fence") -minetest.register_alias("default:fence_pine_wood", "mcl_fences:spruce_fence") -minetest.register_alias("default:fence_aspen_wood", "mcl_fences:birch_fence") -minetest.register_alias("default:fence_acacia_wood", "mcl_fences:acacia_fence") -minetest.register_alias("default:fence_junglewood", "mcl_fences:jungle_fence") - ---====================== ---door ---====================== -minetest.register_alias("doors:door_wood", "mcl_doors:dark_oak_door") -minetest.register_alias("doors:trapdoor_wood", "mcl_doors:dark_oak_door") -minetest.register_alias("doors:trapdoor_steel", "mcl_doors:dark_oak_door") -minetest.register_alias("doors:hidden", "air") ---minetest.register_alias("doors:hidden", "mcl_doors:dark_oak_door_t_1") -minetest.register_alias("doors:door_wood_a", "mcl_doors:dark_oak_door_b_1") -minetest.register_alias("doors:door_wood_a_2", "mcl_doors:dark_oak_door_b_1") -minetest.register_alias("doors:door_wood_b", "mcl_doors:dark_oak_door_b_2") - ---old style -minetest.register_alias("doors:door_wood_b_1", "mcl_doors:dark_oak_door_b_1") -minetest.register_alias("doors:door_wood_b_2", "mcl_doors:dark_oak_door_b_2") -minetest.register_alias("doors:door_wood_t_1", "mcl_doors:dark_oak_door_t_1") -minetest.register_alias("doors:door_wood_t_2", "mcl_doors:dark_oak_door_t_2") - -minetest.register_alias("doors:door_steel_b", "mcl_doors:iron_door_b_1") -minetest.register_alias("doors:door_steel_b_1", "mcl_doors:iron_door_b_1") -minetest.register_alias("doors:door_steel_b_2", "mcl_doors:iron_door_b_2") -minetest.register_alias("doors:door_steel_a", "mcl_doors:iron_door_t_1") -minetest.register_alias("doors:door_steel_t_1", "mcl_doors:iron_door_t_1") -minetest.register_alias("doors:door_steel_t_2", "mcl_doors:iron_door_t_2") - - ---====================== ---farming oh boy... ---====================== ---tomato -minetest.register_alias("farming:tomato", "farming:carrot") -minetest.register_alias("farming:tomato_1", "mcl_flowers:tallgrass") -minetest.register_alias("farming:tomato_2", "mcl_flowers:tallgrass") -minetest.register_alias("farming:tomato_3", "mcl_flowers:tallgrass") -minetest.register_alias("farming:tomato_4", "mcl_flowers:tallgrass") -minetest.register_alias("farming:tomato_5", "mcl_flowers:tallgrass") -minetest.register_alias("farming:tomato_6", "mcl_flowers:tallgrass") -minetest.register_alias("farming:tomato_7", "mcl_flowers:tallgrass") -minetest.register_alias("farming:tomato_8", "mcl_farming:melon") - ---cucumber -minetest.register_alias("farming:cucumber", "farming:carrot") -minetest.register_alias("farming:cucumber_1", "mcl_flowers:tallgrass") -minetest.register_alias("farming:cucumber_2", "mcl_flowers:tallgrass") -minetest.register_alias("farming:cucumber_3", "mcl_flowers:tallgrass") -minetest.register_alias("farming:cucumber_4", "mcl_flowers:tallgrass") - ---raspberry -minetest.register_alias("farming:raspberries", "farming:carrot") -minetest.register_alias("farming:smoothie_raspberry", "mcl_flowers:tallgrass") -minetest.register_alias("farming:raspberry_1", "mcl_flowers:tallgrass") -minetest.register_alias("farming:raspberry_2", "mcl_flowers:tallgrass") -minetest.register_alias("farming:raspberry_3", "mcl_flowers:tallgrass") -minetest.register_alias("farming:raspberry_4", "mcl_flowers:tallgrass") - ---blueberry -minetest.register_alias("farming:blueberries", "farming:carrot") -minetest.register_alias("farming:muffin_blueberry", "farming:bread") -minetest.register_alias("farming:blueberry_1", "mcl_flowers:tallgrass") -minetest.register_alias("farming:blueberry_2", "mcl_flowers:tallgrass") -minetest.register_alias("farming:blueberry_3", "mcl_flowers:tallgrass") -minetest.register_alias("farming:blueberry_4", "mcl_flowers:tallgrass") - ---rhubarb -minetest.register_alias("farming:rhubarb", "mcl_flowers:tallgrass") -minetest.register_alias("farming:rhubarb_pie", "mcl_flowers:tallgrass") -minetest.register_alias("farming:rhubarb_1", "mcl_flowers:tallgrass") -minetest.register_alias("farming:rhubarb_2", "mcl_flowers:tallgrass") -minetest.register_alias("farming:rhubarb_3", "mcl_flowers:tallgrass") - ---beans -minetest.register_alias("farming:beanpole", "mcl_flowers:tallgrass") -minetest.register_alias("farming:beans", "farming:carrot") -minetest.register_alias("farming:beanbush", "mcl_flowers:tallgrass") -minetest.register_alias("farming:beanpole_1", "mcl_flowers:tallgrass") -minetest.register_alias("farming:beanpole_2", "mcl_flowers:tallgrass") -minetest.register_alias("farming:beanpole_3", "mcl_flowers:tallgrass") -minetest.register_alias("farming:beanpole_4", "mcl_flowers:tallgrass") -minetest.register_alias("farming:beanpole_5", "mcl_flowers:tallgrass") - ---grapes -minetest.register_alias("farming:grapes", "mcl_farming:carrot") -minetest.register_alias("farming:trellis", "mcl_flowers:tallgrass") -minetest.register_alias("farming:grapebush", "mcl_flowers:tallgrass") -minetest.register_alias("farming:grapes_1", "mcl_flowers:tallgrass") -minetest.register_alias("farming:grapes_2", "mcl_flowers:tallgrass") -minetest.register_alias("farming:grapes_3", "mcl_flowers:tallgrass") -minetest.register_alias("farming:grapes_4", "mcl_flowers:tallgrass") -minetest.register_alias("farming:grapes_5", "mcl_flowers:tallgrass") -minetest.register_alias("farming:grapes_6", "mcl_flowers:tallgrass") -minetest.register_alias("farming:grapes_7", "mcl_flowers:tallgrass") -minetest.register_alias("farming:grapes_8", "mcl_flowers:tallgrass") - ---barley -minetest.register_alias("farming:barley", "mcl_flowers:tallgrass") -minetest.register_alias("farming:barley_1", "mcl_farming:hay_block") -minetest.register_alias("farming:barley_2", "mcl_farming:hay_block") -minetest.register_alias("farming:barley_3", "mcl_flowers:tallgrass") -minetest.register_alias("farming:barley_4", "mcl_flowers:tallgrass") -minetest.register_alias("farming:barley_5", "mcl_flowers:tallgrass") -minetest.register_alias("farming:barley_6", "mcl_flowers:tallgrass") -minetest.register_alias("farming:barley_7", "mcl_flowers:tallgrass") -minetest.register_alias("farming:seed_barley", "mcl_farming:hay_block") - ---coffee -minetest.register_alias("farming:coffee", "mcl_farming:carrot") -minetest.register_alias("farming:coffee_cup_hot", "mcl_farming:carrot") -minetest.register_alias("farming:coffee_cup", "mcl_farming:carrot") -minetest.register_alias("farming:drinking_cup", "mcl_farming:carrot") -minetest.register_alias("farming:coffee_beans", "mcl_farming:carrot") -minetest.register_alias("farming:coffee_1", "mcl_flowers:tallgrass") -minetest.register_alias("farming:coffee_2", "mcl_flowers:tallgrass") -minetest.register_alias("farming:coffee_3", "mcl_flowers:tallgrass") -minetest.register_alias("farming:coffee_4", "mcl_flowers:tallgrass") -minetest.register_alias("farming:coffee_5", "mcl_flowers:tallgrass") - ---FARMING EXISTING -minetest.register_alias("farming:soil", "mcl_farming:soil") -minetest.register_alias("farming:soil_wet", "mcl_farming:soil_wet") - - -minetest.register_alias("farming:pumpkin", "mcl_farming:pumpkin_7") -minetest.register_alias("farming:pumpkin_slice", "mcl_farming:melon_slice") -minetest.register_alias("farming:pumpkin_1", "mcl_farming:pumpkin_7") -minetest.register_alias("farming:pumpkin_2", "mcl_farming:pumpkin_7") -minetest.register_alias("farming:pumpkin_3", "mcl_farming:pumpkin_7") -minetest.register_alias("farming:pumpkin_4", "mcl_farming:pumpkin_7") -minetest.register_alias("farming:pumpkin_5", "mcl_farming:pumpkin_7") -minetest.register_alias("farming:pumpkin_6", "mcl_farming:pumpkin_7") -minetest.register_alias("farming:pumpkin_7", "mcl_farming:pumpkin_7") -minetest.register_alias("farming:pumpkin_8", "mcl_farming:pumpkin_7") - - -minetest.register_alias("farming:cocoa", "mcl_cocoas:cocoa") -minetest.register_alias("mcl_cocoas:cocoa", "mcl_dye:brown") -minetest.register_alias("farming:cocoa_beans", "mcl_dye:brown") -minetest.register_alias("farming:cocoa_1", "mcl_cocoas:cocoa_1") -minetest.register_alias("farming:cocoa_2", "mcl_cocoas:cocoa_2") -minetest.register_alias("farming:cocoa_3", "mcl_cocoas:cocoa_3") -minetest.register_alias("farming:cookie", "mcl_farming:carrot") - -minetest.register_alias("farming:melon", "mcl_farming:melon") -minetest.register_alias("farming:melon_slice", "mcl_farming:melon_slice") -minetest.register_alias("mcl_farming:melon_slice", "mcl_farming:melon") -minetest.register_alias("farming:melon_1", "mcl_farming:melontige_7") -minetest.register_alias("farming:melon_2", "mcl_farming:melontige_7") -minetest.register_alias("farming:melon_3", "mcl_farming:melontige_7") -minetest.register_alias("farming:melon_4", "mcl_farming:melontige_7") -minetest.register_alias("farming:melon_5", "mcl_farming:melontige_7") -minetest.register_alias("farming:melon_6", "mcl_farming:melontige_7") -minetest.register_alias("farming:melon_7", "mcl_farming:melontige_7") -minetest.register_alias("farming:melon_8", "mcl_farming:melontige_7") - -minetest.register_alias("farming:potato", "mcl_farming:potato") -minetest.register_alias("farming:potato_1", "mcl_farming:potato") -minetest.register_alias("farming:potato_2", "mcl_farming:potato") -minetest.register_alias("farming:potato_3", "mcl_farming:potato") -minetest.register_alias("farming:potato_4", "mcl_farming:potato") -minetest.register_alias("farming:potato_5", "mcl_farming:potato") -minetest.register_alias("farming:potato_6", "mcl_farming:potato") -minetest.register_alias("farming:potato_7", "mcl_farming:potato") -minetest.register_alias("farming:potato_8", "mcl_farming:potato") - - -minetest.register_alias("farming:carrot_gold", "mcl_farming:carrot_item_gold") -minetest.register_alias("farming:carrot", "mcl_farming:carrot") -minetest.register_alias("farming:carrot_1", "mcl_farming:carrot") -minetest.register_alias("farming:carrot_2", "mcl_farming:carrot") -minetest.register_alias("farming:carrot_3", "mcl_farming:carrot") -minetest.register_alias("farming:carrot_4", "mcl_farming:carrot") -minetest.register_alias("farming:carrot_5", "mcl_farming:carrot") -minetest.register_alias("farming:carrot_6", "mcl_farming:carrot") -minetest.register_alias("farming:carrot_7", "mcl_farming:carrot") -minetest.register_alias("farming:carrot_8", "mcl_farming:carrot") - -minetest.register_alias("farming:corn", "mcl_farming:carrot") -minetest.register_alias("farming:corn_1", "mcl_farming:carrot") -minetest.register_alias("farming:corn_2", "mcl_farming:carrot") -minetest.register_alias("farming:corn_3", "mcl_farming:carrot") -minetest.register_alias("farming:corn_4", "mcl_farming:carrot") -minetest.register_alias("farming:corn_5", "mcl_farming:carrot") -minetest.register_alias("farming:corn_6", "mcl_farming:carrot") -minetest.register_alias("farming:corn_7", "mcl_farming:carrot") -minetest.register_alias("farming:corn_8", "mcl_farming:carrot") - -minetest.register_alias("farming:wheat", "mcl_farming:wheat") -minetest.register_alias("farming:straw", "mcl_farming:wheat") -minetest.register_alias("farming:bread", "mcl_core:snow") -minetest.register_alias("farming:flour", "mcl_farming:bread") -minetest.register_alias("farming:seed_wheat", "mcl_farming:hay_block") -minetest.register_alias("mcl_farming:seed_wheat", "mcl_farming:hay_block") -minetest.register_alias("farming:wheat_1", "mcl_farming:wheat_5") -minetest.register_alias("farming:wheat_2", "mcl_farming:wheat_5") -minetest.register_alias("farming:wheat_3", "mcl_farming:wheat_5") -minetest.register_alias("farming:wheat_4", "mcl_farming:wheat_5") -minetest.register_alias("farming:wheat_5", "mcl_farming:wheat_5") -minetest.register_alias("farming:wheat_6", "mcl_farming:wheat_5") -minetest.register_alias("farming:wheat_7", "mcl_farming:wheat_5") -minetest.register_alias("farming:wheat_8", "mcl_farming:wheat_5") - -minetest.register_alias("farming:cotton", "mcl_farming:wheat") -minetest.register_alias("farming:seed_cotton", "mcl_farming:wheat") -minetest.register_alias("farming:cotton_1", "mcl_farming:wheat_5") -minetest.register_alias("farming:cotton_2", "mcl_farming:wheat_5") -minetest.register_alias("farming:cotton_3", "mcl_farming:wheat_5") -minetest.register_alias("farming:cotton_4", "mcl_farming:wheat_5") -minetest.register_alias("farming:cotton_5", "mcl_farming:wheat_5") -minetest.register_alias("farming:cotton_6", "mcl_farming:wheat_5") -minetest.register_alias("farming:cotton_7", "mcl_farming:wheat_5") -minetest.register_alias("farming:cotton_8", "mcl_farming:wheat_5") - - ---====================== ---Fire ---====================== -minetest.register_alias("default:underground_fire", "mcl_fire:eternal_fire") -minetest.register_alias("nether:permanent_flame", "mcl_fire:eternal_fire") -minetest.register_alias("default:permanent_flame", "mcl_fire:eternal_fire") -minetest.register_alias("fire:permanent_flame", "mcl_fire:eternal_fire") -minetest.register_alias("default:basic_flame", "mcl_fire:fire") -minetest.register_alias("fire:basic_flame", "mcl_fire:fire") - ---====================== ---flowers ---====================== -minetest.register_alias("flowers:rose", "mcl_flowers:poppy") -minetest.register_alias("flowers:tulip", "mcl_flowers:blue_orchid") -minetest.register_alias("flowers:dandelion_yellow", "mcl_flowers:dandelion") -minetest.register_alias("flowers:geranium", "mcl_flowers:tulip_orange") -minetest.register_alias("flowers:viola", "mcl_flowers:tulip_pink") -minetest.register_alias("flowers:dandelion_white", "mcl_flowers:oxeye_daisy") -minetest.register_alias("flowers:waterlily", "mcl_flowers:waterlily") -minetest.register_alias("flowers:mushroom_brown", "mcl_mushrooms:mushroom_brown") -minetest.register_alias("flowers:mushroom_red", "mcl_mushrooms:mushroom_red") - ---====================== ---hoppers ---====================== -minetest.register_alias("hopper:hopper_item", "mcl_hoppers:hopper") -minetest.register_alias("hopper:hopper", "mcl_hoppers:hopper") -minetest.register_alias("hopper:hopper_side", "mcl_hoppers:hopper_side") - ---====================== ---mesecons ---====================== -minetest.register_alias("dispenser:dispenser", "mcl_dispensers:dispenser") -minetest.register_alias("dropper:dropper", "mcl_droppers:dropper") -minetest.register_alias("dropper:dropper", "mcl_droppers:dropper") -minetest.register_alias("mesecons_button:button_off", "mesecons_button:button_stone_off") -minetest.register_alias("mesecons_button:button_on", "mesecons_button:button_stone_on") -minetest.register_alias("mesecons_luacontroller:luacontroller0000", "mesecons_delayer:delayer_off_1") -minetest.register_alias("mesecons_random:ghoststone", "mesecons_delayer:delayer_off_1") - - ---====================== ---MC2 Andisite,granite,diorite ---====================== -minetest.register_alias("default:marble", "mcl_core:andesite") -minetest.register_alias("default:marble_bricks", "mcl_core:andesite_smooth") -minetest.register_alias("default:granite_bricks", "mcl_core:granite_smooth") - ---====================== ---Enderchest ---====================== -minetest.register_alias("enderchest:enderchest", "mcl_chests:ender_chest") -minetest.register_alias("mcl_core:enderchest", "mcl_chests:ender_chest") - ---====================== ---End ---====================== -minetest.register_alias("default:end_stone", "mcl_end:end_stone") -minetest.register_alias("default:end_bricks", "mcl_end:end_bricks") -minetest.register_alias("default:purpur_block", "mcl_end:purpur_block") -minetest.register_alias("default:purpur_pillar", "mcl_end:purpur_pillar") -minetest.register_alias("default:chorus_flower_dead", "mcl_end:chorus_flower_dead") -minetest.register_alias("default:chorus_plant", "mcl_end:chorus_plant") -minetest.register_alias("default:chorus_fruit", "mcl_end:chorus_fruit") -minetest.register_alias("default:chorus_fruit_popped", "mcl_end:chorus_fruit_popped") - ---====================== ---MC2 chests ---====================== -minetest.register_alias("mcl_core:chest", "mcl_chests:chest") -minetest.register_alias("default:chest", "mcl_chests:chest") -minetest.register_alias("default:chest_locked", "mcl_chests:chest") - ---====================== ---nssm ---====================== -minetest.register_alias("nssm:ant_dirt", "mcl_core:coarse_dirt") - ---====================== ---Nyancat ---====================== -minetest.register_alias("nyancat:nyancat", "mcl_core:diamondblock") -minetest.register_alias("nyancat:rainbow", "mcl_core:emeraldblock") -minetest.register_alias("nyancat:nyancat_rainbow", "mcl_core:emeraldblock") - - ---====================== ---alias to remove old quartz from maps ---====================== ---minetest.register_alias("default:quartz_crystal", "mcl_nether:quartz") -minetest.register_alias("default:quartz_ore", "mcl_nether:quartz_ore") -minetest.register_alias("default:block", "mcl_nether:quartz_block") -minetest.register_alias("default:chiseled", "mcl_nether:quartz_chiseled") -minetest.register_alias("default:pillar", "mcl_nether:quartz_pillar") -minetest.register_alias("default:pillar_horizontal", "mcl_nether:quartz_pillar_horizontal") - ---====================== ---alias to merge default-nether to mcl_core ---====================== -minetest.register_alias("default:rack", "mcl_nether:netherrack") -minetest.register_alias("default:quartz_ore", "mcl_nether:quartz_ore") -minetest.register_alias("default:quartz_crystal", "mcl_nether:quartz_crystal") -minetest.register_alias("default:nitherbrick", "mcl_nether:nether_brick") -minetest.register_alias("default:obsidiannitherbrick", "mcl_nether:nether_brick") -minetest.register_alias("default:glowstone", "mcl_nether:glowstone") -minetest.register_alias("default:glowstone_dust", "mcl_nether:glowstone_dust") -minetest.register_alias("default:rack_with_diamond", "mcl_core:stone_with_diamond") -minetest.register_alias("default:slowsand", "mcl_nether:soul_sand") -minetest.register_alias("default:fence_nither", "mcl_fences:nether_brick_fence") - ---====================== ---alias to merge nether to mcl_core ---====================== -minetest.register_alias("nether:rack", "mcl_nether:netherrack") -minetest.register_alias("nether:quartz_ore", "mcl_nether:quartz_ore") -minetest.register_alias("nether:quartz_crystal", "mcl_nether:quartz_crystal") -minetest.register_alias("nether:nitherbrick", "mcl_nether:nether_brick") -minetest.register_alias("nether:obsidiannitherbrick", "mcl_nether:nether_brick") -minetest.register_alias("nether:glowstone", "mcl_nether:glowstone") -minetest.register_alias("nether:glowstone_dust", "mcl_nether:glowstone_dust") -minetest.register_alias("nether:rack_with_diamond", "mcl_core:stone_with_diamond") -minetest.register_alias("nether:sand", "mcl_nether:soul_sand") -minetest.register_alias("nether:portal", "mcl_portals:portal") -minetest.register_alias("nether:fence_nither", "mcl_fences:nether_brick_fence") - - ---====================== ---stairs ---====================== -minetest.register_alias("stairs:slab_marble", "mcl_stairs:slab_stone") -minetest.register_alias("stairs:stair_marble", "mcl_stairs:stair_stone") -minetest.register_alias("stairs:slab_marble_bricks", "mcl_stairs:slab_stone") -minetest.register_alias("stairs:stair_marble_bricks", "mcl_stairs:stair_stone") -minetest.register_alias("stairs:slab_granite", "mcl_stairs:slab_sandstone") -minetest.register_alias("stairs:stair_granite", "mcl_stairs:stair_sandstone") -minetest.register_alias("stairs:slab_granite_bricks", "mcl_stairs:slab_stone") -minetest.register_alias("stairs:stair_granite_bricks", "mcl_stairs:stair_stone") - -minetest.register_alias("stairs:stair_andesite", "mcl_stairs:stair_sandstone") -minetest.register_alias("stairs:slab_andesite", "mcl_stairs:slab_stone") -minetest.register_alias("stairs:stair_diorite", "mcl_stairs:stair_sandstone") -minetest.register_alias("stairs:slab_diorite", "mcl_stairs:slab_stone") - -minetest.register_alias("stairs:stair_mossycobble", "mcl_stairs:stair_cobble") -minetest.register_alias("stairs:slab_mossycobble", "mcl_stairs:slab_cobble") -minetest.register_alias("stairs:stair_desert_cobble", "mcl_stairs:stair_sandstone") -minetest.register_alias("stairs:slab_desert_cobble", "mcl_stairs:slab_sandstone") -minetest.register_alias("stairs:stair_desert_stone", "mcl_stairs:stair_redsandstone") -minetest.register_alias("stairs:slab_desert_stone", "mcl_stairs:slab_redsandstone") -minetest.register_alias("stairs:stair_desert_stonebrick", "mcl_stairs:stair_redsandstone") -minetest.register_alias("stairs:slab_desert_stonebrick", "mcl_stairs:slab_redsandstone") - -minetest.register_alias("stairs:stair_stone", "mcl_stairs:stair_stonebrick") - -minetest.register_alias("stairs:stair_obsidianbrick", "mcl_stairs:stair_cobble") -minetest.register_alias("stairs:slab_obsidianbrick", "mcl_stairs:slab_stone") -minetest.register_alias("stairs:stair_obsidian", "mcl_stairs:stair_cobble") -minetest.register_alias("stairs:slab_obsidian", "mcl_stairs:slab_stone") - -minetest.register_alias("stairs:stair_sandstonebrick", "mcl_stairs:stair_sandstone") -minetest.register_alias("stairs:slab_sandstonebrick", "mcl_stairs:slab_sandstone") - -minetest.register_alias("stairs:stair_nitherbrick", "mcl_stairs:stair_nether_brick") -minetest.register_alias("stairs:slab_nitherbrick", "mcl_stairs:slab_nether_brick") -minetest.register_alias("stairs:stair_netherbrick", "mcl_stairs:stair_nether_brick") -minetest.register_alias("stairs:slab_netherbrick", "mcl_stairs:slab_nether_brick") - -minetest.register_alias("stairs:stair_brick", "mcl_stairs:slab_brick_block") -minetest.register_alias("stairs:slab_brick", "mcl_stairs:slab_brick_block") - -minetest.register_alias("stairs:stair_steelblock", "mcl_stairs:stair_cobble") -minetest.register_alias("stairs:slab_steelblock", "mcl_stairs:slab_cobble") -minetest.register_alias("stairs:stair_goldblock", "mcl_stairs:stair_cobble") -minetest.register_alias("stairs:slab_goldblock", "mcl_stairs:slab_cobble") - -minetest.register_alias("stairs:stair_pine_wood", "mcl_stairs:stair_sprucewood") -minetest.register_alias("stairs:slab_pine_wood", "mcl_stairs:slab_sprucewood") -minetest.register_alias("stairs:stair_acacia_wood", "mcl_stairs:stair_acaciawood") -minetest.register_alias("stairs:slab_acacia_wood", "mcl_stairs:slab_acaciawood") -minetest.register_alias("stairs:stair_aspen_wood", "mcl_stairs:stair_birchwood") -minetest.register_alias("stairs:slab_aspen_wood", "mcl_stairs:slab_birchwood") - ---corners -minetest.register_alias("default:cobble_innerstair", "mcl_stairs:slab_cobble") -minetest.register_alias("default:cobble_outerstair", "mcl_stairs:slab_cobble") - - ---====================== ---alias for es stuff and misc ---====================== -minetest.register_alias("esmobs:bones", "mcl_core:chest") -minetest.register_alias("es:emerald_crystal", "mcl_core:emerald_crystal") -minetest.register_alias("vines:rope_block", "mcl_tools:pick_gold") -minetest.register_alias("vines:shears", "mcl_tools:pick_gold") -minetest.register_alias("vines:vine", "mcl_core:vine") -minetest.register_alias("vines:vine_middle", "mcl_core:vine") -minetest.register_alias("vines:vine_end", "mcl_core:vine") -minetest.register_alias("vines:root", "mcl_core:vine") -minetest.register_alias("vines:root_middle", "mcl_core:vine") -minetest.register_alias("vines:root_end", "mcl_core:vine") -minetest.register_alias("vines:side", "mcl_core:vine") -minetest.register_alias("vines:side_middle", "mcl_core:vine") -minetest.register_alias("vines:side_end", "mcl_core:vine") -minetest.register_alias("vines:jungle", "mcl_core:vine") -minetest.register_alias("vines:jungle_middle", "mcl_core:vine") -minetest.register_alias("vines:jungle_end", "mcl_core:vine") - ---====================== ---woodsoils ---====================== -minetest.register_alias("woodsoils:dirt_with_leaves_1", "mcl_core:podzol") -minetest.register_alias("woodsoils:dirt_with_leaves_2", "mcl_core:podzol") -minetest.register_alias("woodsoils:grass_with_leaves_1", "mcl_core:podzol") -minetest.register_alias("woodsoils:grass_with_leaves_2", "mcl_core:podzol") - ---====================== ---walls ---====================== -minetest.register_alias("walls:cobble", "mcl_walls:cobble") -minetest.register_alias("walls:desertcobble", "mcl_walls:cobble") -minetest.register_alias("walls:mossycobble", "mcl_walls:cobble") - ---====================== ---wool ---====================== -minetest.register_alias("wool:white", "mcl_wool:white") -minetest.register_alias("wool:grey", "mcl_wool:grey") -minetest.register_alias("wool:black", "mcl_wool:black") -minetest.register_alias("wool:red", "mcl_wool:red") -minetest.register_alias("wool:yellow", "mcl_wool:yellow") -minetest.register_alias("wool:green", "mcl_wool:green") -minetest.register_alias("wool:cyan", "mcl_wool:cyan") -minetest.register_alias("wool:blue", "mcl_wool:blue") -minetest.register_alias("wool:magenta", "mcl_wool:magenta") -minetest.register_alias("wool:orange", "mcl_wool:orange") -minetest.register_alias("wool:violet", "mcl_wool:purple") -minetest.register_alias("mcl_wool:violet", "mcl_wool:purple") -minetest.register_alias("wool:brown", "mcl_wool:brown") -minetest.register_alias("wool:pink", "mcl_wool:pink") -minetest.register_alias("wool:dark_grey", "mcl_wool:dark_grey") -minetest.register_alias("wool:dark_green", "mcl_wool:dark_green") - ---====================== ---willages ---====================== -minetest.register_alias("mg_villages:plotmarker", "mcl_stairs:slab_stone") -minetest.register_alias("mg_villages:road", "mcl_stairs:slab_stone") -minetest.register_alias("mg_villages:road", "mcl_stairs:slab_stone") -minetest.register_alias("mg_villages:soil", "mcl_farming:soil") -minetest.register_alias("handle_schematics:support", "mcl_farming:soil") - ---====================== ---xdecor itemframes etc ---====================== -minetest.register_alias("xdecor:itemframe", "itemframes:frame") -minetest.register_alias("xdecor:f_item", "itemframes:item") -minetest.register_alias("xdecor:workbench", "mcl_anvils:anvil") ---minetest.register_alias("xdecor:enchantment_table", "mcl_crafting_table:crafting_table") -minetest.register_alias("xdecor:hammer", "mcl_anvils:anvil") ---[[ --- Nodeboxes definitions. -workbench.defs = { - -- Name Yield X Y Z W H L - {"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }}, - {"micropanel", 16, { 0, 0, 0, 16, 1, 8 }}, - {"microslab", 8, { 0, 0, 0, 16, 1, 16 }}, - {"thinstair", 8, { 0, 7, 0, 16, 1, 8 }, - { 0, 15, 8, 16, 1, 8 }}, - {"cube", 4, { 0, 0, 0, 8, 8, 8 }}, - {"panel", 4, { 0, 0, 0, 16, 8, 8 }}, - {"slab", 2, nil }, - {"doublepanel", 2, { 0, 0, 0, 16, 8, 8 }, - { 0, 8, 8, 16, 8, 8 }}, - {"halfstair", 2, { 0, 0, 0, 8, 8, 16 }, - { 0, 8, 8, 8, 8, 8 }}, - {"outerstair", 1, { 0, 0, 0, 16, 8, 16 }, - { 0, 8, 8, 8, 8, 8 }}, - {"stair", 1, nil }, - {"innerstair", 1, { 0, 0, 0, 16, 8, 16 }, - { 0, 8, 8, 16, 8, 8 }, - { 0, 8, 0, 8, 8, 8 }} -}]] ---micropanels -minetest.register_alias("default:wood_micropanel", "mcl_fences:fence") -minetest.register_alias("default:wood_nanoslab", "mcl_fences:fence") - ---====================== ---xpanes ---====================== -minetest.register_alias("xpanes:pane_flat", "xpanes:pane_natural_flat") -minetest.register_alias("xpanes:pane", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_0", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_1", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_2", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_3", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_4", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_5", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_6", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_7", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_8", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_9", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_10", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_11", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_12", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_13", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_14", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_15", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_16", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_17", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_18", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_19", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_20", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_21", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_22", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_23", "xpanes:pane_natural") -minetest.register_alias("xpanes:pane_24", "xpanes:pane_natural") - - diff --git a/mods/MISC/gt2mc2/mob_items.lua b/mods/MISC/gt2mc2/mob_items.lua deleted file mode 100644 index 259f011e..00000000 --- a/mods/MISC/gt2mc2/mob_items.lua +++ /dev/null @@ -1,161 +0,0 @@ ---====================== ---mob items and end items ---====================== -minetest.register_alias("default:end_rod", "mcl_end:end_rod") -minetest.register_alias("default:dragon_egg", "mcl_end:dragon_egg") -minetest.register_alias("mobs_mc:dragon_egg", "mcl_end:dragon_egg") -minetest.register_alias("mobs_mc:ender_eye", "mcl_end:ender_eye") -minetest.register_alias("mobs_mc:rotten_flesh", "mcl_mobitems:rotten_flesh") -minetest.register_alias("mobs_mc:mutton", "mcl_mobitems:mutton") -minetest.register_alias("mobs_mc:mutton_raw", "mcl_mobitems:mutton") -minetest.register_alias("mobs_mc:cooked_mutton", "mcl_mobitems:cooked_mutton") -minetest.register_alias("mobs_mc:beef", "mcl_mobitems:beef") -minetest.register_alias("mobs_mc:beef_raw", "mcl_mobitems:beef") -minetest.register_alias("mobs_mc:cooked_beef", "mcl_mobitems:cooked_beef") -minetest.register_alias("mobs_mc:chicken", "mcl_mobitems:chicken") -minetest.register_alias("mobs_mc:chicken_raw", "mcl_mobitems:chicken") -minetest.register_alias("mobs_mc:cooked_chicken", "mcl_mobitems:cooked_chicken") ---minetest.register_alias("mobs_mc:egg", "mcl_mobitems:egg") ---minetest.register_alias("mcl_mobitems:egg", "mobs_mc:egg") -minetest.register_alias("mcl_mobitems:egg", "mobs_mc:chicken") -minetest.register_alias("mobs_mc:porkchop", "mcl_mobitems:porkchop") -minetest.register_alias("mobs_mc:porkchop_raw", "mcl_mobitems:porkchop") -minetest.register_alias("mobs_mc:cooked_porkchop", "mcl_mobitems:cooked_porkchop") -minetest.register_alias("mobs_mc:rabbit", "mcl_mobitems:rabbit") -minetest.register_alias("mcl_mobitems:rabbit_raw", "mcl_mobitems:rabbit") -minetest.register_alias("mobs_mc:rabbit_raw", "mcl_mobitems:rabbit") -minetest.register_alias("mobs_mc:milk_bucket", "mcl_mobitems:milk_bucket") -minetest.register_alias("mobs_mc:spider_eye", "mcl_mobitems:spider_eye") -minetest.register_alias("farming:string", "mcl_mobitems:string") -minetest.register_alias("mobs_mc:bow_wood", "mcl_throwing:bow") -minetest.register_alias("mobs_mc:blaze_powder", "mcl_mobitems:blaze_powder") -minetest.register_alias("mobs_mc:magma_cream", "mcl_mobitems:magma_cream") -minetest.register_alias("mobs_mc:ghast_tear", "mcl_mobitems:ghast_tear") -minetest.register_alias("mobs_mc:horsepegh1", "mobs_mc:horse") -minetest.register_alias("mobs_mc:nether_star", "mcl_mobitems:nether_star") -minetest.register_alias("mobs_mc:leather", "mcl_mobitems:leather") -minetest.register_alias("mobs_mc:feather", "mcl_mobitems:feather") -minetest.register_alias("mobs_mc:rabbit_hide", "mcl_mobitems:rabbit_hide") -minetest.register_alias("mobs_mc:rabbit_foot", "mcl_mobitems:rabbit_foot") -minetest.register_alias("mobs_mc:rabbit_stew", "mcl_mobitems:rabbit_stew") -minetest.register_alias("mobs_mc:saddle", "mcl_mobitems:saddle") -minetest.register_alias("mobs_mc:shulker_shell", "mcl_mobitems:shulker_shell") -minetest.register_alias("mobs_mc:slimeball", "mcl_mobitems:slimeball") -minetest.register_alias("mobs_mc:carrot_on_a_stick", "mcl_mobitems:carrot_on_a_stick") - ---heads -minetest.register_alias("mobs_mc:zombie_head", "mcl_heads:zombie") -minetest.register_alias("mobs_mc:creeper_head", "mcl_heads:creeper") -minetest.register_alias("mobs_mc:enderman_head", "mcl_heads:steve") -minetest.register_alias("mobs_mc:ghast_head", "mcl_heads:steve") -minetest.register_alias("mobs_mc:skeleton_head", "mcl_heads:skeleton") -minetest.register_alias("mobs_mc:skeleton2_head", "mcl_heads:wither_skeleton") -minetest.register_alias("mobs_mc:spider_head", "mcl_heads:steve") -minetest.register_alias("mobs_mc:zombiepig_head", "mcl_heads:zombie_head") - ---Mobs Redo -minetest.register_alias("default:end_rod", "mcl_end:end_rod") -minetest.register_alias("default:dragon_egg", "mcl_end:dragon_egg") -minetest.register_alias("mobs:dragon_egg", "mcl_end:dragon_egg") -minetest.register_alias("mobs:ender_eye", "mcl_end:ender_eye") -minetest.register_alias("mobs:rotten_flesh", "mcl_mobitems:rotten_flesh") -minetest.register_alias("mobs:mutton", "mcl_mobitems:mutton") -minetest.register_alias("mobs:mutton_raw", "mcl_mobitems:mutton") -minetest.register_alias("mobs:cooked_mutton", "mcl_mobitems:cooked_mutton") -minetest.register_alias("mobs:mutton_cooked", "mcl_mobitems:cooked_mutton") -minetest.register_alias("mobs:beef", "mcl_mobitems:cooked_beef") -minetest.register_alias("mobs:beef_raw", "mcl_mobitems:cooked_beef") -minetest.register_alias("mobs:meat_raw", "mcl_mobitems:cooked_beef") -minetest.register_alias("mobs:meat", "mcl_mobitems:cooked_beef") -minetest.register_alias("mobs:cooked_beef", "mcl_mobitems:cooked_beef") -minetest.register_alias("mobs:beef_cooked", "mcl_mobitems:cooked_beef") -minetest.register_alias("mobs:chicken", "mcl_mobitems:chicken") -minetest.register_alias("mobs_animal:chicken", "mobs_mc:chicken") -minetest.register_alias("mobs:chicken_egg_fried", "mcl_mobitems:chicken") -minetest.register_alias("mobs:chicken_raw", "mcl_mobitems:chicken") -minetest.register_alias("mobs:cooked_chicken", "mcl_mobitems:cooked_chicken") -minetest.register_alias("mobs:pork_cooked", "mcl_mobitems:porkchop") -minetest.register_alias("mobs:porkchop", "mcl_mobitems:porkchop") -minetest.register_alias("mobs:pork_raw", "mcl_mobitems:porkchop") -minetest.register_alias("mobs:cooked_porkchop", "mcl_mobitems:cooked_porkchop") -minetest.register_alias("mobs:rabbit", "mcl_mobitems:rabbit") -minetest.register_alias("mobs:milk_bucket", "mcl_mobitems:milk_bucket") -minetest.register_alias("mobs:spider_eye", "mcl_mobitems:spider_eye") -minetest.register_alias("mobs:bone", "mcl_mobitems:bone") -minetest.register_alias("mobs:bow_wood", "mcl_throwing:bow") -minetest.register_alias("mobs:string", "mcl_mobitems:string") -minetest.register_alias("mobs:blaze_powder", "mcl_mobitems:blaze_powder") -minetest.register_alias("mobs:magma_cream", "mcl_mobitems:magma_cream") -minetest.register_alias("mobs:ghast_tear", "mcl_mobitems:ghast_tear") -minetest.register_alias("mobs:nether_star", "mcl_mobitems:nether_star") -minetest.register_alias("mobs:leather", "mcl_mobitems:leather") -minetest.register_alias("mobs:feather", "mcl_mobitems:feather") -minetest.register_alias("mobs:rabbit_hide", "mcl_mobitems:rabbit_hide") -minetest.register_alias("mobs:rabbit_foot", "mcl_mobitems:rabbit_foot") -minetest.register_alias("mobs:rabbit_stew", "mcl_mobitems:rabbit_stew") -minetest.register_alias("mobs_animal:rat", "mcl_mobitems:rabbit_stew") -minetest.register_alias("mobs:saddle", "mcl_mobitems:saddle") -minetest.register_alias("mobs:shulker_shell", "mcl_mobitems:shulker_shell") -minetest.register_alias("mobs:slimeball", "mcl_mobitems:slimeball") -minetest.register_alias("mobs:carrot_on_a_stick", "mcl_mobitems:carrot_on_a_stick") -minetest.register_alias("mobs:arrow", "mcl_throwing:arrow") -minetest.register_alias("mobs:magic_lasso", "mcl_throwing:arrow") -minetest.register_alias("mobs:net", "mcl_throwing:arrow") -minetest.register_alias("mobs:egg", "mcl_throwing:egg") -minetest.register_alias("mobs:cobweb", "mcl_core:cobweb") --funky ---minetest.register_alias("mcl_mobitems:egg", "mcl_mobitems:egg") -minetest.register_alias("mobs:protector", "mcl_throwing:arrow") - - ---esmobs -minetest.register_alias("esmobs:end_rod", "mcl_end:end_rod") -minetest.register_alias("esmobs:dragon_egg", "mcl_end:dragon_egg") -minetest.register_alias("esmobs:dragon_egg", "mcl_end:dragon_egg") -minetest.register_alias("esmobs:ender_eye", "mcl_end:ender_eye") -minetest.register_alias("esmobs:rotten_flesh", "mcl_mobitems:rotten_flesh") -minetest.register_alias("esmobs:mutton", "mcl_mobitems:mutton") -minetest.register_alias("esmobs:mutton_raw", "mcl_mobitems:mutton") -minetest.register_alias("esmobs:cooked_mutton", "mcl_mobitems:cooked_mutton") -minetest.register_alias("esmobs:mutton_cooked", "mcl_mobitems:cooked_mutton") -minetest.register_alias("esmobs:beef", "mcl_mobitems:cooked_beef") -minetest.register_alias("esmobs:beef_raw", "mcl_mobitems:cooked_beef") -minetest.register_alias("esmobs:meat_raw", "mcl_mobitems:cooked_beef") -minetest.register_alias("esmobs:meat", "mcl_mobitems:cooked_beef") -minetest.register_alias("esmobs:cooked_beef", "mcl_mobitems:cooked_beef") -minetest.register_alias("esmobs:beef_cooked", "mcl_mobitems:cooked_beef") -minetest.register_alias("esmobs:chicken", "mcl_mobitems:chicken") -minetest.register_alias("esmobs:chicken_egg_fried", "mcl_mobitems:chicken") -minetest.register_alias("esmobs:chicken_raw", "mcl_mobitems:chicken") -minetest.register_alias("esmobs:cooked_chicken", "mcl_mobitems:cooked_chicken") -minetest.register_alias("esmobs:pork_cooked", "mcl_mobitems:porkchop") -minetest.register_alias("esmobs:porkchop", "mcl_mobitems:porkchop") -minetest.register_alias("esmobs:pork_raw", "mcl_mobitems:porkchop") -minetest.register_alias("esmobs:cooked_porkchop", "mcl_mobitems:cooked_porkchop") -minetest.register_alias("esmobs:rabbit", "mcl_mobitems:rabbit") -minetest.register_alias("esmobs:milk_bucket", "mcl_mobitems:milk_bucket") -minetest.register_alias("esmobs:spider_eye", "mcl_mobitems:spider_eye") -minetest.register_alias("esmobs:bone", "mcl_mobitems:bone") -minetest.register_alias("esmobs:bow_wood", "mcl_throwing:bow") -minetest.register_alias("esmobs:string", "mcl_mobitems:string") -minetest.register_alias("esmobs:blaze_powder", "mcl_mobitems:blaze_powder") -minetest.register_alias("esmobs:magma_cream", "mcl_mobitems:magma_cream") -minetest.register_alias("esmobs:ghast_tear", "mcl_mobitems:ghast_tear") -minetest.register_alias("esmobs:nether_star", "mcl_mobitems:nether_star") -minetest.register_alias("esmobs:leather", "mcl_mobitems:leather") -minetest.register_alias("esmobs:feather", "mcl_mobitems:feather") -minetest.register_alias("esmobs:rabbit_hide", "mcl_mobitems:rabbit_hide") -minetest.register_alias("esmobs:rabbit_foot", "mcl_mobitems:rabbit_foot") -minetest.register_alias("esmobs:rabbit_stew", "mcl_mobitems:rabbit_stew") -minetest.register_alias("esmobs:rat", "mcl_mobitems:rabbit_stew") -minetest.register_alias("esmobs:saddle", "mcl_mobitems:saddle") -minetest.register_alias("esmobs:shulker_shell", "mcl_mobitems:shulker_shell") -minetest.register_alias("esmobs:slimeball", "mcl_mobitems:slimeball") -minetest.register_alias("esmobs:carrot_on_a_stick", "mcl_mobitems:carrot_on_a_stick") -minetest.register_alias("esmobs:arrow", "mcl_throwing:arrow") -minetest.register_alias("esmobs:magic_lasso", "mcl_throwing:arrow") -minetest.register_alias("esmobs:net", "mcl_throwing:arrow") -minetest.register_alias("esmobs:egg", "mcl_throwing:egg") -minetest.register_alias("esmobs:cobweb", "mcl_core:cobweb") --funky -minetest.register_alias("esmobs:protector", "mcl_throwing:arrow") -minetest.register_alias("esmobs:bones", "mcl_chests:chest") - diff --git a/mods/MISC/mcl_commands/depends.txt b/mods/MISC/mcl_commands/depends.txt new file mode 100644 index 00000000..6e14ff13 --- /dev/null +++ b/mods/MISC/mcl_commands/depends.txt @@ -0,0 +1 @@ +mcl_death_messages? diff --git a/mods/MISC/mcl_commands/init.lua b/mods/MISC/mcl_commands/init.lua index 6c0b0b79..8b931d0b 100644 --- a/mods/MISC/mcl_commands/init.lua +++ b/mods/MISC/mcl_commands/init.lua @@ -1,39 +1,13 @@ local minecraftaliases = true -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end -end +local S = minetest.get_translator("mcl_commands") -local function handle_clear_command(giver, receiver) - local receiverref = minetest.get_player_by_name(receiver) - if receiverref == nil then - return false, S("Player @1 does not exist.", receiver) - end - if receiverref:get_inventory():is_empty("main") then - if giver == receiver then - return false, S("Your inventory is already clear.") - else - return false, S("@1's inventory is already clear.", receiver) - end - end - if not giver == receiver then - minetest.log("action", S("@1 cleared @2's inventory", giver, receiver)) - end - for i=0,receiverref:get_inventory():get_size("main") do - receiverref:get_inventory():set_stack("main", i, nil) - end - if giver == receiver then - return true, S("Your inventory was cleared.") - else - minetest.chat_send_player(receiver, S("Your inventory was cleared.")) - return true, S("@1's inventory was cleared.", receiver) - end -end +local mod_death_messages = minetest.get_modpath("mcl_death_messages") local function handle_kill_command(suspect, victim) + if minetest.settings:get_bool("enable_damage") == false then + return false, S("Players can't be killed right now, damage has been disabled.") + end local victimref = minetest.get_player_by_name(victim) if victimref == nil then return false, S("Player @1 does not exist.", victim) @@ -44,38 +18,39 @@ local function handle_kill_command(suspect, victim) return false, S("@1 is already dead", victim) end end - if not suspect == victim then - minetest.log("action", S("@1 killed @2", suspect, victim)) + -- If player holds a totem of undying, destroy it before killing, + -- so it doesn't rescue the player. + local wield = victimref:get_wielded_item() + if wield:get_name() == "mobs_mc:totem" then + victimref:set_wielded_item("") end + if mod_death_messages then + local msg + if suspect == victim then + msg = S("@1 committed suicide.", victim) + else + msg = S("@1 was killed by @2.", victim, suspect) + end + mcl_death_messages.player_damage(victimref, msg) + end + -- DIE! victimref:set_hp(0) + -- Log + if not suspect == victim then + minetest.log("action", string.format("%s killed %s using /kill", suspect, victim)) + else + minetest.log("action", string.format("%s committed suicide using /kill", victim)) + end + return true end -minetest.register_privilege("clear", { - description = S("Can use /clear"), - give_to_singleplayer = false -}) -minetest.register_privilege("kill", { - description = S("Can use /kill"), - give_to_singleplayer = false, -}) -minetest.register_privilege("announce", { - description = S("Can use /say"), - give_to_singleplayer = false, -}) - -minetest.register_chatcommand("clear", { - params = S(""), - description = S("Clear inventory of player"), - privs = {clear=true}, - func = function(name, param) - return handle_clear_command(name, param) - end, -}) - +if minetest.registered_chatcommands["kill"] then + minetest.unregister_chatcommand("kill") +end minetest.register_chatcommand("kill", { params = S("[]"), - description = S("Kill player"), - privs = {kill=true}, + description = S("Kill player or yourself"), + privs = {server=true}, func = function(name, param) if(param == "") then -- Selfkill @@ -86,6 +61,10 @@ minetest.register_chatcommand("kill", { end, }) +minetest.register_privilege("announce", { + description = S("Can use /say"), + give_to_singleplayer = false, +}) minetest.register_chatcommand("say", { params = S(""), description = S("Send a message to every player"), @@ -121,7 +100,7 @@ minetest.register_chatcommand("setblock", { }) minetest.register_chatcommand("list", { - description = "Show who is logged on", + description = S("Show who is logged on"), params = "", privs = {}, func = function(name) @@ -134,11 +113,11 @@ minetest.register_chatcommand("list", { }) minetest.register_chatcommand("seed", { - description = "Displays the world seed", + description = S("Displays the world seed"), params = "", privs = {}, func = function(name) - minetest.chat_send_player(name, string.format("%d", minetest.get_mapgen_params().seed)) + minetest.chat_send_player(name, minetest.get_mapgen_setting("seed")) end }) @@ -147,6 +126,21 @@ local function register_chatcommand_alias(alias, cmd) minetest.register_chatcommand(alias, def) end +-- Replace spawnentity cmd to disallow spawning of hostile mobs if disabled +local orig_func = minetest.registered_chatcommands["spawnentity"].func +local cmd = table.copy(minetest.registered_chatcommands["spawnentity"]) +cmd.func = function(name, param) + local ent = minetest.registered_entities[param] + if minetest.settings:get_bool("only_peaceful_mobs", false) and ent and ent._cmi_is_mob and ent.type == "monster" then + return false, S("Only peaceful mobs allowed!") + else + local bool, msg = orig_func(name, param) + return bool, msg + end +end +minetest.unregister_chatcommand("spawnentity") +minetest.register_chatcommand("spawnentity", cmd) + if minecraftaliases then register_chatcommand_alias("?", "help") register_chatcommand_alias("who", "list") @@ -156,12 +150,14 @@ if minecraftaliases then register_chatcommand_alias("tell", "msg") register_chatcommand_alias("w", "msg") register_chatcommand_alias("tp", "teleport") + register_chatcommand_alias("clear", "clearinv") minetest.register_chatcommand("banlist", { description = S("List bans"), privs = minetest.chatcommands["ban"].privs, func = function(name) - return true, S("Ban list: @1", core.get_ban_list()) + return true, S("Ban list: @1", minetest.get_ban_list()) end, }) end + diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.de.tr b/mods/MISC/mcl_commands/locale/mcl_commands.de.tr new file mode 100644 index 00000000..68d26751 --- /dev/null +++ b/mods/MISC/mcl_commands/locale/mcl_commands.de.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.=Spieler können jetzt nicht getötet werden, der Schaden wurde deaktiviert. +Player @1 does not exist.=Spieler @1 existiert nicht. +You are already dead=Sie sind schon tot +@1 is already dead=@1 ist schon tot +@1 committed suicide.=@1 beging Selbstmord. +@1 was killed by @2.=@1 wurde von @2 getötet. +[]=[] +Kill player or yourself=Spieler oder sich selbst töten +Can use /say=Kann „/say“ benutzen += +Send a message to every player=Nachricht an alle Spieler senden +Invalid usage, see /help say.=Falsche Benutzung, siehe „/help say“. +,, =,, +Set node at given position=Node (Block) an der gegebenen Position platzieren +Invalid node=Unültiger Node +@1 spawned.=@1 gespawnt. +Invalid parameters (see /help setblock)=Ungültige Parameter (siehe „/help setblock”) +List bans=Bannliste anzeigen +Ban list: @1=Bannliste: @1 +Show who is logged on=Anzeigen, wer eingeloggt ist +Displays the world seed=Den Seed der Welt anzeigen +Only peaceful mobs allowed!=Nur friedliche Mobs erlaubt! diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.es.tr b/mods/MISC/mcl_commands/locale/mcl_commands.es.tr new file mode 100644 index 00000000..91b21eb9 --- /dev/null +++ b/mods/MISC/mcl_commands/locale/mcl_commands.es.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.=Los jugadores no pueden ser asesinados en este momento, el daño ha sido desactivado. +Player @1 does not exist.=El jugador @1 no existe. +You are already dead=Ya estas muerto +@1 is already dead=@1 ya esta muerto +@1 committed suicide.=@1 se suicidó. +@1 was killed by @2.=@1 fue asesinado por @2. +[]=[] +Kill player or yourself=Mata al jugador o a ti mismo +Can use /say=Puedes usar /say += +Send a message to every player=Envía un mensaje a todos los jugadores +Invalid usage, see /help=Uso no válido, (Revisa el comando "/help say") +,, =,, +Set node at given position=Establecer nodo en la posición dada +Invalid node=Nodo no válido +@1 spawned.=@1 generado. +Invalid parameters (see /help setblock)=Parámetros no válidos (Revisa el comando "/help setblock") +List bans=Lista de prohibiciones +Ban list: @1=Lista de baneados: @1 +Show who is logged on=Mostrar quién ha iniciado sesión +Displays the world seed=Muestra la semilla del mundo +Only peaceful mobs allowed!=¡Solo se permiten animales pacíficos! diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.fr.tr b/mods/MISC/mcl_commands/locale/mcl_commands.fr.tr new file mode 100644 index 00000000..a655368b --- /dev/null +++ b/mods/MISC/mcl_commands/locale/mcl_commands.fr.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.=Les joueurs ne peuvent pas être tués pour le moment, les dégâts ont été désactivés. +Player @1 does not exist.=Le joueur @1 n'existe pas. +You are already dead=Tu es déjà mort +@1 is already dead=@1 est déjà mort +@1 committed suicide.=@1 s'est suicidé. +@1 was killed by @2.=@1 a été tué par @2. +[]=[] +Kill player or yourself=Tuez un joueur ou vous-même +Can use /say=Peut utiliser /say += +Send a message to every player=Envoyez un message à chaque joueur +Invalid usage, see /help say.=Utilisation non valide, voir /help say. +,, =,, +Set node at given position=Placer le noeud à une position donnée +Invalid node=Noeud non valide +@1 spawned.=@1 est apparu. +Invalid parameters (see /help setblock)=Paramètres invalides (voir /help setblock) +List bans=Liste des interdictions +Ban list: @1=Liste d'interdiction: @1 +Show who is logged on=Afficher qui est connecté +Displays the world seed=Affiche la graine du monde +Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisées! diff --git a/mods/MISC/mcl_commands/locale/template.txt b/mods/MISC/mcl_commands/locale/template.txt new file mode 100644 index 00000000..5b4370b8 --- /dev/null +++ b/mods/MISC/mcl_commands/locale/template.txt @@ -0,0 +1,23 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.= +Player @1 does not exist.= +You are already dead= +@1 is already dead= +@1 committed suicide.= +@1 was killed by @2.= +[]= +Kill player or yourself= +Can use /say= += +Send a message to every player= +Invalid usage, see /help say.= +,, = +Set node at given position= +Invalid node= +@1 spawned.= +Invalid parameters (see /help setblock)= +List bans= +Ban list: @1= +Show who is logged on= +Displays the world seed= +Only peaceful mobs allowed!= diff --git a/mods/MISC/mcl_privs/description.txt b/mods/MISC/mcl_privs/description.txt new file mode 100644 index 00000000..23beb168 --- /dev/null +++ b/mods/MISC/mcl_privs/description.txt @@ -0,0 +1 @@ +Shared privileges in MineClone 2 diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua new file mode 100644 index 00000000..00670db1 --- /dev/null +++ b/mods/MISC/mcl_privs/init.lua @@ -0,0 +1,5 @@ +local S = minetest.get_translator("mcl_privs") + +minetest.register_privilege("maphack", { + description = S("Can place and use advanced blocks like mob spawners, command blocks and barriers."), +}) diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.de.tr b/mods/MISC/mcl_privs/locale/mcl_privs.de.tr new file mode 100644 index 00000000..c5b79976 --- /dev/null +++ b/mods/MISC/mcl_privs/locale/mcl_privs.de.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.=Kann fortgeschrittene Blöcke wie Mobspawner, Befehlsblöcke und Barrieren platzieren und benutzen. diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.es.tr b/mods/MISC/mcl_privs/locale/mcl_privs.es.tr new file mode 100644 index 00000000..66d2a60b --- /dev/null +++ b/mods/MISC/mcl_privs/locale/mcl_privs.es.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.=Puede colocar y usar bloques avanzados como generadores de animales, bloques de comando y barreras. diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.fr.tr b/mods/MISC/mcl_privs/locale/mcl_privs.fr.tr new file mode 100644 index 00000000..eee0ac22 --- /dev/null +++ b/mods/MISC/mcl_privs/locale/mcl_privs.fr.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.=Peut placer et utiliser des blocs avancés comme des générateurs de mob, des blocs de commande et des barrières. diff --git a/mods/MISC/mcl_privs/locale/template.txt b/mods/MISC/mcl_privs/locale/template.txt new file mode 100644 index 00000000..11be3349 --- /dev/null +++ b/mods/MISC/mcl_privs/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.= diff --git a/mods/MISC/mcl_temp_helper_recipes/depends.txt b/mods/MISC/mcl_temp_helper_recipes/depends.txt index 7e0cdd5d..71556b9a 100644 --- a/mods/MISC/mcl_temp_helper_recipes/depends.txt +++ b/mods/MISC/mcl_temp_helper_recipes/depends.txt @@ -1,4 +1,7 @@ mcl_core mcl_mobitems -mcl_dye mcl_end +mcl_nether +mcl_ocean +mcl_stairs +xpanes diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua index 87388b24..fdde8004 100644 --- a/mods/MISC/mcl_temp_helper_recipes/init.lua +++ b/mods/MISC/mcl_temp_helper_recipes/init.lua @@ -12,20 +12,11 @@ minetest.register_craft({ output = "mcl_sponges:sponge", recipe = { { "mcl_farming:hay_block", "mcl_farming:hay_block", "mcl_farming:hay_block" }, - { "mcl_farming:hay_block", "mcl_core:emerald", "mcl_farming:hay_block" }, + { "mcl_farming:hay_block", "mcl_core:goldblock", "mcl_farming:hay_block" }, { "mcl_farming:hay_block", "mcl_farming:hay_block", "mcl_farming:hay_block" }, } }) -minetest.register_craft({ - output = "mcl_core:redsand 8", - recipe = { - { "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" }, - { "mcl_core:sand", "mcl_dye:red", "mcl_core:sand" }, - { "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" }, - } -}) - minetest.register_craft({ output = "mcl_ocean:prismarine_shard", recipe = { @@ -36,88 +27,20 @@ minetest.register_craft({ minetest.register_craft({ type = "shapeless", output = "mcl_ocean:prismarine_crystals", - recipe = { "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_core:emerald" }, + recipe = { "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_core:gold_ingot" }, }) -minetest.register_craft({ - output = "mcl_end:chorus_fruit", - recipe = { - { "mcl_flowers:allium", "mcl_end:end_stone", "mcl_flowers:allium" }, - { "mcl_end:end_stone", "mcl_end:end_stone", "mcl_end:end_stone" }, - { "mcl_flowers:allium", "mcl_end:end_stone", "mcl_flowers:allium" }, - }, -}) - -minetest.register_craft({ - output = "mcl_end:end_stone", - recipe = { - { "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" }, - { "mcl_core:stone", "mcl_core:sandstone", "mcl_core:stone" }, - { "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" }, - }, -}) - -minetest.register_craft({ - output = "mcl_mobitems:blaze_rod", - recipe = { - { "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel"}, - { "mcl_fire:flint_and_steel", "mcl_core:stick", "mcl_fire:flint_and_steel" }, - { "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel"}, - } -}) minetest.register_craft({ output = "mcl_mobitems:shulker_shell", recipe = { { "mcl_end:purpur_block", "mcl_end:purpur_block", "mcl_end:purpur_block", }, - { "mcl_end:purpur_block", "mcl_core:emerald", "mcl_end:purpur_block", }, + { "mcl_end:purpur_block", "mcl_core:goldblock", "mcl_end:purpur_block", }, { "mcl_end:purpur_block", "", "mcl_end:purpur_block", }, } }) minetest.register_craft({ - output = "mcl_nether:quartz", - recipe = { - {"group:sand", "group:sand", "group:sand"}, - {"group:sand", "group:sand", "group:sand"}, - {"group:sand", "group:sand", "group:sand"}, - } -}) - -minetest.register_craft({ - output = "mcl_nether:nether_wart_item", - recipe = { - {"mcl_nether:soul_sand", "mcl_core:obsidian", "mcl_nether:soul_sand"}, - {"mcl_core:obsidian", "mcl_core:goldblock", "mcl_core:obsidian"}, - {"mcl_nether:soul_sand", "mcl_core:obsidian", "mcl_nether:soul_sand"}, - } -}) - -minetest.register_craft({ - type = "shapeless", - output = "mcl_nether:netherrack", - recipe = {"mcl_core:stone", "group:redsandstone"}, -}) - -minetest.register_craft({ - output = "mcl_nether:glowstone_dust", - recipe = { - {"mcl_torches:torch", "mcl_torches:torch", "mcl_torches:torch",}, - {"mcl_torches:torch", "mcl_core:coalblock", "mcl_torches:torch",}, - {"mcl_torches:torch", "mcl_torches:torch", "mcl_torches:torch",}, - }, -}) - -minetest.register_craft({ - output = "mcl_nether:soul_sand", - recipe = { - {"mcl_core:redsand","mcl_nether:netherrack","mcl_core:redsand"}, - {"mcl_nether:netherrack","mcl_core:redsand","mcl_nether:netherrack"}, - {"mcl_core:redsand","mcl_nether:netherrack","mcl_core:redsand"}, - }, -}) - -minetest.register_craft({ - output = "3d_armor:helmet_chain", + output = "mcl_armor:helmet_chain", recipe = { { "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" }, { "xpanes:bar_flat", "", "xpanes:bar_flat" }, @@ -125,7 +48,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "3d_armor:leggings_chain", + output = "mcl_armor:leggings_chain", recipe = { { "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" }, { "xpanes:bar_flat", "", "xpanes:bar_flat" }, @@ -134,7 +57,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "3d_armor:boots_chain", + output = "mcl_armor:boots_chain", recipe = { { "xpanes:bar_flat", "", "xpanes:bar_flat" }, { "xpanes:bar_flat", "", "xpanes:bar_flat" }, @@ -142,7 +65,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "3d_armor:chestplate_chain", + output = "mcl_armor:chestplate_chain", recipe = { { "xpanes:bar_flat", "", "xpanes:bar_flat" }, { "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" }, @@ -150,58 +73,46 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "mcl_jukebox:record_2", - recipe = { - { "mcl_core:glass_black", "mcl_core:glass_black", "mcl_core:glass_black", }, - { "mcl_core:glass_black", "mcl_fire:fire_charge", "mcl_core:glass_black", }, - { "mcl_core:glass_black", "mcl_core:glass_black", "mcl_core:glass_black", }, - } -}) -minetest.register_craft({ - output = "mcl_jukebox:record_3", - recipe = { - { "mcl_core:glass_black", "mcl_core:glass_black", "mcl_core:glass_black", }, - { "mcl_core:glass_black", "mcl_core:emerald", "mcl_core:glass_black", }, - { "mcl_core:glass_black", "mcl_core:glass_black", "mcl_core:glass_black", }, - } -}) -minetest.register_craft({ - output = "mcl_jukebox:record_5", - recipe = { - { "mcl_core:glass_black", "mcl_core:glass_black", "mcl_core:glass_black", }, - { "mcl_core:glass_black", "mcl_nether:nether_wart_block", "mcl_core:glass_black", }, - { "mcl_core:glass_black", "mcl_core:glass_black", "mcl_core:glass_black", }, - } -}) +-- Make red sand, red sandstone and more craftable in v6 +-- NOTE: When you change these, also update mcl_craftguide for the "v6" icon in +-- the craft guide! +if minetest.get_mapgen_setting("mg_name") == "v6" then + minetest.register_craft({ + output = "mcl_core:redsand 8", + recipe = { + { "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" }, + { "mcl_core:sand", "mcl_nether:nether_wart_item", "mcl_core:sand" }, + { "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" }, + } + }) +end --- 2 discs are dropped by creeper --- 1 disc is droppd by zombie --- TODO: Remove/fix these drops when creeper drops music discs properly minetest.register_craft({ - output = "mcl_core:darksapling", + output = "mcl_nether:quartz_smooth 4", recipe = { - { "mcl_core:sapling", "mcl_core:sapling", "mcl_core:sapling" }, - { "mcl_core:sapling", "mcl_core:sapling", "mcl_core:sapling" }, - { "mcl_core:sapling", "mcl_core:sapling", "mcl_core:sapling" }, + { "mcl_nether:quartz_block", "mcl_nether:quartz_block" }, + { "mcl_nether:quartz_block", "mcl_nether:quartz_block" }, }, }) minetest.register_craft({ - output = "mcl_core:acaciasapling", + output = "mcl_core:sandstonesmooth2 4", recipe = { - { "mcl_core:junglesapling", "mcl_core:junglesapling", "mcl_core:junglesapling" }, - { "mcl_core:junglesapling", "mcl_core:junglesapling", "mcl_core:junglesapling" }, - { "mcl_core:junglesapling", "mcl_core:junglesapling", "mcl_core:junglesapling" }, + { "mcl_core:sandstonesmooth", "mcl_core:sandstonesmooth" }, + { "mcl_core:sandstonesmooth", "mcl_core:sandstonesmooth" }, }, }) minetest.register_craft({ - output = "mcl_core:birchsapling", + output = "mcl_core:redsandstonesmooth2 4", recipe = { - { "mcl_core:sprucesapling", "mcl_core:sprucesapling", "mcl_core:sprucesapling" }, - { "mcl_core:sprucesapling", "mcl_core:sprucesapling", "mcl_core:sprucesapling" }, - { "mcl_core:sprucesapling", "mcl_core:sprucesapling", "mcl_core:sprucesapling" }, + { "mcl_core:redsandstonesmooth", "mcl_core:redsandstonesmooth" }, + { "mcl_core:redsandstonesmooth", "mcl_core:redsandstonesmooth" }, }, }) + +minetest.register_craft({ + output = "mcl_core:gold_ingot 9", + recipe = {{ "mcl_core:emerald" }}, +}) diff --git a/mods/MISC/mcl_wip/depends.txt b/mods/MISC/mcl_wip/depends.txt index 77b465ca..66804f10 100644 --- a/mods/MISC/mcl_wip/depends.txt +++ b/mods/MISC/mcl_wip/depends.txt @@ -1,12 +1,8 @@ -mcl_anvils mcl_core -mcl_end mcl_fishing mcl_maps mcl_minecarts -mcl_chests -gemalde -mcl_observers doc_identifier mobs_mc -mcl_paintings +mcl_comparators +mcl_minecarts diff --git a/mods/MISC/mcl_wip/description.txt b/mods/MISC/mcl_wip/description.txt index 581de998..d90115ac 100644 --- a/mods/MISC/mcl_wip/description.txt +++ b/mods/MISC/mcl_wip/description.txt @@ -1 +1 @@ -Development mod for MineClone 2 which add a “WIP” comment to items which are considered to be very unfinished. +Development mod for MineClone 2 which add a “WIP” (Work In Progress) comment to items which are considered to be very unfinished. diff --git a/mods/MISC/mcl_wip/init.lua b/mods/MISC/mcl_wip/init.lua index bb29c9a6..062b5e48 100644 --- a/mods/MISC/mcl_wip/init.lua +++ b/mods/MISC/mcl_wip/init.lua @@ -1,23 +1,21 @@ +-- Mod to mark WIP (Work In Progress) content + +local S = minetest.get_translator("mcl_wip") + local wip_items = { - "mcl_anvils:anvil", - "mcl_anvils:anvil_damage_1", - "mcl_anvils:anvil_damage_2", - "mcl_core:darksapling", - "mcl_core:apple_gold", - "mcl_end:ender_eye", - "mcl_end:chorus_fruit", - "mcl_end:chorus_flower", - "mcl_end:chorus_flower_dead", - "mcl_fishing:fishing_rod", - "mcl_maps:filled_map", "mcl_maps:empty_map", - "mcl_minecarts:golden_rail", - "gemalde:node_1", - "mcl_observers:observer", - "mcl_chests:trapped_chest", - "mobs_mc:llama", - "mobs_mc:totem", - "mcl_paintings:painting", + "mcl_comparators:comparator_off_comp", + "mcl_minecarts:hopper_minecart", + "mcl_minecarts:command_block_minecart", + "mcl_minecarts:chest_minecart", + "mcl_minecarts:furnace_minecart", + "mobs_mc:enderdragon", + "mobs_mc:wither", + "mobs_mc:parrot", + "mobs_mc:witch", + "screwdriver:screwdriver", +} +local experimental_items = { } for i=1,#wip_items do @@ -27,14 +25,15 @@ for i=1,#wip_items do break end local new_description = def.description - new_description = new_description .. "\n"..core.colorize("#FF0000", "(WIP)") - minetest.override_item(wip_items[i], { description = new_description }) + local new_groups = table.copy(def.groups) + if new_description == "" then + new_description = wip_items[i] + end + new_description = new_description .. "\n"..core.colorize("#FF0000", S("(WIP)")) + new_groups.not_in_craft_guide = 1 + minetest.override_item(wip_items[i], { description = new_description, groups = new_groups }) end -local experimental_items = { - "doc_identifier:identifier_solid", - "doc_identifier:identifier_liquid", -} for i=1,#experimental_items do local def = minetest.registered_items[experimental_items[i]] if not def then @@ -42,7 +41,7 @@ for i=1,#experimental_items do break end local new_description = def.description - new_description = new_description .. "\n"..core.colorize("#FFFF00", "(Experimental)") + new_description = new_description .. "\n"..core.colorize("#FFFF00", S("(Temporary)")) minetest.override_item(experimental_items[i], { description = new_description }) end diff --git a/mods/MISC/mcl_wip/locale/mcl_wip.de.tr b/mods/MISC/mcl_wip/locale/mcl_wip.de.tr new file mode 100644 index 00000000..9cf3b6f0 --- /dev/null +++ b/mods/MISC/mcl_wip/locale/mcl_wip.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_wip +(WIP)=(in Arbeit) +(Temporary)=(temporär) diff --git a/mods/MISC/mcl_wip/locale/mcl_wip.es.tr b/mods/MISC/mcl_wip/locale/mcl_wip.es.tr new file mode 100644 index 00000000..aa0d40eb --- /dev/null +++ b/mods/MISC/mcl_wip/locale/mcl_wip.es.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_wip +(WIP)=(En progreso) +(Temporary)=(Temporal) diff --git a/mods/MISC/mcl_wip/locale/mcl_wip.fr.tr b/mods/MISC/mcl_wip/locale/mcl_wip.fr.tr new file mode 100644 index 00000000..a17ad49a --- /dev/null +++ b/mods/MISC/mcl_wip/locale/mcl_wip.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_wip +# WIP means “Work in Progress” +(WIP)=(Travail en cours) +(Temporary)=(Temporaire) diff --git a/mods/MISC/mcl_wip/locale/template.txt b/mods/MISC/mcl_wip/locale/template.txt new file mode 100644 index 00000000..b7427364 --- /dev/null +++ b/mods/MISC/mcl_wip/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_wip +# WIP means “Work in Progress” +(WIP)= +(Temporary)= diff --git a/mods/MISC/modpack.conf b/mods/MISC/modpack.conf new file mode 100644 index 00000000..dad106d9 --- /dev/null +++ b/mods/MISC/modpack.conf @@ -0,0 +1,2 @@ +name = MISC +description = Meta-modpack containing miscellaneous mods for MineClone 2 diff --git a/mods/MISC/modpack.txt b/mods/MISC/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/PLAYER/mcl_death_drop/depends.txt b/mods/PLAYER/mcl_death_drop/depends.txt index b6cac219..2bbf820f 100644 --- a/mods/PLAYER/mcl_death_drop/depends.txt +++ b/mods/PLAYER/mcl_death_drop/depends.txt @@ -1 +1 @@ -3d_armor +mcl_armor diff --git a/mods/PLAYER/mcl_death_drop/init.lua b/mods/PLAYER/mcl_death_drop/init.lua index 6d0947e2..54672a5d 100644 --- a/mods/PLAYER/mcl_death_drop/init.lua +++ b/mods/PLAYER/mcl_death_drop/init.lua @@ -1,10 +1,12 @@ minetest.register_on_dieplayer(function(player) - local keep = minetest.settings:get_bool("mcl_keepInventory") or false + local keep = minetest.settings:get_bool("mcl_keepInventory", false) if keep == false then -- Drop inventory, crafting grid and armor local inv = player:get_inventory() - local pos = player:getpos() + local pos = player:get_pos() local name, player_armor_inv, armor_armor_inv, pos = armor:get_valid_player(player, "[on_dieplayer]") + -- No item drop if in deep void + local void, void_deadly = mcl_worlds.is_in_void(pos) local lists = { { inv = inv, listname = "main", drop = true }, { inv = inv, listname = "craft", drop = true }, @@ -21,14 +23,17 @@ minetest.register_on_dieplayer(function(player) local z = math.random(0, 9)/3 pos.x = pos.x + x pos.z = pos.z + z - if drop then + if not void_deadly and drop then + local def = minetest.registered_items[stack:get_name()] + if def and def.on_drop then + stack = def.on_drop(stack, player, pos) + end minetest.add_item(pos, stack) end - stack:clear() - inv:set_stack(listname, i, stack) pos.x = pos.x - x pos.z = pos.z - z end + inv:set_list(listname, {}) end end armor:set_player_armor(player) diff --git a/mods/PLAYER/mcl_hunger/API.md b/mods/PLAYER/mcl_hunger/API.md index eb7710fc..3daa6351 100644 --- a/mods/PLAYER/mcl_hunger/API.md +++ b/mods/PLAYER/mcl_hunger/API.md @@ -1,19 +1,35 @@ # API information (WIP) -This API information is WIP. The mod API is still pretty much unofficial; -this mod is mostly seen as standalone for now. +This API information is not complete yet. +The mod API is still pretty much unofficial; this mod is mostly seen +as standalone for now. + This may change in the future development of MineClone 2. Hopefully. -## Before using this mod -This mod is a no-op when the game is started with damage disabled. -Before using any of the functions, first check if global variable -“`mcl_hunger`” is present. +## Mod state +The hunger mechanic is disabled when damage is disabled +(setting `enable_damage=false`). +You can check the hunger state with `mcl_hunger.active`. If it's true, +then hunger is active. -## Hunger level +If the hunger is disabled, most of the functions are no-ops or return +default values. + +## Player values +### Hunger level The hunger level of the player is a whole number between 0 and 20 inclusive. 0 is starving and 20 is full. The hunger level is represented in the HUD by a statbar with 20 half-icons. +### Saturation +To be written ... + +### Exhaustion +To be written ... + ## Functions +This API documentation is not complete yet, more documentation will +come. + ### `mcl_hunger.get_hunger(player)` Returns the current hunger level of `player` (ObjectRef). @@ -21,6 +37,15 @@ Returns the current hunger level of `player` (ObjectRef). Sets the hunger level of `player` (ObjectRef) to `hunger` immediately. `hunger` ***must*** be between 0 and 20 inclusive. +### `mcl_hunger.exhaust(player, exhaust)` +Increase exhaustion of player by `exhaust`. + +### `mcl_hunger.stop_poison(player)` +Immediately stops all poisonings for player. + +### More functions ... +There are more functions (of less importance) available, see `api.lua`. + ## Groups Items in group `food=3` will make a drinking sound and no particles. Items in group `food` with any other rating will make an eating sound and particles, diff --git a/mods/PLAYER/mcl_hunger/api.lua b/mods/PLAYER/mcl_hunger/api.lua new file mode 100644 index 00000000..46dc76fa --- /dev/null +++ b/mods/PLAYER/mcl_hunger/api.lua @@ -0,0 +1,161 @@ +mcl_hunger.registered_foods = {} + +function mcl_hunger.init_player(player) + local meta = player:get_meta() + if meta:get_string("mcl_hunger:hunger") == "" then + meta:set_string("mcl_hunger:hunger", tostring(20)) + end + if meta:get_string("mcl_hunger:saturation") == "" then + meta:set_string("mcl_hunger:saturation", tostring(mcl_hunger.SATURATION_INIT)) + end + if meta:get_string("mcl_hunger:exhaustion") == "" then + meta:set_string("mcl_hunger:exhaustion", tostring(0)) + end +end + +if mcl_hunger.active then + function mcl_hunger.get_hunger(player) + local hunger = tonumber(player:get_meta():get_string("mcl_hunger:hunger")) or 20 + return hunger + end + + function mcl_hunger.get_saturation(player) + local saturation = tonumber(player:get_meta():get_string("mcl_hunger:saturation")) or mcl_hunger.SATURATION_INIT + return saturation + end + + function mcl_hunger.get_exhaustion(player) + local exhaustion = tonumber(player:get_meta():get_string("mcl_hunger:exhaustion")) or 0 + return exhaustion + end + + function mcl_hunger.set_hunger(player, hunger, update_hudbars) + hunger = math.min(20, math.max(0, hunger)) + player:get_meta():set_string("mcl_hunger:hunger", tostring(hunger)) + if update_hudbars ~= false then + hb.change_hudbar(player, "hunger", hunger) + mcl_hunger.update_saturation_hud(player, nil, hunger) + end + return true + end + + function mcl_hunger.set_saturation(player, saturation, update_hudbar) + saturation = math.min(mcl_hunger.get_hunger(player), math.max(0, saturation)) + player:get_meta():set_string("mcl_hunger:saturation", tostring(saturation)) + if update_hudbar ~= false then + mcl_hunger.update_saturation_hud(player, saturation) + end + return true + end + + function mcl_hunger.set_exhaustion(player, exhaustion, update_hudbar) + exhaustion = math.min(mcl_hunger.EXHAUST_LVL, math.max(0.0, exhaustion)) + player:get_meta():set_string("mcl_hunger:exhaustion", tostring(exhaustion)) + if update_hudbar ~= false then + mcl_hunger.update_exhaustion_hud(player, exhaustion) + end + return true + end + + function mcl_hunger.exhaust(playername, increase) + local player = minetest.get_player_by_name(playername) + if not player then return false end + mcl_hunger.set_exhaustion(player, mcl_hunger.get_exhaustion(player) + increase) + if mcl_hunger.get_exhaustion(player) >= mcl_hunger.EXHAUST_LVL then + mcl_hunger.set_exhaustion(player, 0.0) + local h = nil + local satuchanged = false + local s = mcl_hunger.get_saturation(player) + if s > 0 then + mcl_hunger.set_saturation(player, math.max(s - 1.0, 0)) + satuchanged = true + elseif s <= 0.0001 then + h = mcl_hunger.get_hunger(player) + h = math.max(h-1, 0) + mcl_hunger.set_hunger(player, h) + satuchanged = true + end + if satuchanged then + if h ~= nil then h = h end + mcl_hunger.update_saturation_hud(player, mcl_hunger.get_saturation(player), h) + end + end + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) + return true + end + + function mcl_hunger.saturate(playername, increase, update_hudbar) + local player = minetest.get_player_by_name(playername) + local ok = mcl_hunger.set_saturation(player, math.min(mcl_hunger.get_saturation(player) + increase, mcl_hunger.get_hunger(player))) + if update_hudbar ~= false then + mcl_hunger.update_saturation_hud(player, mcl_hunger.get_saturation(player), mcl_hunger.get_hunger(player)) + end + return ok + end + + function mcl_hunger.register_food(name, hunger_change, replace_with_item, poisontime, poison, exhaust, poisonchance, sound) + if not mcl_hunger.active then + return + end + local food = mcl_hunger.registered_foods + food[name] = {} + food[name].saturation = hunger_change -- hunger points added + food[name].replace = replace_with_item -- what item is given back after eating + food[name].poisontime = poisontime -- time it is poisoning. If this is set, this item is considered poisonous, + -- otherwise the following poison/exhaust fields are ignored + food[name].poison = poison -- poison damage per tick for poisonous food + food[name].exhaust = exhaust -- exhaustion per tick for poisonous food + food[name].poisonchance = poisonchance -- chance percentage that this item poisons the player (default: 100% if poisoning is enabled) + food[name].sound = sound -- special sound that is played when eating + end + + function mcl_hunger.stop_poison(player) + if not mcl_hunger.active then + return + end + mcl_hunger.poison_damage[player:get_player_name()] = 0 + mcl_hunger.poison_hunger[player:get_player_name()] = 0 + mcl_hunger.reset_bars_poison_damage(player) + mcl_hunger.reset_bars_poison_hunger(player) + end + +else + -- When hunger is disabled, the functions are basically no-ops + + function mcl_hunger.get_hunger() + return 20 + end + + function mcl_hunger.get_saturation() + return mcl_hunger.SATURATION_INIT + end + + function mcl_hunger.get_exhaustion() + return 0 + end + + function mcl_hunger.set_hunger() + return false + end + + function mcl_hunger.set_saturation() + return false + end + + function mcl_hunger.set_exhaustion() + return false + end + + function mcl_hunger.exhaust() + return false + end + + function mcl_hunger.saturate() + return false + end + + function mcl_hunger.register_food() end + + function mcl_hunger.stop_poison() end + +end diff --git a/mods/PLAYER/mcl_hunger/depends.txt b/mods/PLAYER/mcl_hunger/depends.txt index db4d6ccb..ed8cc423 100644 --- a/mods/PLAYER/mcl_hunger/depends.txt +++ b/mods/PLAYER/mcl_hunger/depends.txt @@ -1,2 +1,2 @@ hudbars -intllib? +mcl_death_messages? diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 72464320..a664b6ad 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -1,6 +1,14 @@ +local S = minetest.get_translator("mcl_hunger") +local mod_death_messages = minetest.get_modpath("mcl_death_messages") + -- wrapper for minetest.item_eat (this way we make sure other mods can't break this one) -local org_eat = core.do_item_eat -core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, pointed_thing) +local org_eat = minetest.do_item_eat +minetest.do_item_eat = function(hp_change, replace_with_item, itemstack, user, pointed_thing) + + if not user or user:is_player() == false then + return itemstack + end + -- Call on_rightclick if the pointed node defines it if pointed_thing.type == "node" then local node = minetest.get_node(pointed_thing.under) @@ -15,8 +23,10 @@ core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, point local name = user:get_player_name() + local creative = minetest.settings:get_bool("creative_mode") == true + -- Special foodstuffs like the cake may disable the eating delay - local no_eat_delay = minetest.get_item_group(itemstack:get_name(), "no_eat_delay") == 1 + local no_eat_delay = creative or (minetest.get_item_group(itemstack:get_name(), "no_eat_delay") == 1) -- Allow eating only after a delay of 2 seconds. This prevents eating as an excessive speed. -- FIXME: time() is not a precise timer, so the actual delay may be +- 1 second, depending on which fraction @@ -24,11 +34,11 @@ core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, point -- FIXME: In singleplayer, there's a cheat to circumvent this, simply by pausing the game between eats. -- This is because os.time() obviously does not care about the pause. A fix needs a different timer mechanism. if no_eat_delay or (mcl_hunger.last_eat[name] < 0) or (os.difftime(os.time(), mcl_hunger.last_eat[name]) >= 2) then - local can_eat_when_full = minetest.get_item_group(itemstack:get_name(), "can_eat_when_full") == 1 + local can_eat_when_full = creative or (mcl_hunger.active == false) or minetest.get_item_group(itemstack:get_name(), "can_eat_when_full") == 1 -- Don't allow eating when player has full hunger bar (some exceptional items apply) if can_eat_when_full or (mcl_hunger.get_hunger(user) < 20) then itemstack = mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_thing) - for _, callback in pairs(core.registered_on_item_eats) do + for _, callback in pairs(minetest.registered_on_item_eats) do local result = callback(hp_change, replace_with_item, itemstack, user, pointed_thing, old_itemstack) if result then return result @@ -41,29 +51,14 @@ core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, point return itemstack end --- food functions -local food = {} - -function mcl_hunger.register_food(name, hunger_change, replace_with_item, poisontime, poison, exhaust, poisonchance, sound) - food[name] = {} - food[name].saturation = hunger_change -- hunger points added - food[name].replace = replace_with_item -- what item is given back after eating - food[name].poisontime = poisontime -- time it is poisoning. If this is set, this item is considered poisonous, - -- otherwise the following poison/exhaust fields are ignored - food[name].poison = poison -- poison damage per tick for poisonous food - food[name].exhaust = exhaust -- exhaustion per tick for poisonous food - food[name].poisonchance = poisonchance -- chance percentage that this item poisons the player (default: 100% if poisoning is enabled) - food[name].sound = sound -- special sound that is played when eating -end - function mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_thing) local item = itemstack:get_name() - local def = food[item] + local def = mcl_hunger.registered_foods[item] if not def then def = {} if type(hp_change) ~= "number" then hp_change = 1 - core.log("error", "Wrong on_use() definition for item '" .. item .. "'") + minetest.log("error", "Wrong on_use() definition for item '" .. item .. "'") end def.saturation = hp_change def.replace = replace_with_item @@ -73,11 +68,11 @@ function mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_t end -- Reset HUD bars after poisoning -local function reset_bars_poison_damage(player) +function mcl_hunger.reset_bars_poison_damage(player) hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_health.png", nil, "hudbars_bar_health.png") end -local function reset_bars_poison_hunger(player) +function mcl_hunger.reset_bars_poison_hunger(player) hb.change_hudbar(player, "hunger", nil, nil, "hbhunger_icon.png", nil, "hbhunger_bar.png") if mcl_hunger.debug then hb.change_hudbar(player, "exhaustion", nil, nil, nil, nil, "mcl_hunger_bar_exhaustion.png") @@ -85,9 +80,13 @@ local function reset_bars_poison_hunger(player) end -- Poison player -local function poisonp(tick, time, time_left, damage, exhaustion, player) +local function poisonp(tick, time, time_left, damage, exhaustion, name) + if not mcl_hunger.active then + return + end + local player = minetest.get_player_by_name(name) -- First check if player is still there - if not player:is_player() then + if not player then return end local name = player:get_player_name() @@ -97,7 +96,7 @@ local function poisonp(tick, time, time_left, damage, exhaustion, player) end time_left = time_left + tick if time_left < time then - minetest.after(tick, poisonp, tick, time, time_left, damage, exhaustion, player) + minetest.after(tick, poisonp, tick, time, time_left, damage, exhaustion, name) else if damage > 0 then mcl_hunger.poison_damage[name] = mcl_hunger.poison_damage[name] - 1 @@ -106,15 +105,19 @@ local function poisonp(tick, time, time_left, damage, exhaustion, player) mcl_hunger.poison_hunger [name] = mcl_hunger.poison_hunger[name] - 1 end if mcl_hunger.poison_damage[name] <= 0 then - reset_bars_poison_damage(player) + mcl_hunger.reset_bars_poison_damage(player) end if mcl_hunger.poison_hunger[name] <= 0 then - reset_bars_poison_hunger(player) + mcl_hunger.reset_bars_poison_hunger(player) end end -- Deal damage and exhaust player + -- TODO: Introduce fatal poison at higher difficulties if player:get_hp()-damage > 0 then + if mod_death_messages then + mcl_death_messages.player_damage(player, S("@1 succumbed to the poison.", name)) + end player:set_hp(player:get_hp()-damage) end @@ -122,35 +125,31 @@ local function poisonp(tick, time, time_left, damage, exhaustion, player) end --- Immediately stop all poisonings for this player -function mcl_hunger.stop_poison(player) - mcl_hunger.poison_damage[player:get_player_name()] = 0 - mcl_hunger.poison_hunger[player:get_player_name()] = 0 - reset_bars_poison_damage(player) - reset_bars_poison_hunger(player) -end - local poisonrandomizer = PseudoRandom(os.time()) function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poison, exhaust, poisonchance, sound) return function(itemstack, user, pointed_thing) local itemname = itemstack:get_name() - - if itemstack:take_item() ~= nil and user ~= nil then + local creative = minetest.settings:get_bool("creative_mode") == true + if itemstack:peek_item() ~= nil and user ~= nil then + if not creative then + itemstack:take_item() + end local name = user:get_player_name() local hp = user:get_hp() - local pos = user:getpos() + local pos = user:get_pos() -- player height pos.y = pos.y + 1.5 local foodtype = minetest.get_item_group(itemname, "food") if foodtype == 3 then -- Item is a drink, only play drinking sound (no particle) minetest.sound_play("survival_thirst_drink", { - pos = pos, max_hear_distance = 12, gain = 1.0, - }) + pitch = 1 + math.random(-10, 10)*0.005, + object = user, + }, true) else -- Assume the item is a food -- Add eat particle effect and sound @@ -185,13 +184,14 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso }) end minetest.sound_play("mcl_hunger_bite", { - pos = pos, max_hear_distance = 12, gain = 1.0, - }) + pitch = 1 + math.random(-10, 10)*0.005, + object = user, + }, true) end - if hunger_change then + if mcl_hunger.active and hunger_change then -- Add saturation (must be defined in item table) local _mcl_saturation = minetest.registered_items[itemname]._mcl_saturation local saturation @@ -214,7 +214,7 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso mcl_hunger.update_saturation_hud(user, mcl_hunger.get_saturation(user), h) end -- Poison - if poisontime then + if mcl_hunger.active and poisontime then local do_poison = false if poisonchance then if poisonrandomizer:next(0,100) < poisonchance then @@ -236,35 +236,28 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso end mcl_hunger.poison_hunger[name] = mcl_hunger.poison_hunger[name] + 1 end - poisonp(1, poisontime, 0, poison, exhaust, user) + poisonp(1, poisontime, 0, poison, exhaust, user:get_player_name()) end end - --sound:eat - itemstack:add_item(replace_with_item) + if not creative then + itemstack:add_item(replace_with_item) + end end return itemstack end end --- player-action based hunger changes -minetest.register_on_dignode(function(pos, oldnode, player) - -- is_fake_player comes from the pipeworks, we are not interested in those - if not player or not player:is_player() or player.is_fake_player == true then - return - end - local name = player:get_player_name() - -- dig event - mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_DIG) -end) +if mcl_hunger.active then + -- player-action based hunger changes + minetest.register_on_dignode(function(pos, oldnode, player) + -- is_fake_player comes from the pipeworks, we are not interested in those + if not player or not player:is_player() or player.is_fake_player == true then + return + end + local name = player:get_player_name() + -- dig event + mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_DIG) + end) +end --- Apply simple poison effect as long there are no real status effect --- TODO: Remove this when status effects are in place - -mcl_hunger.register_food("mcl_farming:potato_item_poison", 2, "", 4, 1, 0, 60) - -mcl_hunger.register_food("mcl_mobitems:rotten_flesh", 4, "", 30, 0, 100, 80) -mcl_hunger.register_food("mcl_mobitems:chicken", 2, "", 30, 0, 100, 30) -mcl_hunger.register_food("mcl_mobitems:spider_eye", 2, "", 4, 1, 0) - -mcl_hunger.register_food("mcl_fishing:pufferfish_raw", 1, "", 60, 1, 300) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index a794fb1f..a90bdb73 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -1,13 +1,19 @@ -local S -if (minetest.get_modpath("intllib")) then - S = intllib.Getter() -else - S = function ( s ) return s end -end - +local S = minetest.get_translator("mcl_hunger") +local mod_death_messages = minetest.get_modpath("mcl_death_messages") mcl_hunger = {} -mcl_hunger.exhaust = function() end + +--[[ This variable tells you if the hunger gameplay mechanic is active. +The state of the hunger mechanic will be determined at game start. +Hunger is enabled when damage is enabled. +If the damage setting is changed within the game, this does NOT +update the hunger mechanic, so the game must be restarted for this +to take effect. ]] +if minetest.settings:get_bool("enable_damage") == true then + mcl_hunger.active = true +else + mcl_hunger.active = false +end mcl_hunger.HUD_TICK = 0.1 @@ -18,19 +24,28 @@ mcl_hunger.EXHAUST_SPRINT_JUMP = 200 -- jump while sprinting mcl_hunger.EXHAUST_ATTACK = 100 -- hit an enemy mcl_hunger.EXHAUST_SWIM = 10 -- player movement in water mcl_hunger.EXHAUST_SPRINT = 100 -- sprint (per node) -mcl_hunger.EXHAUST_DAMAGE = 100 -- TODO (mostly done): taking damage (protected by armor) +mcl_hunger.EXHAUST_DAMAGE = 100 -- taking damage (protected by armor) mcl_hunger.EXHAUST_REGEN = 6000 -- Regenerate 1 HP mcl_hunger.EXHAUST_LVL = 4000 -- at what exhaustion player saturation gets lowered mcl_hunger.SATURATION_INIT = 5 -- Initial saturation for new/respawning players -mcl_hunger.active = false - -if minetest.settings:get_bool("enable_damage") then -mcl_hunger.active = true - -- Debug Mode. If enabled, saturation and exhaustion are shown as well. --- NOTE: Read-only. The setting should only be read at the beginning, this mod is not +-- NOTE: Only updated when settings are loaded. +mcl_hunger.debug = false + +-- Cooldown timers for each player, to force a short delay between consuming 2 food items +mcl_hunger.last_eat = {} + +dofile(minetest.get_modpath("mcl_hunger").."/api.lua") +dofile(minetest.get_modpath("mcl_hunger").."/hunger.lua") +dofile(minetest.get_modpath("mcl_hunger").."/register_foods.lua") + +--[[ IF HUNGER IS ENABLED ]] +if mcl_hunger.active == true then + +-- Read debug mode setting +-- The setting should only be read at the beginning, this mod is not -- prepared to change this setting later. mcl_hunger.debug = minetest.settings:get_bool("mcl_hunger_debug") if mcl_hunger.debug == nil then @@ -51,9 +66,6 @@ end mcl_hunger.poison_damage = {} -- damaging poison mcl_hunger.poison_hunger = {} -- food poisoning, increasing hunger --- Cooldown timers for each player, to force a short delay between consuming 2 food items -mcl_hunger.last_eat = {} - -- HUD item ids local hunger_hud = {} @@ -77,8 +89,6 @@ function mcl_hunger.update_exhaustion_hud(player, exhaustion) end end -dofile(minetest.get_modpath("mcl_hunger").."/hunger.lua") - -- register saturation hudbar hb.register_hudbar("hunger", 0xFFFFFF, S("Food"), { icon = "hbhunger_icon.png", bgicon = "hbhunger_bgicon.png", bar = "hbhunger_bar.png" }, 20, 20, false) if mcl_hunger.debug then @@ -86,62 +96,9 @@ if mcl_hunger.debug then hb.register_hudbar("exhaustion", 0xFFFFFF, S("Exhaust."), { icon = "mcl_hunger_icon_exhaustion.png", bgicon = "mcl_hunger_bgicon_exhaustion.png", bar = "mcl_hunger_bar_exhaustion.png" }, 0, mcl_hunger.EXHAUST_LVL, false, S("%s: %d/%d")) end --- API START -- -mcl_hunger.get_hunger = function(player) - local hunger = player:get_attribute("mcl_hunger:hunger") or 20 - return tonumber(hunger) -end - -mcl_hunger.get_saturation = function(player) - local saturation = player:get_attribute("mcl_hunger:saturation") or mcl_hunger.SATURATION_INIT - return tonumber(saturation) -end - -mcl_hunger.get_exhaustion = function(player) - local exhaustion = player:get_attribute("mcl_hunger:exhaustion") or 0 - return tonumber(exhaustion) -end - -mcl_hunger.set_hunger = function(player, hunger, update_hudbars) - hunger = math.min(20, math.max(0, hunger)) - player:set_attribute("mcl_hunger:hunger", tostring(hunger)) - if update_hudbars ~= false then - hb.change_hudbar(player, "hunger", hunger) - mcl_hunger.update_saturation_hud(player, nil, hunger) - end - return true -end - -mcl_hunger.set_saturation = function(player, saturation, update_hudbar) - saturation = math.min(mcl_hunger.get_hunger(player), math.max(0, saturation)) - player:set_attribute("mcl_hunger:saturation", tostring(saturation)) - if update_hudbar ~= false then - mcl_hunger.update_saturation_hud(player, saturation) - end - return true -end - -mcl_hunger.set_exhaustion = function(player, exhaustion, update_hudbar) - exhaustion = math.min(mcl_hunger.EXHAUST_LVL, math.max(0.0, exhaustion)) - player:set_attribute("mcl_hunger:exhaustion", tostring(exhaustion)) - if update_hudbar ~= false then - mcl_hunger.update_exhaustion_hud(player, exhaustion) - end - return true -end - - - --- END OF API -- -minetest.register_on_newplayer(function(player) - local name = player:get_player_name() - mcl_hunger.set_hunger(player, 20, false) - mcl_hunger.set_saturation(player, mcl_hunger.SATURATION_INIT, false) - mcl_hunger.set_exhaustion(player, 0, false) -end) - minetest.register_on_joinplayer(function(player) local name = player:get_player_name() + mcl_hunger.init_player(player) init_hud(player) mcl_hunger.poison_damage[name] = 0 mcl_hunger.poison_hunger[name] = 0 @@ -166,46 +123,18 @@ end) -- PvP combat exhaustion minetest.register_on_punchplayer(function(victim, puncher, time_from_last_punch, tool_capabilities, dir, damage) - if victim:is_player() and puncher:is_player() then - mcl_hunger.exhaust(victim:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) + if puncher:is_player() then mcl_hunger.exhaust(puncher:get_player_name(), mcl_hunger.EXHAUST_ATTACK) end end) -function mcl_hunger.exhaust(playername, increase) - local player = minetest.get_player_by_name(playername) - if not player then return false end - mcl_hunger.set_exhaustion(player, mcl_hunger.get_exhaustion(player) + increase) - if mcl_hunger.get_exhaustion(player) >= mcl_hunger.EXHAUST_LVL then - mcl_hunger.set_exhaustion(player, 0.0) - local h = nil - local satuchanged = false - local s = mcl_hunger.get_saturation(player) - if s > 0 then - mcl_hunger.set_saturation(player, math.max(s - 1.0, 0)) - satuchanged = true - elseif s <= 0.0001 then - h = mcl_hunger.get_hunger(player) - h = math.max(h-1, 0) - mcl_hunger.set_hunger(player, h) - satuchanged = true - end - if satuchanged then - if h ~= nil then h = h end - mcl_hunger.update_saturation_hud(player, mcl_hunger.get_saturation(player), h) - end +-- Exhaust on taking damage +minetest.register_on_player_hpchange(function(player, hp_change) + if hp_change < 0 then + local name = player:get_player_name() + mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_DAMAGE) end - mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) - return true -end - -function mcl_hunger.saturate(playername, increase, update_hudbar) - local player = minetest.get_player_by_name(playername) - mcl_hunger.set_saturation(player, math.min(mcl_hunger.get_saturation(player) + increase, mcl_hunger.get_hunger(player))) - if update_hudbar ~= false then - mcl_hunger.update_saturation_hud(player, mcl_hunger.get_saturation(player), mcl_hunger.get_hunger(player)) - end -end +end) local main_timer = 0 local timer = 0 -- Half second timer @@ -232,7 +161,11 @@ minetest.register_globalstep(function(dtime) mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) elseif h == 0 then -- Damage hungry player down to 1 HP + -- TODO: Allow starvation at higher difficulty levels if hp-1 > 0 then + if mod_death_messages then + mcl_death_messages.player_damage(player, S("@1 starved to death.", name)) + end player:set_hp(hp-1) end end @@ -250,4 +183,12 @@ minetest.register_globalstep(function(dtime) end end) +--[[ IF HUNGER IS NOT ENABLED ]] +else + +minetest.register_on_joinplayer(function(player) + mcl_hunger.init_player(player) + mcl_hunger.last_eat[player:get_player_name()] = -1 +end) + end diff --git a/mods/PLAYER/mcl_hunger/locale/de.txt b/mods/PLAYER/mcl_hunger/locale/de.txt deleted file mode 100644 index 3a06d93f..00000000 --- a/mods/PLAYER/mcl_hunger/locale/de.txt +++ /dev/null @@ -1 +0,0 @@ -Satiation = Sättigung diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.de.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.de.tr new file mode 100644 index 00000000..8cf10946 --- /dev/null +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.de.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_hunger +@1 succumbed to the poison.=@1 erlag dem Gift. +Food=Nahrung +Saturation=Sättigung +%s: %.1f/%d=%s: %.1f +Exhaust.=Erschöpf. +%s: %d/%d=%s: %d/%d +@1 starved to death.=@1 verhungerte. diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.es.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.es.tr new file mode 100644 index 00000000..15396a6d --- /dev/null +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.es.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_hunger +@1 succumbed to the poison.=@1 sucumbió al veneno. +Food=Comida +Saturation=Saturación +%s: %.1f/%d=%s: %.1f +Exhaust.=Cansado. +%s: %d/%d=%s: %d/%d +@1 starved to death.=@1 ha muerto de hambre. diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr new file mode 100644 index 00000000..811868b3 --- /dev/null +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_hunger +@1 succumbed to the poison.=@1 a succombé au poison. +Food=Nourriture +Saturation=Saturation +%s: %.1f/%d=%s: %.1f/%d +Exhaust.=Échappement. +%s: %d/%d=%s: %d/%d +@1 starved to death.=@1 est mort de faim. diff --git a/mods/PLAYER/mcl_hunger/locale/pt.txt b/mods/PLAYER/mcl_hunger/locale/pt.txt deleted file mode 100644 index 44fe4521..00000000 --- a/mods/PLAYER/mcl_hunger/locale/pt.txt +++ /dev/null @@ -1 +0,0 @@ -Satiation = Saciedade diff --git a/mods/PLAYER/mcl_hunger/locale/template.txt b/mods/PLAYER/mcl_hunger/locale/template.txt index 37a578dc..d745ab08 100644 --- a/mods/PLAYER/mcl_hunger/locale/template.txt +++ b/mods/PLAYER/mcl_hunger/locale/template.txt @@ -1 +1,8 @@ -Satiation +# textdomain: mcl_hunger +@1 succumbed to the poison.= +Food= +Saturation= +%s: %.1f/%d= +Exhaust.= +%s: %d/%d= +@1 starved to death.= diff --git a/mods/PLAYER/mcl_hunger/register_foods.lua b/mods/PLAYER/mcl_hunger/register_foods.lua new file mode 100644 index 00000000..449c1c4f --- /dev/null +++ b/mods/PLAYER/mcl_hunger/register_foods.lua @@ -0,0 +1,11 @@ +-- Apply simple poison effect as long there are no real status effect +-- TODO: Remove this when status effects are in place +-- TODO: Consider moving these to the respective mods + +mcl_hunger.register_food("mcl_farming:potato_item_poison", 2, "", 4, 1, 0, 60) + +mcl_hunger.register_food("mcl_mobitems:rotten_flesh", 4, "", 30, 0, 100, 80) +mcl_hunger.register_food("mcl_mobitems:chicken", 2, "", 30, 0, 100, 30) +mcl_hunger.register_food("mcl_mobitems:spider_eye", 2, "", 4, 1, 0) + +mcl_hunger.register_food("mcl_fishing:pufferfish_raw", 1, "", 60, 1, 300) diff --git a/mods/PLAYER/mcl_hunger/sounds/survival_thirst_drink.ogg b/mods/PLAYER/mcl_hunger/sounds/survival_thirst_drink.ogg index 8a97dfff..7c3df3ca 100644 Binary files a/mods/PLAYER/mcl_hunger/sounds/survival_thirst_drink.ogg and b/mods/PLAYER/mcl_hunger/sounds/survival_thirst_drink.ogg differ diff --git a/mods/PLAYER/mcl_meshhand/README.md b/mods/PLAYER/mcl_meshhand/README.md new file mode 100644 index 00000000..2c796ff3 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/README.md @@ -0,0 +1,9 @@ +Mesh hand mod for MineClone 2. + +This mod uses a better-looking mesh for the wieldhand and applies the player skin texture to it. + +== Credits == +Based on 3D Hand [newhand] mod by jordan4ibanez. +https://forum.minetest.net/viewtopic.php?t=16435 + +License: CC0 diff --git a/mods/PLAYER/mcl_meshhand/depends.txt b/mods/PLAYER/mcl_meshhand/depends.txt new file mode 100644 index 00000000..c86b5f93 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/depends.txt @@ -0,0 +1,2 @@ +mcl_tools +mcl_skins? diff --git a/mods/PLAYER/mcl_meshhand/description.txt b/mods/PLAYER/mcl_meshhand/description.txt new file mode 100644 index 00000000..7a4daae5 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/description.txt @@ -0,0 +1 @@ +Applies the player skin texture to the hand. diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua new file mode 100644 index 00000000..14bf1009 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -0,0 +1,49 @@ +local has_mcl_skins = minetest.get_modpath("mcl_skins") ~= nil + +local def = minetest.registered_items[""] + +local list +-- mcl_skins is enabled +if has_mcl_skins == true then + list = mcl_skins.list +else + list = { "hand" } +end + +--generate a node for every skin +for _,texture in pairs(list) do + -- This is a fake node that should never be placed in the world + minetest.register_node("mcl_meshhand:"..texture, { + description = "", + tiles = {texture..".png"}, + visual_scale = 1, + wield_scale = {x=1,y=1,z=1}, + paramtype = "light", + drawtype = "mesh", + mesh = "mcl_meshhand.b3d", + -- Prevent construction + node_placement_prediction = "", + on_construct = function(pos) + minetest.log("error", "[mcl_meshhand] Trying to construct mcl_meshhand:"..texture.." at "..minetest.pos_to_string(pos)) + minetest.remove_node(pos) + end, + drop = "", + on_drop = function() + return "" + end, + groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, + range = def.range, + }) +end + +if has_mcl_skins == true then + --change the player's hand to their skin + mcl_skins.register_on_set_skin(function(player, skin) + local name = player:get_player_name() + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) + end) +else + minetest.register_on_joinplayer(function(player) + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:hand") + end) +end diff --git a/mods/PLAYER/mcl_meshhand/mod.conf b/mods/PLAYER/mcl_meshhand/mod.conf new file mode 100644 index 00000000..6b57f4a4 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/mod.conf @@ -0,0 +1 @@ +name = mcl_meshhand diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d new file mode 100644 index 00000000..a38124c6 Binary files /dev/null and b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d differ diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend new file mode 100644 index 00000000..495e74eb Binary files /dev/null and b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend differ diff --git a/mods/PLAYER/mcl_player/README.txt b/mods/PLAYER/mcl_player/README.txt index 8db9c631..637a2568 100644 --- a/mods/PLAYER/mcl_player/README.txt +++ b/mods/PLAYER/mcl_player/README.txt @@ -21,4 +21,4 @@ Authors of media files MirceaKitsune (CC BY-SA 3.0): character.b3d -Textures from Faithful 1.11 resource pack (see main readme file) +Textures: See main MineClone 2 README.md file. diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 599acd65..d2dca49c 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -70,10 +70,22 @@ function mcl_player.player_set_model(player, model_name) player_model[name] = model_name end -function mcl_player.player_set_textures(player, textures) +function mcl_player.player_set_textures(player, textures, preview) local name = player:get_player_name() player_textures[name] = textures player:set_properties({textures = textures,}) + if preview then + player:get_meta():set_string("mcl_player:preview", preview) + end +end + +function mcl_player.player_get_preview(player) + local preview = player:get_meta():get_string("mcl_player:preview") + if preview == nil or preview == "" then + return "player.png" + else + return preview + end end function mcl_player.player_set_animation(player, anim_name, speed) @@ -95,6 +107,7 @@ minetest.register_on_joinplayer(function(player) mcl_player.player_attached[player:get_player_name()] = false mcl_player.player_set_model(player, "character.b3d") player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) + player:set_fov(86.1) -- see >>> end) minetest.register_on_leaveplayer(function(player) diff --git a/mods/PLAYER/mcl_player/models/character.b3d b/mods/PLAYER/mcl_player/models/character.b3d index 9ab45436..b3b772a4 100644 Binary files a/mods/PLAYER/mcl_player/models/character.b3d and b/mods/PLAYER/mcl_player/models/character.b3d differ diff --git a/mods/PLAYER/mcl_player/models/character.blend b/mods/PLAYER/mcl_player/models/character.blend index fca9f659..652579c1 100644 Binary files a/mods/PLAYER/mcl_player/models/character.blend and b/mods/PLAYER/mcl_player/models/character.blend differ diff --git a/mods/PLAYER/mcl_player/textures/player_back.png b/mods/PLAYER/mcl_player/textures/player_back.png index 4bd5366f..39e143c3 100644 Binary files a/mods/PLAYER/mcl_player/textures/player_back.png and b/mods/PLAYER/mcl_player/textures/player_back.png differ diff --git a/mods/PLAYER/mcl_player_init/init.lua b/mods/PLAYER/mcl_player_init/init.lua new file mode 100644 index 00000000..52967a44 --- /dev/null +++ b/mods/PLAYER/mcl_player_init/init.lua @@ -0,0 +1,4 @@ +minetest.register_on_joinplayer(function(player) + -- Settable hand + player:get_inventory():set_size("hand", 1) +end) diff --git a/mods/PLAYER/mcl_player_init/mod.conf b/mods/PLAYER/mcl_player_init/mod.conf new file mode 100644 index 00000000..8d559910 --- /dev/null +++ b/mods/PLAYER/mcl_player_init/mod.conf @@ -0,0 +1,2 @@ +name = mcl_player_init +description = Initialize player gameplay stuff that are neither model nor HUD-related diff --git a/mods/PLAYER/mcl_playerinfo/depends.txt b/mods/PLAYER/mcl_playerinfo/depends.txt index e5b017ff..d0334ff5 100644 --- a/mods/PLAYER/mcl_playerinfo/depends.txt +++ b/mods/PLAYER/mcl_playerinfo/depends.txt @@ -1,7 +1,4 @@ mcl_init -mcl_util mcl_core mcl_particles -mcl_hunger mcl_death_messages -3d_armor? diff --git a/mods/PLAYER/mcl_playerinfo/init.lua b/mods/PLAYER/mcl_playerinfo/init.lua index 8fa615da..31dad39a 100644 --- a/mods/PLAYER/mcl_playerinfo/init.lua +++ b/mods/PLAYER/mcl_playerinfo/init.lua @@ -57,7 +57,7 @@ minetest.register_globalstep(function(dtime) local name = player:get_player_name() -- where am I? - local pos = player:getpos() + local pos = player:get_pos() -- what is around me? local node_stand, node_stand_below, node_head, node_feet = get_player_nodes(pos) diff --git a/mods/PLAYER/mcl_playerplus/depends.txt b/mods/PLAYER/mcl_playerplus/depends.txt index 45b93f96..6bbe4cbd 100644 --- a/mods/PLAYER/mcl_playerplus/depends.txt +++ b/mods/PLAYER/mcl_playerplus/depends.txt @@ -1,8 +1,9 @@ mcl_init -mcl_util mcl_core mcl_particles mcl_hunger mcl_death_messages +playerphysics mcl_playerinfo -3d_armor? +mcl_weather +mcl_spawn diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 6517158a..d084ee2e 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -1,7 +1,8 @@ +local S = minetest.get_translator("mcl_playerplus") + -- Internal player state local mcl_playerplus_internal = {} -local armor_mod = minetest.get_modpath("3d_armor") local def = {} local time = 0 @@ -18,7 +19,7 @@ minetest.register_globalstep(function(dtime) end if player:get_player_control().jump and mcl_playerplus_internal[name].jump_cooldown <= 0 then - local pos = player:getpos() + local pos = player:get_pos() local node_stand = mcl_playerinfo[name].node_stand local node_stand_below = mcl_playerinfo[name].node_stand_below @@ -27,6 +28,9 @@ minetest.register_globalstep(function(dtime) if not node_stand or not node_stand_below or not node_head or not node_feet then return end + if not minetest.registered_nodes[node_stand] or not minetest.registered_nodes[node_stand_below] or not minetest.registered_nodes[node_head] or not minetest.registered_nodes[node_feet] then + return + end -- Cause buggy exhaustion for jumping @@ -76,7 +80,7 @@ minetest.register_globalstep(function(dtime) local name = player:get_player_name() -- where am I? - local pos = player:getpos() + local pos = player:get_pos() -- what is around me? local node_stand = mcl_playerinfo[name].node_stand @@ -89,32 +93,20 @@ minetest.register_globalstep(function(dtime) -- set defaults def.speed = 1 - def.jump = 1 - def.gravity = 1 - -- is 3d_armor mod active? if so make armor physics default - if armor_mod and armor and armor.def then - -- get player physics from armor - def.speed = armor.def[name].speed or 1 - def.jump = armor.def[name].jump or 1 - def.gravity = armor.def[name].gravity or 1 - end - - -- standing on soul sand? if so walk slower + -- Standing on soul sand? If so, walk slower if node_stand == "mcl_nether:soul_sand" then -- TODO: Tweak walk speed -- TODO: Also slow down mobs - -- FIXME: This whole speed thing is a giant hack. We need a proper framefork for cleanly handling player speeds - if node_stand_below == "mcl_core:ice" or node_stand_below == "mcl_core:packed_ice" or node_stand_below == "mcl_core:slimeblock" then - def.speed = def.speed - 0.9 + -- Slow down even more when soul sand is above certain block + if node_stand_below == "mcl_core:ice" or node_stand_below == "mcl_core:packed_ice" or node_stand_below == "mcl_core:slimeblock" or node_stand_below == "mcl_core:water_source" then + playerphysics.add_physics_factor(player, "speed", "mcl_playerplus:surface", 0.1) else - def.speed = def.speed - 0.6 + playerphysics.add_physics_factor(player, "speed", "mcl_playerplus:surface", 0.4) end - end - - -- Set player physics if there's no conflict - if player:get_attribute("mcl_beds:sleeping") ~= "true" then - player:set_physics_override(def.speed, def.jump, def.gravity) + else + -- Reset speed decrease + playerphysics.remove_physics_factor(player, "speed", "mcl_playerplus:surface") end -- Is player suffocating inside node? (Only for solid full opaque cube type nodes @@ -126,46 +118,30 @@ minetest.register_globalstep(function(dtime) and (ndef.node_box == nil or ndef.node_box.type == "regular") and (ndef.groups.disable_suffocation ~= 1) and (ndef.groups.opaque == 1) + and (node_head ~= "ignore") -- Check privilege, too and (not minetest.check_player_privs(name, {noclip = true})) then if player:get_hp() > 0 then - mcl_death_messages.player_damage(player, string.format("%s suffocated to death.", player:get_player_name())) + mcl_death_messages.player_damage(player, S("@1 suffocated to death.", name)) player:set_hp(player:get_hp() - 1) end end - -- am I near a cactus? + -- Am I near a cactus? local near = minetest.find_node_near(pos, 1, "mcl_core:cactus") - + if not near then + near = minetest.find_node_near({x=pos.x, y=pos.y-1, z=pos.z}, 1, "mcl_core:cactus") + end if near then - -- am I touching the cactus? if so it hurts - for _,object in pairs(minetest.get_objects_inside_radius(near, 1.1)) do - if object:get_hp() > 0 then - if object:is_player() then - mcl_death_messages.player_damage(object, string.format("%s was prickled by a cactus.", object:get_player_name())) - mcl_hunger.exhaust(object:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end - object:set_hp(object:get_hp() - 1) + -- Am I touching the cactus? If so, it hurts + local dist = vector.distance(pos, near) + local dist_feet = vector.distance({x=pos.x, y=pos.y-1, z=pos.z}, near) + if dist < 1.1 or dist_feet < 1.1 then + if player:get_hp() > 0 then + mcl_death_messages.player_damage(player, S("@1 was prickled to death by a cactus.", name)) + player:set_hp(player:get_hp() - 1, { type = "punch", from = "mod" }) end end - - end - - -- Apply black sky in the Void and deal Void damage - local void, void_deadly = mcl_util.is_in_void(pos) - if void then - -- Player reached the void, set black sky box - player:set_sky("#000000", "plain", nil, false) - -- FIXME: Sky handling in MCL2 is held together with lots of duct tape. - -- This only works beause weather_pack currently does not touch the sky for players below the height used for this check. - -- There should be a real skybox API. - end - if void_deadly then - -- Player is deep into the void, deal void damage - if player:get_hp() > 0 then - mcl_death_messages.player_damage(player, string.format("%s fell into the endless void.", player:get_player_name())) - player:set_hp(player:get_hp() - 4) - end end --[[ Swimming: Cause exhaustion. @@ -210,7 +186,7 @@ minetest.register_globalstep(function(dtime) -- Show positions of barriers when player is wielding a barrier local wi = player:get_wielded_item():get_name() if wi == "mcl_core:barrier" or wi == "mcl_core:realm_barrier" then - local pos = vector.round(player:getpos()) + local pos = vector.round(player:get_pos()) local r = 8 local vm = minetest.get_voxel_manip() local emin, emax = vm:read_from_map({x=pos.x-r, y=pos.y-r, z=pos.z-r}, {x=pos.x+r, y=pos.y+r, z=pos.z+r}) @@ -236,6 +212,7 @@ minetest.register_globalstep(function(dtime) expirationtime = 1, size = 8, texture = tex, + glow = 14, playername = name }) end diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr new file mode 100644 index 00000000..44d486d0 --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.=@1 erstickte zu Tode. +@1 was prickled to death by a cactus.=@1 wurde von einem Kaktus zu Tode gepiekst. diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.es.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.es.tr new file mode 100644 index 00000000..ef7705bc --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.es.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.=@1 ahogado hasta la muerte. +@1 was prickled to death by a cactus.=@1 fue herido de muerte por un cactus. diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr new file mode 100644 index 00000000..6482bd73 --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.=@1 étouffé à mort. +@1 was prickled to death by a cactus.=@1 a été piqué à mort par un cactus. diff --git a/mods/PLAYER/mcl_playerplus/locale/template.txt b/mods/PLAYER/mcl_playerplus/locale/template.txt new file mode 100644 index 00000000..49b1f96a --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.= +@1 was prickled to death by a cactus.= diff --git a/mods/PLAYER/mcl_playerplus/textures/mcl_playerplus_end_sky.png b/mods/PLAYER/mcl_playerplus/textures/mcl_playerplus_end_sky.png new file mode 100644 index 00000000..e9671f3d Binary files /dev/null and b/mods/PLAYER/mcl_playerplus/textures/mcl_playerplus_end_sky.png differ diff --git a/mods/MISC/gt2mc2/LICENSE b/mods/PLAYER/mcl_skins/LICENSE.txt similarity index 87% rename from mods/MISC/gt2mc2/LICENSE rename to mods/PLAYER/mcl_skins/LICENSE.txt index 8864d4a3..fec6f6aa 100644 --- a/mods/MISC/gt2mc2/LICENSE +++ b/mods/PLAYER/mcl_skins/LICENSE.txt @@ -1,6 +1,6 @@ -MIT License +The MIT License (MIT) -Copyright (c) 2017 +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 @@ -9,13 +9,13 @@ 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 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. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/mods/PLAYER/mcl_skins/README.md b/mods/PLAYER/mcl_skins/README.md new file mode 100644 index 00000000..bbe5309a --- /dev/null +++ b/mods/PLAYER/mcl_skins/README.md @@ -0,0 +1,13 @@ += Skins for MineClone 2 = + +Simple mod to allow players to select a skin. +Use the chat command /setskin to change skin. + +Forked from Simple Skins by TenPlus1. +https://forum.minetest.net/viewtopic.php?id=9100 + +== License == +Code under MIT license +Origial authors: +- TenPlus1 +- Zeg9 diff --git a/mods/PLAYER/mcl_skins/depends.txt b/mods/PLAYER/mcl_skins/depends.txt new file mode 100644 index 00000000..09bdf520 --- /dev/null +++ b/mods/PLAYER/mcl_skins/depends.txt @@ -0,0 +1,4 @@ +mcl_player +mcl_inventory? +intllib? +mcl_armor? diff --git a/mods/PLAYER/mcl_skins/description.txt b/mods/PLAYER/mcl_skins/description.txt new file mode 100644 index 00000000..61c7bff6 --- /dev/null +++ b/mods/PLAYER/mcl_skins/description.txt @@ -0,0 +1 @@ +Mod that allows players to set their individual skins. \ No newline at end of file diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua new file mode 100644 index 00000000..b1d1feef --- /dev/null +++ b/mods/PLAYER/mcl_skins/init.lua @@ -0,0 +1,287 @@ +-- Skins for MineClone 2 + +mcl_skins = { + skins = {}, list = {}, previews = {}, meta = {}, has_preview = {}, + modpath = minetest.get_modpath("mcl_skins"), + skin_count = 0, -- counter of _custom_ skins (all skins except character.png) +} + +local S = minetest.get_translator("mcl_skins") + +-- load skin list and metadata +local id, f, data, skin = 0 + +while true do + + if id == 0 then + skin = "character" + mcl_skins.has_preview[id] = true + else + skin = "mcl_skins_character_" .. id + local preview = "mcl_skins_player_" .. id + + -- Does skin file exist? + f = io.open(mcl_skins.modpath .. "/textures/" .. skin .. ".png") + + -- escape loop if not found + if not f then + break + end + f:close() + + -- Does skin preview file exist? + local file_preview = io.open(mcl_skins.modpath .. "/textures/" .. preview .. ".png") + if file_preview == nil then + minetest.log("warning", "[mcl_skins] Player skin #"..id.." does not have preview image (player_"..id..".png)") + mcl_skins.has_preview[id] = false + else + mcl_skins.has_preview[id] = true + file_preview:close() + end + end + + mcl_skins.list[id] = skin + + -- does metadata exist for that skin file ? + if id == 0 then + metafile = "mcl_skins_character.txt" + else + metafile = "mcl_skins_character_"..id..".txt" + end + f = io.open(mcl_skins.modpath .. "/meta/" .. metafile) + + data = nil + if f then + data = minetest.deserialize("return {" .. f:read('*all') .. "}") + f:close() + end + + -- add metadata to list + mcl_skins.meta[skin] = { + name = data and data.name or "", + author = data and data.author or "", + } + + if id > 0 then + mcl_skins.skin_count = mcl_skins.skin_count + 1 + end + id = id + 1 +end + +mcl_skins.cycle_skin = function(player) + local skin_id = tonumber(player:get_meta():get_string("mcl_skins:skin_id")) + if not skin_id then + skin_id = 0 + end + skin_id = skin_id + 1 + if skin_id > mcl_skins.skin_count then + skin_id = 0 + end + mcl_skins.set_player_skin(player, skin_id) +end + +mcl_skins.set_player_skin = function(player, skin_id) + if not player then + return false + end + local playername = player:get_player_name() + local skin, skin_file, preview + if skin_id == nil or type(skin_id) ~= "number" or skin_id < 0 or skin_id > mcl_skins.skin_count then + return false + elseif skin_id == 0 then + skin = "character" + preview = "player" + else + skin = "mcl_skins_character_" .. tostring(skin_id) + if mcl_skins.has_preview[skin_id] then + preview = "mcl_skins_player_" .. tostring(skin_id) + else + -- Fallback preview image if preview image is missing + preview = "mcl_skins_player_dummy" + end + end + skin_file = skin .. ".png" + mcl_skins.skins[playername] = skin + mcl_skins.previews[playername] = preview + player:get_meta():set_string("mcl_skins:skin_id", tostring(skin_id)) + mcl_skins.update_player_skin(player) + if minetest.get_modpath("mcl_armor") then + armor.textures[playername].skin = skin_file + armor:update_player_visuals(player) + end + if minetest.get_modpath("mcl_inventory") then + mcl_inventory.update_inventory_formspec(player) + end + for i=1, #mcl_skins.registered_on_set_skins do + mcl_skins.registered_on_set_skins[i](player, skin) + end + minetest.log("action", "[mcl_skins] Player skin for "..playername.." set to skin #"..skin_id) + return true +end + +mcl_skins.update_player_skin = function(player) + if not player then + return + end + local playername = player:get_player_name() + mcl_player.player_set_textures(player, { mcl_skins.skins[playername] .. ".png" }, mcl_skins.previews[playername] .. ".png" ) +end + +-- load player skin on join +minetest.register_on_joinplayer(function(player) + + local name = player:get_player_name() + local skin_id = player:get_meta():get_string("mcl_skins:skin_id") + local set_skin + -- do we already have a skin in player attributes? + if skin_id ~= nil and skin_id ~= "" then + set_skin = tonumber(skin_id) + -- otherwise use random skin if not set + end + if not set_skin then + set_skin = math.random(0, mcl_skins.skin_count) + end + local ok = mcl_skins.set_player_skin(player, set_skin) + if not ok then + set_skin = math.random(0, mcl_skins.skin_count) + minetest.log("warning", "[mcl_skins] Player skin for "..name.." not found, falling back to skin #"..set_skin) + mcl_skins.set_player_skin(player, set_skin) + end +end) + +mcl_skins.registered_on_set_skins = {} + +mcl_skins.register_on_set_skin = function(func) + table.insert(mcl_skins.registered_on_set_skins, func) +end + +-- command to set player skin (usually for custom skins) +minetest.register_chatcommand("setskin", { + params = S("[] []"), + description = S("Select player skin of yourself or another player"), + privs = {}, + func = function(name, param) + + if param == "" and name ~= "" then + mcl_skins.show_formspec(name) + return true + end + local playername, skin_id = string.match(param, "([^ ]+) (%d+)") + if not playername or not skin_id then + skin_id = string.match(param, "(%d+)") + if not skin_id then + return false, S("Insufficient or wrong parameters") + end + playername = name + end + skin_id = tonumber(skin_id) + + local player = minetest.get_player_by_name(playername) + + if not player then + return false, S("Player @1 not online!", playername) + end + if name ~= playername then + local privs = minetest.get_player_privs(name) + if not privs.server then + return false, S("You need the “server” privilege to change the skin of other players!") + end + end + + local skin + local ok = mcl_skins.set_player_skin(player, skin_id) + if not ok then + return false, S("Invalid skin number! Valid numbers: 0 to @1", mcl_skins.skin_count) + end + local skinfile = "#"..skin_id + + local meta = mcl_skins.meta[mcl_skins.skins[playername]] + local your_msg + if not meta.name or meta.name == "" then + your_msg = S("Your skin has been set to: @1", skinfile) + else + your_msg = S("Your skin has been set to: @1 (@2)", meta.name, skinfile) + end + if name == playername then + return true, your_msg + else + minetest.chat_send_player(playername, your_msg) + return true, S("Skin of @1 set to: @2 (@3)", playername, meta.name, skinfile) + end + + end, +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.__mcl_skins then + if mcl_skins.skin_count <= 6 then + -- Change skin immediately if there are not many skins + mcl_skins.cycle_skin(player) + else + -- Show skin selection formspec otherwise + mcl_skins.show_formspec(player:get_player_name()) + end + end +end) + +mcl_skins.show_formspec = function(playername) + local formspec = "size[7,8.5]" + + formspec = formspec .. "label[2,2;" .. minetest.formspec_escape(minetest.colorize("#383838", S("Select player skin:"))) .. "]" + .. "textlist[0,2.5;6.8,6;skins_set;" + + local meta + local selected = 1 + + for i = 0, mcl_skins.skin_count do + + local label = S("@1 (@2)", mcl_skins.meta[mcl_skins.list[i]].name, "#"..i) + + formspec = formspec .. minetest.formspec_escape(label) + + if mcl_skins.skins[playername] == mcl_skins.list[i] then + selected = i + 1 + meta = mcl_skins.meta[mcl_skins.list[i]] + end + + if i < #mcl_skins.list then + formspec = formspec .."," + end + end + + formspec = formspec .. ";" .. selected .. ";false]" + + formspec = formspec .. "image[0,0;1.35,2.7;" .. mcl_skins.previews[playername] .. ".png]" + + if meta then + if meta.name and meta.name ~= "" then + formspec = formspec .. "label[2,0.5;" .. minetest.formspec_escape(minetest.colorize("#383838", S("Name: @1", meta.name))) .. "]" + end + end + + minetest.show_formspec(playername, "mcl_skins:skin_select", formspec) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + + if formname == "mcl_skins:skin_select" then + + local name = player:get_player_name() + + local event = minetest.explode_textlist_event(fields["skins_set"]) + + if event.type == "CHG" or event.type == "DCL" then + + local skin_id = math.min(event.index - 1, mcl_skins.skin_count) + if not mcl_skins.list[skin_id] then + return -- Do not update wrong skin number + end + + mcl_skins.set_player_skin(player, skin_id) + mcl_skins.show_formspec(name) + end + end +end) + +minetest.log("action", "[mcl_skins] Mod initialized with "..mcl_skins.skin_count.." custom skin(s)") + diff --git a/mods/ENTITIES/mcl_paintings/intllib.lua b/mods/PLAYER/mcl_skins/intllib.lua similarity index 100% rename from mods/ENTITIES/mcl_paintings/intllib.lua rename to mods/PLAYER/mcl_skins/intllib.lua diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.de.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.de.tr new file mode 100644 index 00000000..8f9b488d --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.de.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_skins +[] []=[] [] +Select player skin of yourself or another player=Spieleraussehen von Ihnen oder einem anderen Spieler auswählen +Insufficient or wrong parameters=Unzureichende oder falsche Parameter +Player @1 not online!=Spieler @1 ist nicht online! +You need the “server” privilege to change the skin of other players!=Sie brauchen das „server“-Privileg, um das Aussehen anderer Spieler zu ändern! +Invalid skin number! Valid numbers: 0 to @1=Ungültige Aussehens-Nummer! Gültige Nummern: 0 bis @1 +Your skin has been set to: @1=Ihr Aussehen wurde geändert auf: @1 +Your skin has been set to: @1 (@2)=Ihr Aussehen wurde geändert auf: @1 (@2) +Skin of @1 set to: @2 (@3)=Aussehen von @1 gesetzt auf: @2 (@3) +Select player skin:=Spieleraussehen wählen: +@1 (@2)=@1 (@2) +Name: @1=Name: @1 diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.es.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.es.tr new file mode 100644 index 00000000..dcd5c843 --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.es.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_skins +[] []=[] [] +Select player skin of yourself or another player=Selecciona el skin tuyo o de otro jugador +Insufficient or wrong parameters=Parámetros insuficientes o incorrectos +Player @1 not online!=¡El jugador @1 no está en línea! +You need the “server” privilege to change the skin of other players!=¡Necesitas el privilegio de "servidor" para cambiar el aspecto de otros jugadores! +Invalid skin number! Valid numbers: 0 to @1=¡Número de piel no válido! Números válidos: 0 a @1 +Your skin has been set to: @1=Su skin se ha configurado a: @1 +Your skin has been set to: @1 (@2)=Su skin se ha configurado a: @1 (@2) +Skin of @1 set to: @2 (@3)=El skin de @1 se ha configurado a: @2 (@3) +Select player skin:=Selecciona el skin del jugador: +@1 (@2)=@1 (@2) +Name: @1=Nombre: @1 diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr new file mode 100644 index 00000000..146c6be5 --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_skins +[] []=[] [] +Select player skin of yourself or another player=Sélectionner une apparence pour vous même ou un autre joueur +Insufficient or wrong parameters=Paramètres insuffisants ou incorrects +Player @1 not online!=Le joueur @1 n'est pas en ligne! +You need the “server” privilege to change the skin of other players!=Vous avez besoin du privilège “server” pour changer l'apparence des autres joueurs! +Invalid skin number! Valid numbers: 0 to @1=Numéro d'apparence incorrect! Numéros valides : 0 à @1 +Your skin has been set to: @1=Votre apparence a été définie à: @1 +Your skin has been set to: @1 (@2)=Votre apparence a été définie à: @1 (@2) +Skin of @1 set to: @2 (@3)=Apparence of @1 set to: @2 (@3)= +Select player skin:=Sélectionner l'apparence du joueur : +@1 (@2)=@1 (@2) +Name: @1=Nom : @ + diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.ms.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.ms.tr new file mode 100644 index 00000000..58946f60 --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.ms.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_skins +# UNFINISHED translation! +# TODO: Remove the # sign from the translations below and add the missing translations. + +[] []= +Select player skin of yourself or another player= +Insufficient or wrong parameters= +Player @1 not online!= +You need the “server” privilege to change the skin of other players!= +Invalid skin number! Valid numbers: 0 to @1= +Your skin has been set to: @1= +Your skin has been set to: @1 (@2)= +Skin of @1 set to: @2 (@3)= +Select player skin:=Pilih Kulit Pemain: +@1 (@2)= +Name: @1=Nama: @1 diff --git a/mods/PLAYER/mcl_skins/locale/template.txt b/mods/PLAYER/mcl_skins/locale/template.txt new file mode 100644 index 00000000..c683fa4e --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/template.txt @@ -0,0 +1,13 @@ +# textdomain: mcl_skins +[] []= +Select player skin of yourself or another player= +Insufficient or wrong parameters= +Player @1 not online!= +You need the “server” privilege to change the skin of other players!= +Invalid skin number! Valid numbers: 0 to @1= +Your skin has been set to: @1= +Your skin has been set to: @1 (@2)= +Skin of @1 set to: @2 (@3)= +Select player skin:= +@1 (@2)= +Name: @1= diff --git a/mods/PLAYER/mcl_skins/meta/mcl_skins_character.txt b/mods/PLAYER/mcl_skins/meta/mcl_skins_character.txt new file mode 100644 index 00000000..00061a65 --- /dev/null +++ b/mods/PLAYER/mcl_skins/meta/mcl_skins_character.txt @@ -0,0 +1,2 @@ +name = "Steve", +author = "%TEXTURE_PACK_AUTHOR%", diff --git a/mods/PLAYER/mcl_skins/meta/mcl_skins_character_1.txt b/mods/PLAYER/mcl_skins/meta/mcl_skins_character_1.txt new file mode 100644 index 00000000..f96b13f6 --- /dev/null +++ b/mods/PLAYER/mcl_skins/meta/mcl_skins_character_1.txt @@ -0,0 +1,2 @@ +name = "Alex", +author = "%TEXTURE_PACK_AUTHOR%", diff --git a/mods/PLAYER/mcl_skins/mod.conf b/mods/PLAYER/mcl_skins/mod.conf new file mode 100644 index 00000000..96f82764 --- /dev/null +++ b/mods/PLAYER/mcl_skins/mod.conf @@ -0,0 +1 @@ +name = mcl_skins diff --git a/mods/PLAYER/mcl_skins/textures/mcl_skins_button.png b/mods/PLAYER/mcl_skins/textures/mcl_skins_button.png new file mode 100644 index 00000000..5b618ec2 Binary files /dev/null and b/mods/PLAYER/mcl_skins/textures/mcl_skins_button.png differ diff --git a/mods/PLAYER/mcl_skins/textures/mcl_skins_character_1.png b/mods/PLAYER/mcl_skins/textures/mcl_skins_character_1.png new file mode 100644 index 00000000..598877bb Binary files /dev/null and b/mods/PLAYER/mcl_skins/textures/mcl_skins_character_1.png differ diff --git a/mods/PLAYER/mcl_skins/textures/mcl_skins_player_1.png b/mods/PLAYER/mcl_skins/textures/mcl_skins_player_1.png new file mode 100644 index 00000000..a01fb027 Binary files /dev/null and b/mods/PLAYER/mcl_skins/textures/mcl_skins_player_1.png differ diff --git a/mods/PLAYER/mcl_skins/textures/mcl_skins_player_dummy.png b/mods/PLAYER/mcl_skins/textures/mcl_skins_player_dummy.png new file mode 100644 index 00000000..42525fd1 Binary files /dev/null and b/mods/PLAYER/mcl_skins/textures/mcl_skins_player_dummy.png differ diff --git a/mods/PLAYER/mcl_spawn/depends.txt b/mods/PLAYER/mcl_spawn/depends.txt new file mode 100644 index 00000000..3b355984 --- /dev/null +++ b/mods/PLAYER/mcl_spawn/depends.txt @@ -0,0 +1 @@ +mcl_init diff --git a/mods/PLAYER/mcl_spawn/description.txt b/mods/PLAYER/mcl_spawn/description.txt new file mode 100644 index 00000000..6712e443 --- /dev/null +++ b/mods/PLAYER/mcl_spawn/description.txt @@ -0,0 +1 @@ +Set and get the player's respawn position diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua new file mode 100644 index 00000000..66fe8cdd --- /dev/null +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -0,0 +1,123 @@ +mcl_spawn = {} + +local S = minetest.get_translator("mcl_spawn") +local mg_name = minetest.get_mapgen_setting("mg_name") + +local cached_world_spawn + +mcl_spawn.get_world_spawn_pos = function() + local spawn + spawn = minetest.setting_get_pos("static_spawnpoint") + if spawn then + return spawn + end + if cached_world_spawn then + return cached_world_spawn + end + -- 32 attempts to find a suitable spawn point + spawn = { x=math.random(-16, 16), y=8, z=math.random(-16, 16) } + for i=1, 32 do + local y = minetest.get_spawn_level(spawn.x, spawn.z) + if y then + spawn.y = y + cached_world_spawn = spawn + minetest.log("action", "[mcl_spawn] Dynamic world spawn determined to be "..minetest.pos_to_string(spawn)) + return spawn + end + -- Random walk + spawn.x = spawn.x + math.random(-64, 64) + spawn.z = spawn.z + math.random(-64, 64) + end + minetest.log("action", "[mcl_spawn] Failed to determine dynamic world spawn!") + -- Use dummy position if nothing found + return { x=math.random(-16, 16), y=8, z=math.random(-16, 16) } +end + +-- Returns a spawn position of player. +-- If player is nil or not a player, a world spawn point is returned. +-- The second return value is true if returned spawn point is player-chosen, +-- false otherwise. +mcl_spawn.get_spawn_pos = function(player) + local spawn, custom_spawn = nil, false + if player ~= nil and player:is_player() then + local attr = player:get_meta():get_string("mcl_beds:spawn") + if attr ~= nil and attr ~= "" then + spawn = minetest.string_to_pos(attr) + custom_spawn = true + end + end + if not spawn or spawn == "" then + spawn = mcl_spawn.get_world_spawn_pos() + custom_spawn = false + end + return spawn, custom_spawn +end + +-- Sets the player's spawn position to pos. +-- Set pos to nil to clear the spawn position. +-- If message is set, informs the player with a chat message when the spawn position +-- changed. +mcl_spawn.set_spawn_pos = function(player, pos, message) + local spawn_changed = false + local meta = player:get_meta() + if pos == nil then + if meta:get_string("mcl_beds:spawn") ~= "" then + spawn_changed = true + if message then + minetest.chat_send_player(player:get_player_name(), S("Respawn position cleared!")) + end + end + meta:set_string("mcl_beds:spawn", "") + else + local oldpos = minetest.string_to_pos(meta:get_string("mcl_beds:spawn")) + if oldpos then + -- We don't bother sending a message if the new spawn pos is basically the same + if vector.distance(pos, oldpos) > 0.1 then + spawn_changed = true + if message then + minetest.chat_send_player(player:get_player_name(), S("New respawn position set!")) + end + end + end + meta:set_string("mcl_beds:spawn", minetest.pos_to_string(pos)) + end + return spawn_changed +end + +local function get_far_node(pos) + local node = minetest.get_node(pos) + if node.name ~= "ignore" then + return node + end + minetest.get_voxel_manip():read_from_map(pos, pos) + return minetest.get_node(pos) +end + +-- Respawn player at specified respawn position +minetest.register_on_respawnplayer(function(player) + local pos, custom_spawn = mcl_spawn.get_spawn_pos(player) + if pos and custom_spawn then + -- Check if bed is still there + -- and the spawning position is free of solid or damaging blocks. + local node_bed = get_far_node(pos) + local node_up1 = get_far_node({x=pos.x,y=pos.y+1,z=pos.z}) + local node_up2 = get_far_node({x=pos.x,y=pos.y+2,z=pos.z}) + local bgroup = minetest.get_item_group(node_bed.name, "bed") + local def1 = minetest.registered_nodes[node_up1.name] + local def2 = minetest.registered_nodes[node_up2.name] + if (bgroup == 1 or bgroup == 2) and + (not def1.walkable) and (not def2.walkable) and + (def1.damage_per_second == nil or def2.damage_per_second <= 0) and + (def1.damage_per_second == nil or def2.damage_per_second <= 0) then + player:set_pos(pos) + return true + else + -- Forget spawn if bed was missing + if (bgroup ~= 1 and bgroup ~= 2) then + mcl_spawn.set_spawn_pos(player, nil) + end + minetest.chat_send_player(player:get_player_name(), S("Your spawn bed was missing or blocked.")) + end + end +end) + diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr new file mode 100644 index 00000000..e30a7165 --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_spawn +New respawn position set!=Neue Wiedereinstiegsposition gesetzt! +Respawn position cleared!=Wiedereinstiegsposition gelöscht! +Your spawn bed was missing or blocked.=Ihr Startbett fehlte oder war blockiert. diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.es.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.es.tr new file mode 100644 index 00000000..d6de52f9 --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.es.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_spawn +New respawn position set!=¡Nueva posición de reaparición establecida! +Respawn position cleared!=¡Posición de reaparición eliminada! +Your spawn bed was missing or blocked.=Su cama ha sido destruida o estaba bloqueada. diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.fr.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.fr.tr new file mode 100644 index 00000000..f1fab2bf --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_spawn +New respawn position set!=Nouvelle position de réapparition définie! +Respawn position cleared!=Position de réapparition supprimée! +Your spawn bed was missing or blocked.=Votre lit d'apparition était manquant ou bloqué. diff --git a/mods/PLAYER/mcl_spawn/locale/template.txt b/mods/PLAYER/mcl_spawn/locale/template.txt new file mode 100644 index 00000000..8906d18f --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_spawn +New respawn position set!= +Respawn position cleared!= +Your spawn bed was missing or blocked.= diff --git a/mods/PLAYER/mcl_spawn/mod.conf b/mods/PLAYER/mcl_spawn/mod.conf new file mode 100644 index 00000000..ff54191b --- /dev/null +++ b/mods/PLAYER/mcl_spawn/mod.conf @@ -0,0 +1 @@ +name = mcl_spawn diff --git a/mods/PLAYER/mcl_sprint/depends.txt b/mods/PLAYER/mcl_sprint/depends.txt index 2fd97244..aa6711ef 100644 --- a/mods/PLAYER/mcl_sprint/depends.txt +++ b/mods/PLAYER/mcl_sprint/depends.txt @@ -1,2 +1,3 @@ mcl_playerinfo +playerphysics mcl_hunger diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index c4fe3a0a..efd39ae6 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -31,7 +31,7 @@ minetest.register_on_joinplayer(function(player) sprinting = false, timeOut = 0, shouldSprint = false, - lastPos = player:getpos(), + lastPos = player:get_pos(), sprintDistance = 0, } end) @@ -39,6 +39,20 @@ minetest.register_on_leaveplayer(function(player) local playerName = player:get_player_name() players[playerName] = nil end) + +local function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting) + local player = minetest.get_player_by_name(playerName) + if players[playerName] then + players[playerName]["sprinting"] = sprinting + if sprinting == true then + playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) + elseif sprinting == false then + playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") + end + return true + end + return false +end minetest.register_globalstep(function(dtime) --Get the gametime local gameTime = minetest.get_gametime() @@ -47,14 +61,15 @@ minetest.register_globalstep(function(dtime) for playerName,playerInfo in pairs(players) do local player = minetest.get_player_by_name(playerName) if player ~= nil then + local ctrl = player:get_player_control() --Check if the player should be sprinting - if player:get_player_control()["aux1"] and player:get_player_control()["up"] then + if ctrl.aux1 and ctrl.up and not ctrl.sneak then players[playerName]["shouldSprint"] = true else players[playerName]["shouldSprint"] = false end - local playerPos = player:getpos() + local playerPos = player:get_pos() --If the player is sprinting, create particles behind and cause exhaustion if playerInfo["sprinting"] == true and gameTime % 0.1 == 0 then @@ -71,12 +86,13 @@ minetest.register_globalstep(function(dtime) -- Sprint dirt particles local numParticles = math.random(1, 2) local playerNode = minetest.get_node({x=playerPos["x"], y=playerPos["y"]-1, z=playerPos["z"]}) - if playerNode["name"] ~= "air" then + local def = minetest.registered_nodes[playerNode.name] + if def and def.walkable then for i=1, numParticles, 1 do minetest.add_particle({ pos = {x=playerPos["x"]+math.random(-1,1)*math.random()/2,y=playerPos["y"]+0.1,z=playerPos["z"]+math.random(-1,1)*math.random()/2}, - vel = {x=0, y=5, z=0}, - acc = {x=0, y=-13, z=0}, + velocity = {x=0, y=5, z=0}, + acceleration = {x=0, y=-13, z=0}, expirationtime = math.random(), size = math.random()+0.5, collisiondetection = true, @@ -91,8 +107,8 @@ minetest.register_globalstep(function(dtime) players[playerName].lastPos = playerPos if players[playerName]["shouldSprint"] == true then --Stopped local sprinting - -- Prevent sprinting if standing on soul sand or hungry - if mcl_playerinfo[playerName].node_stand == "mcl_nether:soul_sand" or (mcl_hunger.active and mcl_hunger.get_hunger(player) <= 6) then + -- Prevent sprinting if hungry or sleeping + if (mcl_hunger.active and mcl_hunger.get_hunger(player) <= 6) or (player:get_meta():get_string("mcl_beds:sleeping") == "true")then sprinting = false else sprinting = true @@ -105,20 +121,3 @@ minetest.register_globalstep(function(dtime) end end end) - -function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting) - local player = minetest.get_player_by_name(playerName) - if players[playerName] then - players[playerName]["sprinting"] = sprinting - -- Don't overwrite physics when standing on soul sand or sleeping - if mcl_playerinfo[playerName].node_stand ~= "mcl_nether:soul_sand" and player:get_attribute("mcl_beds:sleeping") ~= "true" then - if sprinting == true then - player:set_physics_override({speed=mcl_sprint.SPEED}) - elseif sprinting == false then - player:set_physics_override({speed=1.0}) - end - return true - end - end - return false -end diff --git a/mods/PLAYER/modpack.conf b/mods/PLAYER/modpack.conf new file mode 100644 index 00000000..52814db1 --- /dev/null +++ b/mods/PLAYER/modpack.conf @@ -0,0 +1,2 @@ +name = PLAYER +description = Meta-modpack that contains player-related mods for MineClone 2 diff --git a/mods/PLAYER/modpack.txt b/mods/PLAYER/modpack.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/mods/PLAYER/playerphysics/README.md b/mods/PLAYER/playerphysics/README.md new file mode 100644 index 00000000..303213fb --- /dev/null +++ b/mods/PLAYER/playerphysics/README.md @@ -0,0 +1,116 @@ +# Player Physics API. + +Version: 1.0.0 + +This mod makes it possible for multiple mods to modify player physics (speed, jumping strength, gravity) without conflict. + +## Introduction +### For players +Mods and games in Minetest can set physical attributes of players, such as speed and jump strength. For example, player speed could be set to 200%. But the way this works makes it difficult for multiple mods to *modify* physical attributes without leading to conflicts, problems and hilarious bugs, like speed that changes often to nonsense values. + +The Player Physics API aims to resolve this conflict by providing a “common ground” for mods to work together in this regard. + +This mod does nothing on its own, you will only need to install it as dependency of other mods. + +When you browse for mods that somehow mess with player physics (namely: speed, jump strength or gravity) and want to use more than one of them, check out if they support the Player Physics API. If they don't, it's very likely these mods will break as soon you activate more than one of them, for example, if two mods try to set the player speed. If you found such a “hilarious bug”, please report it to the developers of the mods (or games) and point them to the Player Physics API. + +Of course, not all mods need the Player Physics API. Mods that don't touch player physics at all won't need this mod. + +The rest of this document is directed at developers. + +### For developers +The function `set_physics_override` from the Minetest Lua API allows mod authors to override physical attributes of players, such as speed or jump strength. + +This function works fine as long there is only one mod that sets a particular physical attribute at a time. However, as soon as at least two different mods (that do not know each other) try to change the same player physics attribute using only this function, there will be conflicts as each mod will undo the change of the other mod, as the function sets a raw value. A classic race condition occurs. This is the case because the mods fail to communicate with each other. + +This mod solves the problem of conflicts. It bans the concept of “setting the raw value directly” and replaces it with the concept of factors that mods can add and remove for each attribute. The real physical player attribute will be the product of all active factors. + +## Quick start +Let's say you have a mod `example` and want to double the speed of the player (i.e. multiply it by a factor of 2), but you also don't want to break other mods that might touch the speed. + +Previously, you might have written something like this: + +`player:set_physics_override({speed=2})` + +However, your mod broke down as soon the mod `example2` came along, which wanted to increase the speed by 50%. In the real game, the player speed randomly switched from 50% and 200% which was a very annoying bug. + +In your `example` mod, you can replace the code with this: + +`playerphysics.add_physics_factor(player, "speed", "my_double_speed", 2)` + +Where `"my_double_speed` is an unique ID for your speed factor. + +Now your `example` mod is interoperable! And now, of course, the `example2` mod has to be updated in a similar fashion. + +## Precondition +There is only one precondition to using this mod, but it is important: + +Mods *MUST NOT* call `set_physics_override` directly for numerical values. Instead, to modify player physics, all mods that touch player physics have to use this API. + +## Functions +### `playerphysics.add_physics_factor(player, attribute, id, value)` +Adds a factor for a player physic and updates the player physics immediately. + +#### Parameters +* `player`: Player object +* `attribute`: Which of the physical attributes to change. Any of the numeric values of `set_physics_override` (e.g. `"speed"`, `"jump"`, `"gravity"`) +* `id`: Unique identifier for this factor. Identifiers are stored on a per-player per-attribute type basis +* `value`: The factor to add to the list of products + +If a factor for the same player, attribute and `id` already existed, it will be overwritten. + +### `playerphysics.remove_physics_factor(player, attribute, id)` +Removes the physics factor of the given ID and updates the player's physics. + +#### Parameters +Same as in `playerphysics.add_physics_factor`, except there is no `value` argument. + +## Examples +### Speed changes +Let's assume this mod is used by 3 different mods all trying to change the speed: +Potions, Exhaustion and Electrocution. +Here's what it could look like: + +Potions mod: +``` +playerphysics.add_physics_factor(player, "speed", "run_potion", 2) +``` + +Exhaustion mod: +``` +playerphysics.add_physics_factor(player, "jump", "exhausted", 0.75) +``` + +Electrocution mod: +``` +playerphysics.add_physics_factor(player, "jump", "shocked", 0.9) +``` + +When the 3 mods have done their change, the real player speed is simply the product of all factors, that is: + +2 * 0.75 * 0.9 = 1.35 + +The final player speed is thus 135%. + +### Speed changes, part 2 + +Let's take the example above. +Now if the Electrocution mod is done with shocking the player, it just needs to call: + +``` +playerphysics.remove_physics_factor(player, "jump", "shocked") +``` + +The effect is now gone, so the new player speed will be: + +2 * 0.75 = 1.5 + +### Sleeping +To simulate sleeping by preventing all player movement, this can be done with this easy trick: + +``` +playerphysics.add_physics_factor(player, "speed", "sleeping", 0) +playerphysics.add_physics_factor(player, "jump", "sleeping", 0) +``` + +This works regardless of the other factors because 0 times anything equals 0. diff --git a/mods/PLAYER/playerphysics/README.md.bak b/mods/PLAYER/playerphysics/README.md.bak new file mode 100644 index 00000000..abd48bb6 --- /dev/null +++ b/mods/PLAYER/playerphysics/README.md.bak @@ -0,0 +1,116 @@ +# Player Physics API. + +Version: 1.0.0 + +This mod makes it possible for multiple mods to modify player physics (speed, jumping strength, gravity) without conflict. + +## Introduction +### For players +Mods and games in Minetest can set physical attributes of players, such as speed and jump strength. For example, player speed could be set to 200%. But the way this works makes it difficult for multiple mods to *modify* physical attributes without leading to conflicts, problems and hilarious bugs, like speed that changes often to nonsense values. + +The Player Physics API aims to resolve this conflict by providing a “common ground” for mods to work together in this regard. + +This mod does nothing on its own, you will only need to install it as dependency of other mods. + +When you browse for mods that somehow mess with player physics (namely: speed, jump strength or gravity) and want to use more than one of them, check out if they support the Player Physics API. If they don't, it's very likely these mods will break as soon you activate more than one of them, for example, if two mods try to set the player speed. If you found such a “hilarious bug”, please report it to the developers of the mods (or games) and point them to the Player Physics API. + +Of course, not all mods need the Player Physics API. Mods that don't touch player physics at all won't need this mod. + +The rest of this document is directed at developers. + +### For developers +The function `set_physics_override` from the Minetest Lua API allows mod authors to override physical attributes of players, such as speed or jump strength. + +This function works fine as long there is only one mod that sets a particular physical attribute at a time. However, as soon as at least two different mods (that do not know each other) try to change the same player physics attribute using only this function, there will be conflicts as each mod will undo the change of the other mod, as the function sets a raw value. A classic race condition occurs. This is the case because the mods fail to communicate with each other. + +This mod solves the problem of conflicts. It bans the concept of “setting the raw value directly” and replaces it with the concept of factors that mods can add and remove for each attribute. The real phyisical player attribute will be the product of all active factors. + +## Quick start +Let's say you have a mod `example` and want to double the speed of the player (i.e. multiply it by a factor of 2), but you also don't want to break other mods that might touch the speed. + +Previously, you might have written something like this: + +`player:set_physics_override({speed=2})` + +However, your mod broke down as soon the mod `example2` came along, which wanted to increase the speed by 50%. In the real game, the player speed randomly switched from 50% and 200% which was a very annoying bug. + +In your `example` mod, you can replace the code with this: + +`playerphysics.add_physics_factor(player, "speed", "my_double_speed", 2)` + +Where `"my_double_speed` is an unique ID for your speed factor. + +Now your `example` mod is interoperable! And now, of course, the `example2` mod has to be updated in a similar fashion. + +## Precondition +There is only one precondition to using this mod, but it is important: + +Mods *MUST NOT* call `set_physics_override` directly for numerical values. Instead, to modify player physics, all mods that touch player physics have to use this API. + +## Functions +### `playerphysics.add_physics_factor(player, attribute, id, value)` +Adds a factor for a player physic and updates the player physics immediately. + +#### Parameters +* `player`: Player object +* `attribute`: Which of the physical attributes to change. Any of the numeric values of `set_physics_override` (e.g. `"speed"`, `"jump"`, `"gravity"`) +* `id`: Unique identifier for this factor. Identifiers are stored on a per-player per-attribute type basis +* `value`: The factor to add to the list of products + +If a factor for the same player, attribute and `id` already existed, it will be overwritten. + +### `playerphysics.remove_physics_factor(player, attribute, id)` +Removes the physics factor of the given ID and updates the player's physics. + +#### Parameters +Same as in `playerphysics.add_physics_factor`, except there is no `value` argument. + +## Examples +### Speed changes +Let's assume this mod is used by 3 different mods all trying to change the speed: +Potions, Exhaustion and Electrocution. +Here's what it could look like: + +Potions mod: +``` +playerphysics.add_physics_factor(player, "speed", "run_potion", 2) +``` + +Exhaustion mod: +``` +playerphysics.add_physics_factor(player, "jump", "exhausted", 0.75) +``` + +Electrocution mod: +``` +playerphysics.add_physics_factor(player, "jump", "shocked", 0.9) +``` + +When the 3 mods have done their change, the real player speed is simply the product of all factors, that is: + +2 * 0.75 * 0.9 = 1.35 + +The final player speed is thus 135%. + +### Speed changes, part 2 + +Let's take the example above. +Now if the Electrocution mod is done with shocking the player, it just needs to call: + +``` +playerphysics.remove_physics_factor(player, "jump", "shocked") +``` + +The effect is now gone, so the new player speed will be: + +2 * 0.75 = 1.5 + +### Sleeping +To simulate sleeping by preventing all player movement, this can be done with this easy trick: + +``` +playerphysics.add_physics_factor(player, "speed", "sleeping", 0) +playerphysics.add_physics_factor(player, "jump", "sleeping", 0) +``` + +This works regardless of the other factors because 0 times anything equals 0. diff --git a/mods/PLAYER/playerphysics/description.txt b/mods/PLAYER/playerphysics/description.txt new file mode 100644 index 00000000..c692c5cd --- /dev/null +++ b/mods/PLAYER/playerphysics/description.txt @@ -0,0 +1 @@ +This mod makes it possible for multiple mods to modify player physics (speed, jumping strength, gravity) without conflict. diff --git a/mods/PLAYER/playerphysics/init.lua b/mods/PLAYER/playerphysics/init.lua new file mode 100644 index 00000000..50d6454d --- /dev/null +++ b/mods/PLAYER/playerphysics/init.lua @@ -0,0 +1,45 @@ +playerphysics = {} + +local function calculate_attribute_product(player, attribute) + local a = minetest.deserialize(player:get_meta():get_string("playerphysics:physics")) + local product = 1 + if a == nil or a[attribute] == nil then + return product + end + local factors = a[attribute] + if type(factors) == "table" then + for _, factor in pairs(factors) do + product = product * factor + end + end + return product +end + +function playerphysics.add_physics_factor(player, attribute, id, value) + local meta = player:get_meta() + local a = minetest.deserialize(meta:get_string("playerphysics:physics")) + if a == nil then + a = { [attribute] = { [id] = value } } + elseif a[attribute] == nil then + a[attribute] = { [id] = value } + else + a[attribute][id] = value + end + meta:set_string("playerphysics:physics", minetest.serialize(a)) + local raw_value = calculate_attribute_product(player, attribute) + player:set_physics_override({[attribute] = raw_value}) +end + +function playerphysics.remove_physics_factor(player, attribute, id) + local meta = player:get_meta() + local a = minetest.deserialize(meta:get_string("playerphysics:physics")) + if a == nil or a[attribute] == nil then + -- Nothing to remove + return + else + a[attribute][id] = nil + end + meta:set_string("playerphysics:physics", minetest.serialize(a)) + local raw_value = calculate_attribute_product(player, attribute) + player:set_physics_override({[attribute] = raw_value}) +end diff --git a/mods/PLAYER/playerphysics/mod.conf b/mods/PLAYER/playerphysics/mod.conf new file mode 100644 index 00000000..da01bf07 --- /dev/null +++ b/mods/PLAYER/playerphysics/mod.conf @@ -0,0 +1 @@ +name = playerphysics diff --git a/mods/PLAYER/wieldview/LICENSE.txt b/mods/PLAYER/wieldview/LICENSE.txt new file mode 100644 index 00000000..e1552c06 --- /dev/null +++ b/mods/PLAYER/wieldview/LICENSE.txt @@ -0,0 +1,18 @@ +[mod] visible wielded items [wieldview] +======================================= + +Copyright (C) 2012-2019 stujones11, Stuart Jones + +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. diff --git a/mods/ITEMS/minetest-3d_armor/wieldview/README.txt b/mods/PLAYER/wieldview/README.txt similarity index 54% rename from mods/ITEMS/minetest-3d_armor/wieldview/README.txt rename to mods/PLAYER/wieldview/README.txt index e6be7490..183e8c6d 100644 --- a/mods/ITEMS/minetest-3d_armor/wieldview/README.txt +++ b/mods/PLAYER/wieldview/README.txt @@ -1,8 +1,6 @@ [mod] visible wielded items [wieldview] ======================================= -Depends on: 3d_armor - Makes hand wielded items visible to other players. default settings: [minetest.conf] @@ -13,3 +11,11 @@ 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. diff --git a/mods/PLAYER/wieldview/depends.txt b/mods/PLAYER/wieldview/depends.txt new file mode 100644 index 00000000..2bbf820f --- /dev/null +++ b/mods/PLAYER/wieldview/depends.txt @@ -0,0 +1 @@ +mcl_armor diff --git a/mods/ITEMS/minetest-3d_armor/wieldview/description.txt b/mods/PLAYER/wieldview/description.txt similarity index 100% rename from mods/ITEMS/minetest-3d_armor/wieldview/description.txt rename to mods/PLAYER/wieldview/description.txt diff --git a/mods/ITEMS/minetest-3d_armor/wieldview/init.lua b/mods/PLAYER/wieldview/init.lua similarity index 80% rename from mods/ITEMS/minetest-3d_armor/wieldview/init.lua rename to mods/PLAYER/wieldview/init.lua index 9aef99e3..ecbb2dc0 100644 --- a/mods/ITEMS/minetest-3d_armor/wieldview/init.lua +++ b/mods/PLAYER/wieldview/init.lua @@ -18,7 +18,7 @@ wieldview = { dofile(minetest.get_modpath(minetest.get_current_modname()).."/transform.lua") wieldview.get_item_texture = function(self, item) - local texture = "3d_armor_trans.png" + local texture = "blank.png" if item ~= "" then if minetest.registered_items[item] then if minetest.registered_items[item].inventory_image ~= "" then @@ -29,8 +29,15 @@ wieldview.get_item_texture = function(self, item) texture = minetest.inventorycube(minetest.registered_items[item].tiles[1]) end end - if wieldview.transform[item] then - texture = texture.."^[transform"..wieldview.transform[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 diff --git a/mods/ITEMS/minetest-3d_armor/wieldview/transform.lua b/mods/PLAYER/wieldview/transform.lua similarity index 96% rename from mods/ITEMS/minetest-3d_armor/wieldview/transform.lua rename to mods/PLAYER/wieldview/transform.lua index 26cfd628..c1715b2c 100644 --- a/mods/ITEMS/minetest-3d_armor/wieldview/transform.lua +++ b/mods/PLAYER/wieldview/transform.lua @@ -24,6 +24,7 @@ wieldview.transform = { ["mcl_flowers:tallgrass"]="R270", ["mcl_buckets:bucket_empty"]="R270", ["mcl_buckets:bucket_water"]="R270", + ["mcl_buckets:bucket_river_water"]="R270", ["mcl_buckets:bucket_lava"]="R270", ["mcl_mobitems:milk_bucket"]="R270", ["mcl_potions:glass_bottle"]="R270", diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 00000000..a92bd53e Binary files /dev/null and b/screenshot.png differ diff --git a/settingtypes.txt b/settingtypes.txt index 72be9c5d..ba2714f9 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -1,6 +1,7 @@ # This file contains settings of MineClone 2that can be changed in # minetest.conf +[World] # In creative mode, players are able to dig all kind of blocks # instantly, and have access to unlimited resources. # Items are not used up, and blocks do not drop. @@ -10,31 +11,23 @@ # per-player Creative Mode. creative_mode (Creative mode) bool false -# Fire spreads and flammable nodes will be ignited by nearby fire. -# Spreading fire may cause severe destruction. -# Spreading fire blocks will disappear when fire is disabled, but -# eternal fire is unaffected. -enable_fire (Fire) bool true +# Fire spreads and flammable blocks might be destroyed by nearby fire. +# Destructive fire may cause severe destruction. +# Fire blocks will be non-destructive and stops spreading when this +# setting is disabled, but they still deal damage to creatures. +enable_fire (Destructive and spreading fire) bool true -# Enable flame sound. -flame_sound (Flame sound) bool true +# If enabled, the weather will change naturally over time. +mcl_doWeatherCycle (Change weather) bool true # If enabled, breaking blocks will cause them to drop as item. # Note that blocks never have drops when in Creative Mode. mcl_doTileDrops (Blocks have drops) bool true -# Normally, players drop all their items when they die. Enable this -# setting, so players always keep their inventory on death. -mcl_keepInventory (Keep inventory on death) bool false - -# If enabled, chat messages are shown to everyone when a player dies. -mcl_showDeathMessages (Show death messages) bool true - -# If enabled, only peaceful mobs will appear naturally. This does not -# affect monster spawners. -# This setting is only read at startup. -only_peaceful_mobs (Spawn only peaceful mobs) bool false +# If enabled, TNT explosions destroy blocks. +mcl_tnt_griefing (TNT destroys blocks) bool true +[Players] # If enabled, players respawn at the bed they last lay on instead of normal # spawn. # This setting is only read at startup. @@ -43,19 +36,80 @@ enable_bed_respawn (Respawn at bed) bool true # If enabled, the night can be skipped if all players are in bed. # This setting is only read at startup. enable_bed_night_skip (Skip night when sleeping) bool true +# Normally, players drop all their items when they die. Enable this +# setting, so players always keep their inventory on death. +mcl_keepInventory (Keep inventory on death) bool false -# If enabled, the recipe book will only show recipes which require one -# item which you have already discovered. -# If disabled, the recipe book shows all crafting recipes. -# This setting is experimental and may be changed in later versions. -# Feedback is appreciated. -craftguide_progressive_mode (EXPERIMENTAL: Enable recipe book progressive mode) bool false +# If enabled, chat messages are shown to everyone when a player dies. +mcl_showDeathMessages (Show death messages) bool true -# If enabled, the “flat” map generator generates a “classic” superflat map: +# If enabled, the recipe book will progressively be filled with new recipes that can be crafted from all items you ever have had in your inventory. +# Recommended for new players and for a spoiler-free gameplay experience. +# If disabled, all recipes will be shown. +mcl_craftguide_progressive_mode (Learn crafting recipes progressively) bool true + +[Mobs] +# If enabled, mobs will spawn naturally. This does not affect +# affect mob spawners. +# This setting is only read at startup. +mobs_spawn (Spawn mobs naturally) bool true + +# Controls the overall amount of mobs that spawn. The higher the number, +# the less often mobs will spawn. This does not affect mob spawners. +mobs_spawn_chance (Mob spawn chance) float 2.5 0.0 + +# If enabled, only peaceful mobs will appear naturally. This does not +# affect mob spawners. +# This setting is only read at startup. +only_peaceful_mobs (Spawn only peaceful mobs) bool false + +# Allow mobs to spawn in protected areas. This does not affect +# mob spawners. +mobs_spawn_protected (Mobs spawn in protected areas) bool false + +# Mobs difficulty. This is a number that will affect the initial and maximum +# health and the amount of damage that mobs deal. Health and damage will +# be multiplied with this number. +mob_difficulty (Mob difficulty factor) float 1.0 0.0 + +# If enabled, mobs might drop items when they die. +mobs_drop_items (Mobs drop items) bool true + +# If enabled, mobs can take, place, change and destroy blocks around them. +mobs_griefing (Mobs change blocks) bool true + +# If enabled, mobs won't damage particles when they got hurt. +mobs_disable_blood (Disable mob damage particles) bool false + +[Audio] +# Enable flame sound. +flame_sound (Flame sound) bool true + +[Experimental] +# Whether ice is translucent. If disabled, ice is fully opaque. +# +# Note: As of Minetest version 5.1.0, translucent ice above oceans +# will look weird, there's a lot of flashing/blinking going on +# due to bugs in Minetest's implementation of translucency. +# See also: https://github.com/minetest/minetest/issues/95 +mcl_translucent_ice (Translucent ice) bool false + +# Whether to generate fallen logs in some biomes. +# They might not always look pretty and have strange overhangs. +mcl_generate_fallen_logs (Generate fallen logs) bool false + +# If enabled, the “flat” map generator generates a Classic Superflat world: # Completely flat, 1 layer of grass blocks on top of 2 layers of dirt on -# top of a final layer of bedrock. -# Note if this is enabled, the setting “mgflat_flags” is ignored. To -# customize the “flat” map generator, you must disable this setting. -# Warning: Disabling this setting is currently EXPERIMENTAL! The generated map -# may not be that pretty. +# top of a final layer of bedrock. No caves, trees or plants. +# Also, if enabled, the setting “mgflat_flags” is ignored. +# If disabled, Minetest's default flat map generator is used, that is, trees, +# caves, and a deeper underground can be generated. +# +# Caution: Change this setting with care! +# If you change this setting, then play on an existing flat world +# that started with a different setting (e.g. you changed from superflat +# from “enabled” to “disabled”), there will be continuity errors when players +# reach new areas. Most importantly, the void is much higher in Superflat than +# in “normal” Flat. +# But creating new flat worlds after changing this setting should be safe. mcl_superflat_classic (Classic superflat map generation) bool true diff --git a/tools/Texture_Conversion_Table.csv b/tools/Conversion_Table.csv similarity index 53% rename from tools/Texture_Conversion_Table.csv rename to tools/Conversion_Table.csv index 836004a0..987ab64e 100644 --- a/tools/Texture_Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -1,847 +1,966 @@ -Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt -/assets/minecraft/textures/particle,particles.png,/mods/CORE/mcl_particles/textures,mcl_particles_bubble.png,0,16,8,8,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/HUD/hbarmor/textures,hbarmor_icon.png,34,9,9,9,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/HUD/hbarmor/textures,hbarmor_bgicon.png,16,9,9,9,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/HUD/hudbars/textures,hudbars_icon_health.png,52,0,9,9,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/HUD/hudbars/textures,hudbars_bgicon_health.png,16,0,9,9,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/HUD/hudbars/textures,hudbars_icon_breath.png,16,18,9,9,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_base_textures/textures,heart.png,52,0,9,9,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_base_textures/textures,bubble.png,16,18,9,9,0,0 -/assets/minecraft/textures/items,bucket_empty.png,/mods/ITEMS/bucket/textures,bucket.png,,,,,, -/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/bucket/textures,bucket_water.png,,,,,, -/assets/minecraft/textures/items,bucket_lava.png,/mods/ITEMS/bucket/textures,bucket_lava.png,,,,,, -/assets/minecraft/textures/items,painting.png,/mods/ITEMS/gemalde/textures,gemalde_node.png,,,,,, -/assets/minecraft/textures/items,item_frame.png,/mods/ITEMS/itemframes/textures,itemframes_frame.png,,,,,, -/assets/minecraft/textures/blocks,anvil_base.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_base.png,,,,,, -/assets/minecraft/textures/blocks,anvil_top_damaged_0.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_top_damaged_0.png,,,,,, -/assets/minecraft/textures/blocks,anvil_top_damaged_1.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_top_damaged_1.png,,,,,, -/assets/minecraft/textures/blocks,anvil_top_damaged_2.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_top_damaged_2.png,,,,,, -/assets/minecraft/textures/blocks,anvil_side.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_side.png,,,,,, -/assets/minecraft/textures/items,name_tag.png,/mods/ENTITIES/mobs/textures,mobs_nametag.png,,,,,, -/assets/minecraft/textures/gui,icons.png,/mods/ENTITIES/mobs/textures,mobs_blood.png,16,0,9,9,0,0 -/assets/minecraft/textures/blocks,itemframe_background.png,/mods/ITEMS/itemframes/textures,itemframe_background.png,,,,,, -/assets/minecraft/textures/items,bed.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_red.png,,,,,, -/assets/minecraft/textures/items,acacia_boat.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_acacia_boat.png,,,,,, -/assets/minecraft/textures/items,oak_boat.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_oak_boat.png,,,,,, -/assets/minecraft/textures/items,spruce_boat.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_spruce_boat.png,,,,,, -/assets/minecraft/textures/items,dark_oak_boat.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_dark_oak_boat.png,,,,,, -/assets/minecraft/textures/items,jungle_boat.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_jungle_boat.png,,,,,, -/assets/minecraft/textures/items,birch_boat.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_birch_boat.png,,,,,, -/assets/minecraft/textures/entity/boat,boat_acacia.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_texture_acacia_boat.png,,,,,, -/assets/minecraft/textures/entity/boat,boat_oak.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_texture_oak_boat.png,,,,,, -/assets/minecraft/textures/entity/boat,boat_darkoak.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_texture_dark_oak_boat.png,,,,,, -/assets/minecraft/textures/entity/boat,boat_spruce.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_texture_spruce_boat.png,,,,,, -/assets/minecraft/textures/entity/boat,boat_birch.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_texture_birch_boat.png,,,,,, -/assets/minecraft/textures/entity/boat,boat_jungle.png,/mods/ITEMS/mcl_boats/textures,mcl_boats_texture_jungle_boat.png,,,,,, -/assets/minecraft/textures/items,book_normal.png,/mods/ITEMS/mcl_books/textures,default_book.png,,,,,, -/assets/minecraft/textures/blocks,bookshelf.png,/mods/ITEMS/mcl_books/textures,default_bookshelf.png,,,,,, -/assets/minecraft/textures/blocks,bookshelf_top.png,/mods/ITEMS/mcl_books/textures,mcl_books_bookshelf_top.png,,,,,, -/assets/minecraft/textures/items,book_writable.png,/mods/ITEMS/mcl_books/textures,mcl_books_book_writable.png,,,,,, -/assets/minecraft/textures/items,book_written.png,/mods/ITEMS/mcl_books/textures,mcl_books_book_written.png,,,,,, -/assets/minecraft/textures/items,cake.png,/mods/ITEMS/mcl_cake/textures,cake.png,,,,,, -/assets/minecraft/textures/blocks,cake_bottom.png,/mods/ITEMS/mcl_cake/textures,cake_bottom.png,,,,,, -/assets/minecraft/textures/blocks,cake_top.png,/mods/ITEMS/mcl_cake/textures,cake_top.png,,,,,, -/assets/minecraft/textures/blocks,cake_side.png,/mods/ITEMS/mcl_cake/textures,cake_side.png,,,,,, -/assets/minecraft/textures/blocks,cake_inner.png,/mods/ITEMS/mcl_cake/textures,cake_inner.png,,,,,, -/assets/minecraft/textures/items,cauldron.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron.png,,,,,, -/assets/minecraft/textures/blocks,cauldron_bottom.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_bottom.png,,,,,, -/assets/minecraft/textures/blocks,cauldron_top.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_top.png,,,,,, -/assets/minecraft/textures/blocks,cauldron_side.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_side.png,,,,,, -/assets/minecraft/textures/blocks,cauldron_inner.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_inner.png,,,,,, -/assets/minecraft/textures/items,clock.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock.png,,,,,, -/assets/minecraft/textures/blocks,cocoa_stage_0.png,/mods/ITEMS/mcl_cocoas/textures,mcl_cocoas_cocoa_stage_0.png,,,,,, -/assets/minecraft/textures/blocks,cocoa_stage_1.png,/mods/ITEMS/mcl_cocoas/textures,mcl_cocoas_cocoa_stage_1.png,,,,,, -/assets/minecraft/textures/blocks,cocoa_stage_2.png,/mods/ITEMS/mcl_cocoas/textures,mcl_cocoas_cocoa_stage_2.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_black.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_black.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_blue.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_blue.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_brown.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_brown.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_cyan.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_cyan.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_gray.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_grey.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_green.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_green.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_light_blue.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_light_blue.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_lime.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_lime.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_magenta.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_magenta.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_orange.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_orange.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_pink.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_pink.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_purple.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_purple.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_red.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_red.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_silver.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_silver.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_white.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_white.png,,,,,, -/assets/minecraft/textures/blocks,hardened_clay_stained_yellow.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_yellow.png,,,,,, -/assets/minecraft/textures/blocks,concrete_black.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_black.png,,,,,, -/assets/minecraft/textures/blocks,concrete_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_blue.png,,,,,, -/assets/minecraft/textures/blocks,concrete_brown.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_brown.png,,,,,, -/assets/minecraft/textures/blocks,concrete_cyan.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_cyan.png,,,,,, -/assets/minecraft/textures/blocks,concrete_gray.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_grey.png,,,,,, -/assets/minecraft/textures/blocks,concrete_green.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_green.png,,,,,, -/assets/minecraft/textures/blocks,concrete_light_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_light_blue.png,,,,,, -/assets/minecraft/textures/blocks,concrete_lime.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_lime.png,,,,,, -/assets/minecraft/textures/blocks,concrete_magenta.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_magenta.png,,,,,, -/assets/minecraft/textures/blocks,concrete_orange.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_orange.png,,,,,, -/assets/minecraft/textures/blocks,concrete_pink.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_pink.png,,,,,, -/assets/minecraft/textures/blocks,concrete_purple.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_purple.png,,,,,, -/assets/minecraft/textures/blocks,concrete_red.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_red.png,,,,,, -/assets/minecraft/textures/blocks,concrete_silver.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_silver.png,,,,,, -/assets/minecraft/textures/blocks,concrete_white.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_white.png,,,,,, -/assets/minecraft/textures/blocks,concrete_yellow.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_yellow.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_black.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_black.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_blue.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_brown.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_brown.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_cyan.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_cyan.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_gray.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_grey.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_green.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_green.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_light_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_light_blue.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_lime.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_lime.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_magenta.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_magenta.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_orange.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_orange.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_pink.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_pink.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_purple.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_purple.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_red.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_red.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_silver.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_silver.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_white.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_white.png,,,,,, -/assets/minecraft/textures/blocks,concrete_powder_yellow.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_yellow.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_black.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_black.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_blue.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_brown.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_brown.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_cyan.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_cyan.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_gray.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_grey.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_green.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_green.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_light_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_light_blue.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_lime.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_lime.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_magenta.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_magenta.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_orange.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_orange.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_pink.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_pink.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_purple.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_purple.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_red.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_red.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_silver.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_silver.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_white.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_white.png,,,,,, -/assets/minecraft/textures/blocks,glazed_terracotta_yellow.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_yellow.png,,,,,, -/assets/minecraft/textures/blocks,sapling_oak.png,/mods/ITEMS/mcl_core/textures,default_sapling.png,,,,,, -/assets/minecraft/textures/blocks,sapling_acacia.png,/mods/ITEMS/mcl_core/textures,default_acacia_sapling.png,,,,,, -/assets/minecraft/textures/blocks,sapling_spruce.png,/mods/ITEMS/mcl_core/textures,mcl_core_sapling_spruce.png,,,,,, -/assets/minecraft/textures/blocks,sapling_jungle.png,/mods/ITEMS/mcl_core/textures,default_junglesapling.png,,,,,, -/assets/minecraft/textures/blocks,sapling_roofed_oak.png,/mods/ITEMS/mcl_core/textures,mcl_core_sapling_big_oak.png,,,,,, -/assets/minecraft/textures/blocks,sapling_birch.png,/mods/ITEMS/mcl_core/textures,mcl_core_sapling_birch.png,,,,,, -/assets/minecraft/textures/items,apple.png,/mods/ITEMS/mcl_core/textures,default_apple.png,,,,,, -/assets/minecraft/textures/items,apple_golden.png,/mods/ITEMS/mcl_core/textures,mcl_core_apple_golden.png,,,,,, -/assets/minecraft/textures/blocks,brick.png,/mods/ITEMS/mcl_core/textures,default_brick.png,,,,,, -/assets/minecraft/textures/blocks,cactus_side.png,/mods/ITEMS/mcl_core/textures,default_cactus_side.png,,,,,, -/assets/minecraft/textures/blocks,cactus_top.png,/mods/ITEMS/mcl_core/textures,default_cactus_top.png,,,,,, -/assets/minecraft/textures/blocks,cactus_bottom.png,/mods/ITEMS/mcl_core/textures,mcl_core_cactus_bottom.png,,,,,, -/assets/minecraft/textures/items,brick.png,/mods/ITEMS/mcl_core/textures,default_clay_brick.png,,,,,, -/assets/minecraft/textures/items,clay_ball.png,/mods/ITEMS/mcl_core/textures,default_clay_lump.png,,,,,, -/assets/minecraft/textures/blocks,clay.png,/mods/ITEMS/mcl_core/textures,default_clay.png,,,,,, -/assets/minecraft/textures/blocks,coal_block.png,/mods/ITEMS/mcl_core/textures,default_coal_block.png,,,,,, -/assets/minecraft/textures/items,coal.png,/mods/ITEMS/mcl_core/textures,default_coal_lump.png,,,,,, -/assets/minecraft/textures/blocks,cobblestone.png,/mods/ITEMS/mcl_core/textures,default_cobble.png,,,,,, -/assets/minecraft/textures/blocks,diamond_block.png,/mods/ITEMS/mcl_core/textures,default_diamond_block.png,,,,,, -/assets/minecraft/textures/items,diamond.png,/mods/ITEMS/mcl_core/textures,default_diamond.png,,,,,, -/assets/minecraft/textures/blocks,dirt.png,/mods/ITEMS/mcl_core/textures,default_dirt.png,,,,,, -/assets/minecraft/textures/blocks,deadbush.png,/mods/ITEMS/mcl_core/textures,default_dry_shrub.png,,,,,, -/assets/minecraft/textures/blocks,log_acacia.png,/mods/ITEMS/mcl_core/textures,default_acacia_tree.png,,,,,, -/assets/minecraft/textures/blocks,log_acacia_top.png,/mods/ITEMS/mcl_core/textures,default_acacia_tree_top.png,,,,,, -/assets/minecraft/textures/blocks,planks_acacia.png,/mods/ITEMS/mcl_core/textures,default_acacia_wood.png,,,,,, -/assets/minecraft/textures/items,flint.png,/mods/ITEMS/mcl_core/textures,default_flint.png,,,,,, -/assets/minecraft/textures/blocks,glass.png,/mods/ITEMS/mcl_core/textures,default_glass.png,,,,,, -/assets/minecraft/textures/blocks,glass_black.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_black.png,,,,,, -/assets/minecraft/textures/blocks,glass_blue.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_blue.png,,,,,, -/assets/minecraft/textures/blocks,glass_brown.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_brown.png,,,,,, -/assets/minecraft/textures/blocks,glass_cyan.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_cyan.png,,,,,, -/assets/minecraft/textures/blocks,glass_gray.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_gray.png,,,,,, -/assets/minecraft/textures/blocks,glass_green.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_green.png,,,,,, -/assets/minecraft/textures/blocks,glass_light_blue.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_light_blue.png,,,,,, -/assets/minecraft/textures/blocks,glass_lime.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_lime.png,,,,,, -/assets/minecraft/textures/blocks,glass_magenta.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_magenta.png,,,,,, -/assets/minecraft/textures/blocks,glass_orange.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_orange.png,,,,,, -/assets/minecraft/textures/blocks,glass_pink.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_pink.png,,,,,, -/assets/minecraft/textures/blocks,glass_purple.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_purple.png,,,,,, -/assets/minecraft/textures/blocks,glass_red.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_red.png,,,,,, -/assets/minecraft/textures/blocks,glass_silver.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_silver.png,,,,,, -/assets/minecraft/textures/blocks,glass_white.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_white.png,,,,,, -/assets/minecraft/textures/blocks,glass_yellow.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_yellow.png,,,,,, -/assets/minecraft/textures/blocks,gold_block.png,/mods/ITEMS/mcl_core/textures,default_gold_block.png,,,,,, -/assets/minecraft/textures/items,gold_ingot.png,/mods/ITEMS/mcl_core/textures,default_gold_ingot.png,,,,,, -/assets/minecraft/textures/blocks,grass_side.png,/mods/ITEMS/mcl_core/textures,default_grass_side.png,,,,,, -/assets/minecraft/textures/blocks,gravel.png,/mods/ITEMS/mcl_core/textures,default_gravel.png,,,,,, -/assets/minecraft/textures/blocks,ice.png,/mods/ITEMS/mcl_core/textures,default_ice.png,,,,,, -/assets/minecraft/textures/blocks,log_jungle.png,/mods/ITEMS/mcl_core/textures,default_jungletree.png,,,,,, -/assets/minecraft/textures/blocks,log_jungle_top.png,/mods/ITEMS/mcl_core/textures,default_jungletree_top.png,,,,,, -/assets/minecraft/textures/blocks,planks_jungle.png,/mods/ITEMS/mcl_core/textures,default_junglewood.png,,,,,, -/assets/minecraft/textures/blocks,ladder.png,/mods/ITEMS/mcl_core/textures,default_ladder.png,,,,,, -/assets/minecraft/textures/blocks,lava_still.png,/mods/ITEMS/mcl_core/textures,default_lava_source_animated.png,,,,,, -/assets/minecraft/textures/blocks,cobblestone_mossy.png,/mods/ITEMS/mcl_core/textures,default_mossycobble.png,,,,,, -/assets/minecraft/textures/blocks,obsidian.png,/mods/ITEMS/mcl_core/textures,default_obsidian.png,,,,,, -/assets/minecraft/textures/items,paper.png,/mods/ITEMS/mcl_core/textures,default_paper.png,,,,,, -/assets/minecraft/textures/blocks,reeds.png,/mods/ITEMS/mcl_core/textures,default_papyrus.png,,,,,, -/assets/minecraft/textures/blocks,sand.png,/mods/ITEMS/mcl_core/textures,default_sand.png,,,,,, -/assets/minecraft/textures/blocks,snow.png,/mods/ITEMS/mcl_core/textures,default_snow.png,,,,,, -/assets/minecraft/textures/blocks,iron_block.png,/mods/ITEMS/mcl_core/textures,default_steel_block.png,,,,,, -/assets/minecraft/textures/items,iron_ingot.png,/mods/ITEMS/mcl_core/textures,default_steel_ingot.png,,,,,, -/assets/minecraft/textures/items,stick.png,/mods/ITEMS/mcl_core/textures,default_stick.png,,,,,, -/assets/minecraft/textures/blocks,stonebrick.png,/mods/ITEMS/mcl_core/textures,default_stone_brick.png,,,,,, -/assets/minecraft/textures/blocks,stone.png,/mods/ITEMS/mcl_core/textures,default_stone.png,,,,,, -/assets/minecraft/textures/blocks,log_oak.png,/mods/ITEMS/mcl_core/textures,default_tree.png,,,,,, -/assets/minecraft/textures/blocks,log_oak_top.png,/mods/ITEMS/mcl_core/textures,default_tree_top.png,,,,,, -/assets/minecraft/textures/blocks,water_still.png,/mods/ITEMS/mcl_core/textures,default_water_source_animated.png,,,,,, -/assets/minecraft/textures/blocks,planks_oak.png,/mods/ITEMS/mcl_core/textures,default_wood.png,,,,,, -/assets/minecraft/textures/blocks,stone_andesite.png,/mods/ITEMS/mcl_core/textures,mcl_core_andesite.png,,,,,, -/assets/minecraft/textures/blocks,stone_andesite_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_andesite_smooth.png,,,,,, -/assets/minecraft/textures/items,barrier.png,/mods/ITEMS/mcl_core/textures,mcl_core_barrier.png,,,,,, -/assets/minecraft/textures/blocks,bedrock.png,/mods/ITEMS/mcl_core/textures,mcl_core_bedrock.png,,,,,, -/assets/minecraft/textures/blocks,bone_block_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_bone_block_side.png,,,,,, -/assets/minecraft/textures/blocks,bone_block_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_bone_block_top.png,,,,,, -/assets/minecraft/textures/items,bowl.png,/mods/ITEMS/mcl_core/textures,mcl_core_bowl.png,,,,,, -/assets/minecraft/textures/blocks,cactus_bottom.png,/mods/ITEMS/mcl_core/textures,mcl_core_cactus_bottom.png,,,,,, -/assets/minecraft/textures/items,charcoal.png,/mods/ITEMS/mcl_core/textures,mcl_core_charcoal.png,,,,,, -/assets/minecraft/textures/blocks,coal_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_coal_ore.png,,,,,, -/assets/minecraft/textures/blocks,coarse_dirt.png,/mods/ITEMS/mcl_core/textures,mcl_core_coarse_dirt.png,,,,,, -/assets/minecraft/textures/blocks,diamond_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_diamond_ore.png,,,,,, -/assets/minecraft/textures/blocks,stone_diorite.png,/mods/ITEMS/mcl_core/textures,mcl_core_diorite.png,,,,,, -/assets/minecraft/textures/blocks,stone_diorite_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_diorite_smooth.png,,,,,, -/assets/minecraft/textures/blocks,dirt_podzol_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_dirt_podzol_side.png,,,,,, -/assets/minecraft/textures/blocks,dirt_podzol_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_dirt_podzol_top.png,,,,,, -/assets/minecraft/textures/blocks,emerald_block.png,/mods/ITEMS/mcl_core/textures,mcl_core_emerald_block.png,,,,,, -/assets/minecraft/textures/blocks,emerald_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_emerald_ore.png,,,,,, -/assets/minecraft/textures/items,emerald.png,/mods/ITEMS/mcl_core/textures,mcl_core_emerald.png,,,,,, -/assets/minecraft/textures/blocks,frosted_ice_0.png,/mods/ITEMS/mcl_core/textures,mcl_core_frosted_ice_0.png,,,,,, -/assets/minecraft/textures/blocks,frosted_ice_1.png,/mods/ITEMS/mcl_core/textures,mcl_core_frosted_ice_1.png,,,,,, -/assets/minecraft/textures/blocks,frosted_ice_2.png,/mods/ITEMS/mcl_core/textures,mcl_core_frosted_ice_2.png,,,,,, -/assets/minecraft/textures/blocks,frosted_ice_3.png,/mods/ITEMS/mcl_core/textures,mcl_core_frosted_ice_3.png,,,,,, -/assets/minecraft/textures/items,gold_nugget.png,/mods/ITEMS/mcl_core/textures,mcl_core_gold_nugget.png,,,,,, -/assets/minecraft/textures/blocks,gold_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_gold_ore.png,,,,,, -/assets/minecraft/textures/blocks,stone_granite.png,/mods/ITEMS/mcl_core/textures,mcl_core_granite.png,,,,,, -/assets/minecraft/textures/blocks,stone_granite_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_granite_smooth.png,,,,,, -/assets/minecraft/textures/blocks,grass_path_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_grass_path_side.png,,,,,, -/assets/minecraft/textures/blocks,grass_path_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_grass_path_top.png,,,,,, -/assets/minecraft/textures/blocks,grass_side_snowed.png,/mods/ITEMS/mcl_core/textures,mcl_core_grass_side_snowed.png,,,,,, -/assets/minecraft/textures/blocks,ice_packed.png,/mods/ITEMS/mcl_core/textures,mcl_core_ice_packed.png,,,,,, -/assets/minecraft/textures/items,iron_nugget.png,/mods/ITEMS/mcl_core/textures,mcl_core_iron_nugget.png,,,,,, -/assets/minecraft/textures/blocks,iron_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_iron_ore.png,,,,,, -/assets/minecraft/textures/blocks,lapis_block.png,/mods/ITEMS/mcl_core/textures,mcl_core_lapis_block.png,,,,,, -/assets/minecraft/textures/blocks,lapis_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_lapis_ore.png,,,,,, -/assets/minecraft/textures/blocks,log_big_oak.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_big_oak.png,,,,,, -/assets/minecraft/textures/blocks,log_big_oak_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_big_oak_top.png,,,,,, -/assets/minecraft/textures/blocks,log_birch.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_birch.png,,,,,, -/assets/minecraft/textures/blocks,log_birch_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_birch_top.png,,,,,, -/assets/minecraft/textures/blocks,log_spruce.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_spruce.png,,,,,, -/assets/minecraft/textures/blocks,log_spruce_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_spruce_top.png,,,,,, -/assets/minecraft/textures/blocks,mycelium_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_mycelium_side.png,,,,,, -/assets/minecraft/textures/blocks,mycelium_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_mycelium_top.png,,,,,, -/assets/minecraft/textures/blocks,planks_big_oak.png,/mods/ITEMS/mcl_core/textures,mcl_core_planks_big_oak.png,,,,,, -/assets/minecraft/textures/blocks,planks_birch.png,/mods/ITEMS/mcl_core/textures,mcl_core_planks_birch.png,,,,,, -/assets/minecraft/textures/blocks,planks_spruce.png,/mods/ITEMS/mcl_core/textures,mcl_core_planks_spruce.png,,,,,, -/assets/minecraft/textures/blocks,red_sand.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sand.png,,,,,, -/assets/minecraft/textures/blocks,red_sandstone_bottom.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_bottom.png,,,,,, -/assets/minecraft/textures/blocks,red_sandstone_carved.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_carved.png,,,,,, -/assets/minecraft/textures/blocks,red_sandstone_normal.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_normal.png,,,,,, -/assets/minecraft/textures/blocks,red_sandstone_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_smooth.png,,,,,, -/assets/minecraft/textures/blocks,red_sandstone_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_top.png,,,,,, -/assets/minecraft/textures/blocks,redstone_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_redstone_ore.png,,,,,, -/assets/minecraft/textures/items,reeds.png,/mods/ITEMS/mcl_core/textures,mcl_core_reeds.png,,,,,, -/assets/minecraft/textures/blocks,sandstone_bottom.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_bottom.png,,,,,, -/assets/minecraft/textures/blocks,sandstone_carved.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_carved.png,,,,,, -/assets/minecraft/textures/blocks,sandstone_normal.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_normal.png,,,,,, -/assets/minecraft/textures/blocks,sandstone_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_smooth.png,,,,,, -/assets/minecraft/textures/blocks,sandstone_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_top.png,,,,,, -/assets/minecraft/textures/blocks,slime.png,/mods/ITEMS/mcl_core/textures,mcl_core_slime.png,,,,,, -/assets/minecraft/textures/blocks,stonebrick_carved.png,/mods/ITEMS/mcl_core/textures,mcl_core_stonebrick_carved.png,,,,,, -/assets/minecraft/textures/blocks,stonebrick_cracked.png,/mods/ITEMS/mcl_core/textures,mcl_core_stonebrick_cracked.png,,,,,, -/assets/minecraft/textures/blocks,stonebrick_mossy.png,/mods/ITEMS/mcl_core/textures,mcl_core_stonebrick_mossy.png,,,,,, -/assets/minecraft/textures/items,sugar.png,/mods/ITEMS/mcl_core/textures,mcl_core_sugar.png,,,,,, -/assets/minecraft/textures/blocks,vine.png,/mods/ITEMS/mcl_core/textures,mcl_core_vine.png,,,,,, -/assets/minecraft/textures/blocks,web.png,/mods/ITEMS/mcl_core/textures,mcl_core_web.png,,,,,, -/assets/minecraft/textures/blocks,crafting_table_front.png,/mods/ITEMS/mcl_crafting_table/textures,crafting_workbench_front.png,,,,,, -/assets/minecraft/textures/blocks,crafting_table_side.png,/mods/ITEMS/mcl_crafting_table/textures,crafting_workbench_side.png,,,,,, -/assets/minecraft/textures/blocks,crafting_table_top.png,/mods/ITEMS/mcl_crafting_table/textures,crafting_workbench_top.png,,,,,, -/assets/minecraft/textures/blocks,door_acacia_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_acacia_lower.png,,,,,, -/assets/minecraft/textures/blocks,door_acacia_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_acacia_upper.png,,,,,, -/assets/minecraft/textures/blocks,door_birch_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_birch_lower.png,,,,,, -/assets/minecraft/textures/blocks,door_birch_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_birch_upper.png,,,,,, -/assets/minecraft/textures/blocks,door_dark_oak_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_dark_oak_lower.png,,,,,, -/assets/minecraft/textures/blocks,door_dark_oak_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_dark_oak_upper.png,,,,,, -/assets/minecraft/textures/blocks,door_iron_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_iron_lower.png,,,,,, -/assets/minecraft/textures/blocks,door_iron_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_iron_upper.png,,,,,, -/assets/minecraft/textures/blocks,door_jungle_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_jungle_lower.png,,,,,, -/assets/minecraft/textures/blocks,door_jungle_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_jungle_upper.png,,,,,, -/assets/minecraft/textures/blocks,door_spruce_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_spruce_lower.png,,,,,, -/assets/minecraft/textures/blocks,door_spruce_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_spruce_upper.png,,,,,, -/assets/minecraft/textures/blocks,door_wood_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_wood_lower.png,,,,,, -/assets/minecraft/textures/blocks,door_wood_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_wood_upper.png,,,,,, -/assets/minecraft/textures/blocks,trapdoor.png,/mods/ITEMS/mcl_doors/textures,doors_trapdoor.png,,,,,, -/assets/minecraft/textures/blocks,iron_trapdoor.png,/mods/ITEMS/mcl_doors/textures,doors_trapdoor_steel.png,,,,,, -/assets/minecraft/textures/items,door_acacia.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_acacia.png,,,,,, -/assets/minecraft/textures/items,door_birch.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_birch.png,,,,,, -/assets/minecraft/textures/items,door_dark_oak.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_dark_oak.png,,,,,, -/assets/minecraft/textures/items,door_jungle.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_jungle.png,,,,,, -/assets/minecraft/textures/items,door_spruce.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_spruce.png,,,,,, -/assets/minecraft/textures/items,door_wood.png,/mods/ITEMS/mcl_doors/textures,doors_item_wood.png,,,,,, -/assets/minecraft/textures/items,door_iron.png,/mods/ITEMS/mcl_doors/textures,doors_item_steel.png,,,,,, -/assets/minecraft/textures/items,dye_powder_black.png,/mods/ITEMS/mcl_dye/textures,dye_black.png,,,,,, -/assets/minecraft/textures/items,dye_powder_blue.png,/mods/ITEMS/mcl_dye/textures,dye_blue.png,,,,,, -/assets/minecraft/textures/items,dye_powder_brown.png,/mods/ITEMS/mcl_dye/textures,dye_brown.png,,,,,, -/assets/minecraft/textures/items,dye_powder_cyan.png,/mods/ITEMS/mcl_dye/textures,dye_cyan.png,,,,,, -/assets/minecraft/textures/items,dye_powder_gray.png,/mods/ITEMS/mcl_dye/textures,dye_dark_grey.png,,,,,, -/assets/minecraft/textures/items,dye_powder_green.png,/mods/ITEMS/mcl_dye/textures,dye_dark_green.png,,,,,, -/assets/minecraft/textures/items,dye_powder_light_blue.png,/mods/ITEMS/mcl_dye/textures,dye_lightblue.png,,,,,, -/assets/minecraft/textures/items,dye_powder_lime.png,/mods/ITEMS/mcl_dye/textures,dye_green.png,,,,,, -/assets/minecraft/textures/items,dye_powder_magenta.png,/mods/ITEMS/mcl_dye/textures,dye_magenta.png,,,,,, -/assets/minecraft/textures/items,dye_powder_orange.png,/mods/ITEMS/mcl_dye/textures,dye_orange.png,,,,,, -/assets/minecraft/textures/items,dye_powder_pink.png,/mods/ITEMS/mcl_dye/textures,dye_pink.png,,,,,, -/assets/minecraft/textures/items,dye_powder_purple.png,/mods/ITEMS/mcl_dye/textures,dye_violet.png,,,,,, -/assets/minecraft/textures/items,dye_powder_red.png,/mods/ITEMS/mcl_dye/textures,dye_red.png,,,,,, -/assets/minecraft/textures/items,dye_powder_silver.png,/mods/ITEMS/mcl_dye/textures,dye_grey.png,,,,,, -/assets/minecraft/textures/items,dye_powder_white.png,/mods/ITEMS/mcl_dye/textures,dye_white.png,,,,,, -/assets/minecraft/textures/items,dye_powder_yellow.png,/mods/ITEMS/mcl_dye/textures,dye_yellow.png,,,,,, -/assets/minecraft/textures/blocks,chorus_flower_dead.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_flower_dead.png,,,,,, -/assets/minecraft/textures/blocks,chorus_flower.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_flower.png,,,,,, -/assets/minecraft/textures/items,chorus_fruit.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_fruit.png,,,,,, -/assets/minecraft/textures/items,chorus_fruit_popped.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_fruit_popped.png,,,,,, -/assets/minecraft/textures/blocks,chorus_plant.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_plant.png,,,,,, -/assets/minecraft/textures/blocks,dragon_egg.png,/mods/ITEMS/mcl_end/textures,mcl_end_dragon_egg.png,,,,,, -/assets/minecraft/textures/blocks,end_bricks.png,/mods/ITEMS/mcl_end/textures,mcl_end_end_bricks.png,,,,,, -/assets/minecraft/textures/items,ender_eye.png,/mods/ITEMS/mcl_end/textures,mcl_end_ender_eye.png,,,,,, -/assets/minecraft/textures/blocks,endframe_eye.png,/mods/ITEMS/mcl_end/textures,mcl_end_endframe_eye.png,,,,,, -/assets/minecraft/textures/blocks,endframe_side.png,/mods/ITEMS/mcl_end/textures,mcl_end_endframe_side.png,,,,,, -/assets/minecraft/textures/blocks,endframe_top.png,/mods/ITEMS/mcl_end/textures,mcl_end_endframe_top.png,,,,,, -/assets/minecraft/textures/blocks,end_stone.png,/mods/ITEMS/mcl_end/textures,mcl_end_end_stone.png,,,,,, -/assets/minecraft/textures/blocks,purpur_block.png,/mods/ITEMS/mcl_end/textures,mcl_end_purpur_block.png,,,,,, -/assets/minecraft/textures/blocks,purpur_pillar.png,/mods/ITEMS/mcl_end/textures,mcl_end_purpur_pillar.png,,,,,, -/assets/minecraft/textures/blocks,purpur_pillar_top.png,/mods/ITEMS/mcl_end/textures,mcl_end_purpur_pillar_top.png,,,,,, -/assets/minecraft/textures/blocks,potatoes_stage_0.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_potatoes_stage_0.png,,,,,, -/assets/minecraft/textures/blocks,potatoes_stage_1.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_potatoes_stage_1.png,,,,,, -/assets/minecraft/textures/blocks,potatoes_stage_2.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_potatoes_stage_2.png,,,,,, -/assets/minecraft/textures/blocks,potatoes_stage_3.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_potatoes_stage_3.png,,,,,, -/assets/minecraft/textures/items,pumpkin_pie.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_pumpkin_pie.png,,,,,, -/assets/minecraft/textures/items,bread.png,/mods/ITEMS/mcl_farming/textures,farming_bread.png,,,,,, -/assets/minecraft/textures/blocks,carrots_stage_0.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_1.png,,,,,, -/assets/minecraft/textures/blocks,carrots_stage_1.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_2.png,,,,,, -/assets/minecraft/textures/blocks,carrots_stage_2.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_3.png,,,,,, -/assets/minecraft/textures/blocks,carrots_stage_3.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_4.png,,,,,, -/assets/minecraft/textures/items,carrot_golden.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_gold.png,,,,,, -/assets/minecraft/textures/items,carrot.png,/mods/ITEMS/mcl_farming/textures,farming_carrot.png,,,,,, -/assets/minecraft/textures/items,cookie.png,/mods/ITEMS/mcl_farming/textures,farming_cookie.png,,,,,, -/assets/minecraft/textures/items,melon.png,/mods/ITEMS/mcl_farming/textures,farming_melon.png,,,,,, -/assets/minecraft/textures/items,seeds_melon.png,/mods/ITEMS/mcl_farming/textures,farming_melon_seed.png,,,,,, -/assets/minecraft/textures/blocks,melon_side.png,/mods/ITEMS/mcl_farming/textures,farming_melon_side.png,,,,,, -/assets/minecraft/textures/blocks,melon_top.png,/mods/ITEMS/mcl_farming/textures,farming_melon_top.png,,,,,, -/assets/minecraft/textures/items,potato_baked.png,/mods/ITEMS/mcl_farming/textures,farming_potato_baked.png,,,,,, -/assets/minecraft/textures/items,potato.png,/mods/ITEMS/mcl_farming/textures,farming_potato.png,,,,,, -/assets/minecraft/textures/items,potato_poisonous.png,/mods/ITEMS/mcl_farming/textures,farming_potato_poison.png,,,,,, -/assets/minecraft/textures/blocks,pumpkin_face_on.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_face_light.png,,,,,, -/assets/minecraft/textures/blocks,pumpkin_face_off.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_face.png,,,,,, -/assets/minecraft/textures/items,seeds_pumpkin.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_seed.png,,,,,, -/assets/minecraft/textures/blocks,pumpkin_side.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_side.png,,,,,, -/assets/minecraft/textures/blocks,pumpkin_top.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_top.png,,,,,, -/assets/minecraft/textures/blocks,farmland_dry.png,/mods/ITEMS/mcl_farming/textures,farming_soil.png,,,,,, -/assets/minecraft/textures/blocks,farmland_wet.png,/mods/ITEMS/mcl_farming/textures,farming_soil_wet.png,,,,,, -/assets/minecraft/textures/items,diamond_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_diamondhoe.png,,,,,, -/assets/minecraft/textures/items,gold_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_goldhoe.png,,,,,, -/assets/minecraft/textures/items,iron_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_steelhoe.png,,,,,, -/assets/minecraft/textures/items,stone_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_stonehoe.png,,,,,, -/assets/minecraft/textures/items,wood_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_woodhoe.png,,,,,, -/assets/minecraft/textures/items,wheat.png,/mods/ITEMS/mcl_farming/textures,farming_wheat_harvested.png,,,,,, -/assets/minecraft/textures/items,seeds_wheat.png,/mods/ITEMS/mcl_farming/textures,farming_wheat_seed.png,,,,,, -/assets/minecraft/textures/blocks,beetroots_stage_0.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_0.png,,,,,, -/assets/minecraft/textures/blocks,beetroots_stage_1.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_1.png,,,,,, -/assets/minecraft/textures/blocks,beetroots_stage_2.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_2.png,,,,,, -/assets/minecraft/textures/blocks,beetroots_stage_3.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_3.png,,,,,, -/assets/minecraft/textures/items,beetroot.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot.png,,,,,, -/assets/minecraft/textures/items,beetroot_seeds.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_seeds.png,,,,,, -/assets/minecraft/textures/items,beetroot_soup.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_soup.png,,,,,, -/assets/minecraft/textures/blocks,hay_block_side.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_hayblock_side.png,,,,,, -/assets/minecraft/textures/blocks,hay_block_top.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_hayblock_top.png,,,,,, -/assets/minecraft/textures/blocks,wheat_stage_0.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_0.png,,,,,, -/assets/minecraft/textures/blocks,wheat_stage_1.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_1.png,,,,,, -/assets/minecraft/textures/blocks,wheat_stage_2.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_2.png,,,,,, -/assets/minecraft/textures/blocks,wheat_stage_3.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_3.png,,,,,, -/assets/minecraft/textures/blocks,wheat_stage_4.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_4.png,,,,,, -/assets/minecraft/textures/blocks,wheat_stage_5.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_5.png,,,,,, -/assets/minecraft/textures/blocks,wheat_stage_6.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_6.png,,,,,, -/assets/minecraft/textures/blocks,wheat_stage_7.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_7.png,,,,,, -/assets/minecraft/textures/blocks,fire_layer_0.png,/mods/ITEMS/mcl_fire/textures,fire_basic_flame_animated.png,,,,,, -/assets/minecraft/textures/blocks,fire_layer_0.png,/mods/ITEMS/mcl_fire/textures,fire_basic_flame.png,0,0,16,16,0,0 -/assets/minecraft/textures/items,fireball.png,/mods/ITEMS/mcl_fire/textures,mcl_fire_fire_charge.png,,,,,, -/assets/minecraft/textures/items,flint_and_steel.png,/mods/ITEMS/mcl_fire/textures,mcl_fire_flint_and_steel.png,,,,,, -/assets/minecraft/textures/items,fish_clownfish_raw.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_clownfish_raw.png,,,,,, -/assets/minecraft/textures/items,fish_cod_cooked.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_fish_cooked.png,,,,,, -/assets/minecraft/textures/items,fishing_rod_uncast.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_fishing_rod.png,,,,,, -/assets/minecraft/textures/items,fish_cod_raw.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_fish_raw.png,,,,,, -/assets/minecraft/textures/items,fish_pufferfish_raw.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_pufferfish_raw.png,,,,,, -/assets/minecraft/textures/items,fish_salmon_cooked.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_salmon_cooked.png,,,,,, -/assets/minecraft/textures/items,fish_salmon_raw.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_salmon_raw.png,,,,,, -/assets/minecraft/textures/blocks,flower_allium.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_allium.png,,,,,, -/assets/minecraft/textures/blocks,flower_houstonia.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_azure_bluet.png,,,,,, -/assets/minecraft/textures/blocks,flower_blue_orchid.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_blue_orchid.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_paeonia_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_paeonia_bottom.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_paeonia_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_paeonia_top.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_rose_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_rose_bottom.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_rose_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_rose_top.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_sunflower_back.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_sunflower_back.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_sunflower_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_sunflower_bottom.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_sunflower_front.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_sunflower_front.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_sunflower_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_sunflower_top.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_syringa_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_syringa_bottom.png,,,,,, -/assets/minecraft/textures/blocks,double_plant_syringa_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_syringa_top.png,,,,,, -/assets/minecraft/textures/blocks,flower_oxeye_daisy.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_oxeye_daisy.png,,,,,, -/assets/minecraft/textures/blocks,flower_rose.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_poppy.png,,,,,, -/assets/minecraft/textures/blocks,flower_tulip_pink.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_tulip_pink.png,,,,,, -/assets/minecraft/textures/blocks,flower_tulip_red.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_tulip_red.png,,,,,, -/assets/minecraft/textures/blocks,flower_tulip_white.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_tulip_white.png,,,,,, -/assets/minecraft/textures/blocks,flower_dandelion.png,/mods/ITEMS/mcl_flowers/textures,flowers_dandelion_yellow.png,,,,,, -/assets/minecraft/textures/blocks,flower_tulip_orange.png,/mods/ITEMS/mcl_flowers/textures,flowers_tulip.png,,,,,, -/assets/minecraft/textures/blocks,furnace_front_off.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_front.png,,,,,, -/assets/minecraft/textures/blocks,furnace_front_on.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_front_active.png,,,,,, -/assets/minecraft/textures/blocks,furnace_side.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_side.png,,,,,, -/assets/minecraft/textures/blocks,furnace_top.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_top.png,,,,,, -/assets/minecraft/textures/blocks,furnace_top.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_bottom.png,,,,,, -/assets/minecraft/textures/blocks,hopper_inside.png,/mods/ITEMS/mcl_hoppers/textures,mcl_hoppers_hopper_inside.png,,,,,, -/assets/minecraft/textures/blocks,hopper_outside.png,/mods/ITEMS/mcl_hoppers/textures,mcl_hoppers_hopper_outside.png,,,,,, -/assets/minecraft/textures/blocks,hopper_top.png,/mods/ITEMS/mcl_hoppers/textures,mcl_hoppers_hopper_top.png,,,,,, -/assets/minecraft/textures/items,hopper.png,/mods/ITEMS/mcl_hoppers/textures,mcl_hoppers_item.png,,,,,, -/assets/minecraft/textures/items,record_11.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_11.png,,,,,, -/assets/minecraft/textures/items,record_13.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_13.png,,,,,, -/assets/minecraft/textures/items,record_blocks.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_blocks.png,,,,,, -/assets/minecraft/textures/items,record_cat.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_cat.png,,,,,, -/assets/minecraft/textures/items,record_chirp.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_chirp.png,,,,,, -/assets/minecraft/textures/items,record_far.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_far.png,,,,,, -/assets/minecraft/textures/items,record_mall.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_mall.png,,,,,, -/assets/minecraft/textures/items,record_mellohi.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_mellohi.png,,,,,, -/assets/minecraft/textures/items,record_stal.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_stal.png,,,,,, -/assets/minecraft/textures/items,record_strad.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_strad.png,,,,,, -/assets/minecraft/textures/items,record_wait.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_wait.png,,,,,, -/assets/minecraft/textures/items,record_ward.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_ward.png,,,,,, -/assets/minecraft/textures/blocks,jukebox_side.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_side.png,,,,,, -/assets/minecraft/textures/blocks,jukebox_top.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_top.png,,,,,, -/assets/minecraft/textures/items,map_empty.png,/mods/ITEMS/mcl_maps/textures,mcl_maps_map_empty.png,,,,,, -/assets/minecraft/textures/items,map_filled_markings.png,/mods/ITEMS/mcl_maps/textures,mcl_maps_map_filled_markings.png,,,,,, -/assets/minecraft/textures/items,map_filled.png,/mods/ITEMS/mcl_maps/textures,mcl_maps_map_filled.png,,,,,, -/assets/minecraft/textures/blocks,rail_golden.png,/mods/ITEMS/mcl_minecarts/textures,carts_rail_pwr.png,,,,,, -/assets/minecraft/textures/blocks,rail_normal_turned.png,/mods/ITEMS/mcl_minecarts/textures,default_rail_curved.png,,,,,, -/assets/minecraft/textures/blocks,rail_normal.png,/mods/ITEMS/mcl_minecarts/textures,default_rail.png,,,,,, -/assets/minecraft/textures/items,minecart_normal.png,/mods/ITEMS/mcl_minecarts/textures,mcl_minecarts_minecart_normal.png,,,,,, -/assets/minecraft/textures/blocks,rail_detector.png,/mods/ITEMS/mcl_minecarts/textures,rail_detector.png,,,,,, -/assets/minecraft/textures/blocks,rail_detector_powered.png,/mods/ITEMS/mcl_minecarts/textures,rail_detector_powered.png,,,,,, -/assets/minecraft/textures/blocks,rail_golden_powered.png,/mods/ITEMS/mcl_minecarts/textures,rail_golden_powered.png,,,,,, -/assets/minecraft/textures/items,gunpowder.png,/mods/ITEMS/mcl_mobitems/textures,default_gunpowder.png,,,,,, -/assets/minecraft/textures/items,beef_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_beef_cooked.png,,,,,, -/assets/minecraft/textures/items,beef_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_beef_raw.png,,,,,, -/assets/minecraft/textures/items,blaze_powder.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_blaze_powder.png,,,,,, -/assets/minecraft/textures/items,blaze_rod.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_blaze_rod.png,,,,,, -/assets/minecraft/textures/items,bone.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_bone.png,,,,,, -/assets/minecraft/textures/items,bucket_milk.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_bucket_milk.png,,,,,, -/assets/minecraft/textures/items,carrot_on_a_stick.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_carrot_on_a_stick.png,,,,,, -/assets/minecraft/textures/items,chicken_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_chicken_cooked.png,,,,,, -/assets/minecraft/textures/items,chicken_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_chicken_raw.png,,,,,, -/assets/minecraft/textures/items,feather.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_feather.png,,,,,, -/assets/minecraft/textures/items,ghast_tear.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_ghast_tear.png,,,,,, -/assets/minecraft/textures/items,leather.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_leather.png,,,,,, -/assets/minecraft/textures/items,magma_cream.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_magma_cream.png,,,,,, -/assets/minecraft/textures/items,mutton_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_mutton_cooked.png,,,,,, -/assets/minecraft/textures/items,mutton_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_mutton_raw.png,,,,,, -/assets/minecraft/textures/items,nether_star.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_nether_star.png,,,,,, -/assets/minecraft/textures/items,porkchop_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_porkchop_cooked.png,,,,,, -/assets/minecraft/textures/items,porkchop_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_porkchop_raw.png,,,,,, -/assets/minecraft/textures/items,rabbit_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_cooked.png,,,,,, -/assets/minecraft/textures/items,rabbit_foot.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_foot.png,,,,,, -/assets/minecraft/textures/items,rabbit_hide.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_hide.png,,,,,, -/assets/minecraft/textures/items,rabbit_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_raw.png,,,,,, -/assets/minecraft/textures/items,rabbit_stew.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_stew.png,,,,,, -/assets/minecraft/textures/items,rotten_flesh.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rotten_flesh.png,,,,,, -/assets/minecraft/textures/items,saddle.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_saddle.png,,,,,, -/assets/minecraft/textures/items,shulker_shell.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_shulker_shell.png,,,,,, -/assets/minecraft/textures/items,slimeball.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_slimeball.png,,,,,, -/assets/minecraft/textures/items,spider_eye.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_spider_eye.png,,,,,, -/assets/minecraft/textures/items,string.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_string.png,,,,,, -/assets/minecraft/textures/blocks,mob_spawner.png,/mods/ITEMS/mcl_mobspawners/textures,mob_spawner.png,,,,,, -/assets/minecraft/textures/blocks,mushroom_brown.png,/mods/ITEMS/mcl_mushrooms/textures,farming_mushroom_brown.png,,,,,, -/assets/minecraft/textures/blocks,mushroom_red.png,/mods/ITEMS/mcl_mushrooms/textures,farming_mushroom_red.png,,,,,, -/assets/minecraft/textures/items,mushroom_stew.png,/mods/ITEMS/mcl_mushrooms/textures,farming_mushroom_stew.png,,,,,, -/assets/minecraft/textures/blocks,mushroom_block_inside.png,/mods/ITEMS/mcl_mushrooms/textures,mcl_mushrooms_mushroom_block_inside.png,,,,,, -/assets/minecraft/textures/blocks,mushroom_block_skin_brown.png,/mods/ITEMS/mcl_mushrooms/textures,mcl_mushrooms_mushroom_block_skin_brown.png,,,,,, -/assets/minecraft/textures/blocks,mushroom_block_skin_red.png,/mods/ITEMS/mcl_mushrooms/textures,mcl_mushrooms_mushroom_block_skin_red.png,,,,,, -/assets/minecraft/textures/blocks,mushroom_block_skin_stem.png,/mods/ITEMS/mcl_mushrooms/textures,mcl_mushrooms_mushroom_block_skin_stem.png,,,,,, -/assets/minecraft/textures/items,glowstone_dust.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_glowstone_dust.png,,,,,, -/assets/minecraft/textures/blocks,glowstone.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_glowstone.png,,,,,, -/assets/minecraft/textures/blocks,magma.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_magma.png,,,,,, -/assets/minecraft/textures/blocks,nether_brick.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_brick.png,,,,,, -/assets/minecraft/textures/items,netherbrick.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_netherbrick.png,,,,,, -/assets/minecraft/textures/blocks,netherrack.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_netherrack.png,,,,,, -/assets/minecraft/textures/blocks,nether_wart_block.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart_block.png,,,,,, -/assets/minecraft/textures/items,nether_wart.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart.png,,,,,, -/assets/minecraft/textures/blocks,nether_wart_stage_0.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart_stage_0.png,,,,,, -/assets/minecraft/textures/blocks,nether_wart_stage_1.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart_stage_1.png,,,,,, -/assets/minecraft/textures/blocks,nether_wart_stage_2.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart_stage_2.png,,,,,, -/assets/minecraft/textures/blocks,quartz_block_bottom.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_block_bottom.png,,,,,, -/assets/minecraft/textures/blocks,quartz_block_side.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_block_side.png,,,,,, -/assets/minecraft/textures/blocks,quartz_block_top.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_block_top.png,,,,,, -/assets/minecraft/textures/blocks,quartz_block_chiseled.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_chiseled_side.png,,,,,, -/assets/minecraft/textures/blocks,quartz_block_chiseled_top.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_chiseled_top.png,,,,,, -/assets/minecraft/textures/blocks,quartz_ore.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_ore.png,,,,,, -/assets/minecraft/textures/blocks,quartz_block_lines.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_pillar_side.png,,,,,, -/assets/minecraft/textures/blocks,quartz_block_lines_top.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_pillar_top.png,,,,,, -/assets/minecraft/textures/items,quartz.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz.png,,,,,, -/assets/minecraft/textures/blocks,red_nether_brick.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_red_nether_brick.png,,,,,, -/assets/minecraft/textures/blocks,soul_sand.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_soul_sand.png,,,,,, -/assets/minecraft/textures/blocks,prismarine_rough.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_anim.png,,,,,, -/assets/minecraft/textures/blocks,prismarine_bricks.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_bricks.png,,,,,, -/assets/minecraft/textures/items,prismarine_crystals.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_crystals.png,,,,,, -/assets/minecraft/textures/blocks,prismarine_dark.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_dark.png,,,,,, -/assets/minecraft/textures/items,prismarine_shard.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_shard.png,,,,,, -/assets/minecraft/textures/blocks,sea_lantern.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_sea_lantern.png,,,,,, -/assets/minecraft/textures/items,dragon_breath.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_dragon_breath.png,,,,,, -/assets/minecraft/textures/items,melon_speckled.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_melon_speckled.png,,,,,, -/assets/minecraft/textures/items,potion_bottle_drinkable.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_potion_bottle_drinkable.png,,,,,, -/assets/minecraft/textures/items,potion_bottle_empty.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_potion_bottle_empty.png,,,,,, -/assets/minecraft/textures/items,potion_overlay.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_potion_overlay.png,,,,,, -/assets/minecraft/textures/items,spider_eye_fermented.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_spider_eye_fermented.png,,,,,, -/assets/minecraft/textures/blocks,sponge.png,/mods/ITEMS/mcl_sponges/textures,mcl_sponges_sponge.png,,,,,, -/assets/minecraft/textures/blocks,sponge_wet.png,/mods/ITEMS/mcl_sponges/textures,mcl_sponges_sponge_wet.png,,,,,, -/assets/minecraft/textures/blocks,stone_slab_side.png,/mods/ITEMS/mcl_stairs/textures,mcl_stairs_stone_slab_side.png,,,,,, -/assets/minecraft/textures/blocks,stone_slab_top.png,/mods/ITEMS/mcl_stairs/textures,mcl_stairs_stone_slab_top.png,,,,,, -/assets/minecraft/textures/items,arrow.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_arrow_inv.png,,,,,, -/assets/minecraft/textures/items,bow_pulling_0.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_bow_0.png,,,,,, -/assets/minecraft/textures/items,bow_pulling_1.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_bow_1.png,,,,,, -/assets/minecraft/textures/items,bow_pulling_2.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_bow_2.png,,,,,, -/assets/minecraft/textures/items,bow_standby.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_bow.png,,,,,, -/assets/minecraft/textures/items,egg.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_egg.png,,,,,, -/assets/minecraft/textures/items,ender_pearl.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_ender_pearl.png,,,,,, -/assets/minecraft/textures/items,snowball.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_snowball.png,,,,,, -/assets/minecraft/textures/blocks,tnt_bottom.png,/mods/ITEMS/mcl_tnt/textures,default_tnt_bottom.png,,,,,, -/assets/minecraft/textures/blocks,tnt_side.png,/mods/ITEMS/mcl_tnt/textures,default_tnt_side.png,,,,,, -/assets/minecraft/textures/blocks,tnt_top.png,/mods/ITEMS/mcl_tnt/textures,default_tnt_top.png,,,,,, -/assets/minecraft/textures/items,diamond_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_diamondaxe.png,,,,,, -/assets/minecraft/textures/items,diamond_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_diamondpick.png,,,,,, -/assets/minecraft/textures/items,diamond_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_diamondshovel.png,,,,,, -/assets/minecraft/textures/items,diamond_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_diamondsword.png,,,,,, -/assets/minecraft/textures/items,gold_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_goldaxe.png,,,,,, -/assets/minecraft/textures/items,gold_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_goldpick.png,,,,,, -/assets/minecraft/textures/items,gold_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_goldshovel.png,,,,,, -/assets/minecraft/textures/items,gold_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_goldsword.png,,,,,, -/assets/minecraft/textures/items,shears.png,/mods/ITEMS/mcl_tools/textures,default_tool_shears.png,,,,,, -/assets/minecraft/textures/items,iron_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_steelaxe.png,,,,,, -/assets/minecraft/textures/items,iron_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_steelpick.png,,,,,, -/assets/minecraft/textures/items,iron_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_steelshovel.png,,,,,, -/assets/minecraft/textures/items,iron_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_steelsword.png,,,,,, -/assets/minecraft/textures/items,stone_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_stoneaxe.png,,,,,, -/assets/minecraft/textures/items,stone_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_stonepick.png,,,,,, -/assets/minecraft/textures/items,stone_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_stoneshovel.png,,,,,, -/assets/minecraft/textures/items,stone_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_stonesword.png,,,,,, -/assets/minecraft/textures/items,wood_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_woodaxe.png,,,,,, -/assets/minecraft/textures/items,wood_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_woodpick.png,,,,,, -/assets/minecraft/textures/items,wood_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_woodshovel.png,,,,,, -/assets/minecraft/textures/items,wood_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_woodsword.png,,,,,, -/assets/minecraft/textures/blocks,torch_on.png,/mods/ITEMS/mcl_torches/textures,default_torch_on_floor_animated.png,,,,,, -/assets/minecraft/textures/blocks,torch_on.png,/mods/ITEMS/mcl_torches/textures,default_torch_on_floor.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_black.png,/mods/ITEMS/mcl_wool/textures,wool_black.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_blue.png,/mods/ITEMS/mcl_wool/textures,wool_blue.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_brown.png,/mods/ITEMS/mcl_wool/textures,wool_brown.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_cyan.png,/mods/ITEMS/mcl_wool/textures,wool_cyan.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_gray.png,/mods/ITEMS/mcl_wool/textures,wool_dark_grey.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_green.png,/mods/ITEMS/mcl_wool/textures,wool_green.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_silver.png,/mods/ITEMS/mcl_wool/textures,wool_grey.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_light_blue.png,/mods/ITEMS/mcl_wool/textures,wool_light_blue.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_lime.png,/mods/ITEMS/mcl_wool/textures,wool_lime.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_magenta.png,/mods/ITEMS/mcl_wool/textures,wool_magenta.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_orange.png,/mods/ITEMS/mcl_wool/textures,wool_orange.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_pink.png,/mods/ITEMS/mcl_wool/textures,wool_pink.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_red.png,/mods/ITEMS/mcl_wool/textures,wool_red.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_purple.png,/mods/ITEMS/mcl_wool/textures,wool_violet.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_white.png,/mods/ITEMS/mcl_wool/textures,wool_white.png,,,,,, -/assets/minecraft/textures/blocks,wool_colored_yellow.png,/mods/ITEMS/mcl_wool/textures,wool_yellow.png,,,,,, -/assets/minecraft/textures/items,chainmail_boots.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_boots_chain.png,,,,,, -/assets/minecraft/textures/items,diamond_boots.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_boots_diamond.png,,,,,, -/assets/minecraft/textures/items,gold_boots.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_boots_gold.png,,,,,, -/assets/minecraft/textures/items,iron_boots.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_boots_iron.png,,,,,, -/assets/minecraft/textures/items,leather_boots.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_boots_leather.png,,,,,, -/assets/minecraft/textures/items,chainmail_chestplate.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_chestplate_chain.png,,,,,, -/assets/minecraft/textures/items,diamond_chestplate.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_chestplate_diamond.png,,,,,, -/assets/minecraft/textures/items,gold_chestplate.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_chestplate_gold.png,,,,,, -/assets/minecraft/textures/items,iron_chestplate.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_chestplate_iron.png,,,,,, -/assets/minecraft/textures/items,leather_chestplate.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_chestplate_leather.png,,,,,, -/assets/minecraft/textures/items,chainmail_helmet.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_helmet_chain.png,,,,,, -/assets/minecraft/textures/items,diamond_helmet.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_helmet_diamond.png,,,,,, -/assets/minecraft/textures/items,gold_helmet.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_helmet_gold.png,,,,,, -/assets/minecraft/textures/items,iron_helmet.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_helmet_iron.png,,,,,, -/assets/minecraft/textures/items,leather_helmet.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_helmet_leather.png,,,,,, -/assets/minecraft/textures/items,chainmail_leggings.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_leggings_chain.png,,,,,, -/assets/minecraft/textures/items,diamond_leggings.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_leggings_diamond.png,,,,,, -/assets/minecraft/textures/items,gold_leggings.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_leggings_gold.png,,,,,, -/assets/minecraft/textures/items,iron_leggings.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_leggings_iron.png,,,,,, -/assets/minecraft/textures/items,leather_leggings.png,/mods/ITEMS/minetest-3d_armor/3d_armor/textures,3d_armor_inv_leggings_leather.png,,,,,, -/assets/minecraft/textures/items,wooden_armorstand.png,/mods/ITEMS/minetest-3d_armor/3d_armor_stand/textures,3d_armor_stand_item.png,,,,,, -/assets/minecraft/textures/blocks,dispenser_front_horizontal.png,/mods/ITEMS/REDSTONE/mcl_dispensers/textures,mcl_dispensers_dispenser_front_horizontal.png,,,,,, -/assets/minecraft/textures/blocks,dispenser_front_vertical.png,/mods/ITEMS/REDSTONE/mcl_dispensers/textures,mcl_dispensers_dispenser_front_vertical.png,,,,,, -/assets/minecraft/textures/blocks,dropper_front_horizontal.png,/mods/ITEMS/REDSTONE/mcl_droppers/textures,mcl_droppers_dropper_front_horizontal.png,,,,,, -/assets/minecraft/textures/blocks,dropper_front_vertical.png,/mods/ITEMS/REDSTONE/mcl_droppers/textures,mcl_droppers_dropper_front_vertical.png,,,,,, -/assets/minecraft/textures/blocks,observer_back_lit.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_back_lit.png,,,,,, -/assets/minecraft/textures/blocks,observer_back.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_back.png,,,,,, -/assets/minecraft/textures/blocks,observer_front.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_front.png,,,,,, -/assets/minecraft/textures/blocks,observer_side.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_side.png,,,,,, -/assets/minecraft/textures/blocks,observer_top.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_top.png,,,,,, -/assets/minecraft/textures/items,redstone_dust.png,/mods/ITEMS/REDSTONE/mesecons/textures,redstone_redstone_dust.png,,,,,, -/assets/minecraft/textures/items,repeater.png,/mods/ITEMS/REDSTONE/mesecons_delayer/textures,mesecons_delayer_item.png,,,,,, -/assets/minecraft/textures/blocks,repeater_off.png,/mods/ITEMS/REDSTONE/mesecons_delayer/textures,mesecons_delayer_off.png,,,,,, -/assets/minecraft/textures/blocks,repeater_on.png,/mods/ITEMS/REDSTONE/mesecons_delayer/textures,mesecons_delayer_on.png,,,,,, -/assets/minecraft/textures/blocks,noteblock.png,/mods/ITEMS/REDSTONE/mesecons_noteblock/textures,mesecons_noteblock.png,,,,,, -/assets/minecraft/textures/blocks,command_block_back.png,/mods/ITEMS/REDSTONE/mesecons_commandblock/textures,jeija_commandblock_off.png,,,,,, -/assets/minecraft/textures/blocks,command_block_back.png,/mods/ITEMS/REDSTONE/mesecons_commandblock/textures,jeija_commandblock_on.png,,,,,, -/assets/minecraft/textures/blocks,redstone_lamp_off.png,/mods/ITEMS/REDSTONE/mesecons_lightstone/textures,jeija_lightstone_gray_off.png,,,,,, -/assets/minecraft/textures/blocks,redstone_lamp_on.png,/mods/ITEMS/REDSTONE/mesecons_lightstone/textures,jeija_lightstone_gray_on.png,,,,,, -/assets/minecraft/textures/blocks,daylight_detector_inverted_top.png,/mods/ITEMS/REDSTONE/mesecons_solarpanel/textures,jeija_solar_panel_inverted.png,,,,,, -/assets/minecraft/textures/blocks,daylight_detector_top.png,/mods/ITEMS/REDSTONE/mesecons_solarpanel/textures,jeija_solar_panel.png,,,,,, -/assets/minecraft/textures/blocks,daylight_detector_side.png,/mods/ITEMS/REDSTONE/mesecons_solarpanel/textures,jeija_solar_panel_side.png,,,,,, -/assets/minecraft/textures/blocks,redstone_torch_off.png,/mods/ITEMS/REDSTONE/mesecons_torch/textures,jeija_torches_off.png,,,,,, -/assets/minecraft/textures/blocks,redstone_torch_on.png,/mods/ITEMS/REDSTONE/mesecons_torch/textures,jeija_torches_on.png,,,,,, -/assets/minecraft/textures/blocks,lever.png,/mods/ITEMS/REDSTONE/mesecons_walllever/textures,jeija_wall_lever.png,,,,,, -/assets/minecraft/textures/blocks,piston_bottom.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_back.png,,,,,, -/assets/minecraft/textures/blocks,piston_side.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_bottom.png,,,,,, -/assets/minecraft/textures/blocks,piston_inner.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_on_front.png,,,,,, -/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_back.png,,,,,, -/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_bottom.png,,,,,, -/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_front.png,,,,,, -/assets/minecraft/textures/blocks,piston_top_sticky.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_front_sticky.png,,,,,, -/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_left.png,,,,,, -/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_right.png,,,,,, -/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_top.png,,,,,, -/assets/minecraft/textures/blocks,redstone_block.png,/mods/ITEMS/REDSTONE/mesecons_torch/textures,redstone_redstone_block.png,,,,,, -/assets/minecraft/textures/items,sign.png,/mods/ITEMS/mcl_signs/textures,default_sign.png,,,,,, -/assets/minecraft/textures/blocks,iron_bars.png,/mods/ITEMS/xpanes/textures,xpanes_pane_iron.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_black.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_black.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_blue.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_blue.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_brown.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_brown.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_cyan.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_cyan.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_gray.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_gray.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_green.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_green.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_light_blue.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_light_blue.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_lime.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_lime.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_magenta.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_magenta.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_natural.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_orange.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_orange.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_pink.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_pink.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_purple.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_purple.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_red.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_red.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_silver.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_silver.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_white.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_white.png,,,,,, -/assets/minecraft/textures/blocks,glass_pane_top_yellow.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_yellow.png,,,,,, -/assets/minecraft/textures/items,totem.png,/mods/ENTITIES/mobs_mc/textures,mcl_mobitems_totem.png,,,,,, -/assets/minecraft/textures/entity,bat.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_bat.png,,,,,, -/assets/minecraft/textures/entity,blaze.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_blaze.png,,,,,, -/assets/minecraft/textures/entity/cat,black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cat_black.png,,,,,, -/assets/minecraft/textures/entity/cat,ocelot.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cat_ocelot.png,,,,,, -/assets/minecraft/textures/entity/cat,red.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cat_red.png,,,,,, -/assets/minecraft/textures/entity/cat,siamese.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cat_siamese.png,,,,,, -/assets/minecraft/textures/entity/spider,cave_spider.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cave_spider.png,,,,,, -/assets/minecraft/textures/entity,chicken.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_chicken.png,,,,,, -/assets/minecraft/textures/entity/cow,cow.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cow.png,,,,,, -/assets/minecraft/textures/entity/creeper,creeper.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_creeper.png,,,,,, -/assets/minecraft/textures/items,diamond_horse_armor.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_diamond_horse_armor.png,,,,,, -/assets/minecraft/textures/entity/horse,donkey.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_donkey.png,,,,,, -/assets/minecraft/textures/entity/enderdragon,dragon.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_dragon.png,,,,,, -/assets/minecraft/textures/entity/shulker,endergolem.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_endergolem.png,,,,,, -/assets/minecraft/textures/entity/enderman,enderman_eyes.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_enderman_eyes.png,,,,,, -/assets/minecraft/textures/entity/enderman,enderman.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_enderman.png,,,,,, -/assets/minecraft/textures/entity,endermite.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_endermite.png,,,,,, -/assets/minecraft/textures/entity/ghast,ghast.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_ghast.png,,,,,, -/assets/minecraft/textures/items,gold_horse_armor.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_gold_horse_armor.png,,,,,, -/assets/minecraft/textures/entity,guardian_elder.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_guardian_elder.png,,,,,, -/assets/minecraft/textures/entity,guardian.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_guardian.png,,,,,, -/assets/minecraft/textures/entity/horse/armor,horse_armor_diamond.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_armor_diamond.png,,,,,, -/assets/minecraft/textures/entity/horse/armor,horse_armor_gold.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_armor_gold.png,,,,,, -/assets/minecraft/textures/entity/horse/armor,horse_armor_iron.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_armor_iron.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_black.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_brown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_brown.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_chestnut.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_chestnut.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_darkbrown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_darkbrown.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_gray.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_gray.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_markings_blackdots.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_blackdots.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_markings_whitedots.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_whitedots.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_markings_whitefield.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_whitefield.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_markings_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_white.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_white.png,,,,,, -/assets/minecraft/textures/entity/horse,horse_zombie.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_zombie.png,,,,,, -/assets/minecraft/textures/entity/zombie,husk.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_husk.png,,,,,, -/assets/minecraft/textures/entity,iron_golem.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_iron_golem.png,,,,,, -/assets/minecraft/textures/items,iron_horse_armor.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_iron_horse_armor.png,,,,,, -/assets/minecraft/textures/entity/slime,magmacube.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_magmacube.png,,,,,, -/assets/minecraft/textures/entity/cow,mooshroom.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_mooshroom.png,,,,,, -/assets/minecraft/textures/entity/horse,mule.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_mule.png,,,,,, -/assets/minecraft/textures/entity/pig,pig.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_pig.png,,,,,, -/assets/minecraft/textures/entity/pig,pig_saddle.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_pig_saddle.png,,,,,, -/assets/minecraft/textures/entity/bear,polarbear.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_polarbear.png,,,,,, -/assets/minecraft/textures/entity/rabbit,black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_black.png,,,,,, -/assets/minecraft/textures/entity/rabbit,brown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_brown.png,,,,,, -/assets/minecraft/textures/entity/rabbit,caerbannog.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_caerbannog.png,,,,,, -/assets/minecraft/textures/entity/rabbit,gold.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_gold.png,,,,,, -/assets/minecraft/textures/entity/rabbit,salt.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_salt.png,,,,,, -/assets/minecraft/textures/entity/rabbit,toast.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_toast.png,,,,,, -/assets/minecraft/textures/entity/rabbit,white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_white.png,,,,,, -/assets/minecraft/textures/entity/rabbit,white_splotched.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_white_splotched.png,,,,,, -/assets/minecraft/textures/entity/sheep,sheep_fur.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_sheep_fur.png,,,,,, -/assets/minecraft/textures/entity/sheep,sheep.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_sheep.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_black.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_blue.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_blue.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_brown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_brown.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_cyan.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_cyan.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_gray.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_gray.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_green.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_green.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_light_blue.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_light_blue.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_lime.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_lime.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_magenta.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_magenta.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_orange.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_orange.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_pink.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_pink.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_purple.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_purple.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_red.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_red.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_silver.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_silver.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_white.png,,,,,, -/assets/minecraft/textures/entity/shulker,shulker_yellow.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_yellow.png,,,,,, -/assets/minecraft/textures/entity,silverfish.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_silverfish.png,,,,,, -/assets/minecraft/textures/entity/skeleton,skeleton.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_skeleton.png,,,,,, -/assets/minecraft/textures/entity/slime,slime.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_slime.png,,,,,, -/assets/minecraft/textures/entity,snowman.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_snowman.png,,,,,, -/assets/minecraft/textures/entity,spider_eyes.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_spider_eyes.png,,,,,, -/assets/minecraft/textures/entity/spider,spider.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_spider.png,,,,,, -/assets/minecraft/textures/entity,squid.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_squid.png,,,,,, -/assets/minecraft/textures/entity/skeleton,stray.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_stray.png,,,,,, -/assets/minecraft/textures/entity/villager,butcher.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_butcher.png,,,,,, -/assets/minecraft/textures/entity/villager,farmer.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_farmer.png,,,,,, -/assets/minecraft/textures/entity/villager,librarian.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_librarian.png,,,,,, -/assets/minecraft/textures/entity/villager,villager.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager.png,,,,,, -/assets/minecraft/textures/entity/villager,priest.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_priest.png,,,,,, -/assets/minecraft/textures/entity/villager,smith.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_smith.png,,,,,, -/assets/minecraft/textures/entity,witch.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_witch.png,,,,,, -/assets/minecraft/textures/entity/wither,wither.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wither.png,,,,,, -/assets/minecraft/textures/entity/skeleton,wither_skeleton.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wither_skeleton.png,,,,,, -/assets/minecraft/textures/entity/wolf,wolf_angry.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wolf_angry.png,,,,,, -/assets/minecraft/textures/entity/wolf,wolf_collar.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wolf_collar.png,,,,,, -/assets/minecraft/textures/entity/wolf,wolf.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wolf.png,,,,,, -/assets/minecraft/textures/entity/wolf,wolf_tame.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wolf_tame.png,,,,,, -/assets/minecraft/textures/entity/zombie_villager,zombie_butcher.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_butcher.png,,,,,, -/assets/minecraft/textures/entity/zombie_villager,zombie_farmer.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_farmer.png,,,,,, -/assets/minecraft/textures/entity/zombie_villager,zombie_librarian.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_librarian.png,,,,,, -/assets/minecraft/textures/entity,zombie_pigman.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_pigman.png,,,,,, -/assets/minecraft/textures/entity/zombie,zombie.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie.png,,,,,, -/assets/minecraft/textures/entity/zombie_villager,zombie_priest.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_priest.png,,,,,, -/assets/minecraft/textures/entity/zombie_villager,zombie_smith.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_smith.png,,,,,, -/assets/minecraft/textures/entity/zombie,zombie_villager.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_villager.png,,,,,, -/assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,hbhunger_bgicon.png,16,27,9,9,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,hbhunger_icon_health_poison.png,88,0,9,9,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,hbhunger_icon.png,52,27,9,9,0,0 -/assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,mcl_hunger_icon_foodpoison.png,88,27,9,9,0,0 -/assets/minecraft/textures/particle,particles.png,/mods/ITEMS/mcl_tnt/textures,tnt_smoke.png,56,0,8,8,0,0 -/assets/minecraft/textures/blocks,shulker_top_black.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_black_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_blue.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_blue_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_brown.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_brown_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_cyan.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_cyan_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_gray.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_dark_grey_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_green.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_dark_green_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_light_blue.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_lightblue_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_lime.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_green_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_magenta.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_magenta_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_orange.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_orange_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_pink.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_pink_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_purple.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_violet_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_red.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_red_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_silver.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_grey_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_white.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_white_shulker_box_top.png,,,,,, -/assets/minecraft/textures/blocks,shulker_top_yellow.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_yellow_shulker_box_top.png,,,,,, -/assets/minecraft/textures/items,flower_pot.png,/mods/ITEMS/mcl_flowerpots/textures,mcl_flowerpots_flowerpot_inventory.png,,,,,, -/assets/minecraft/textures/gui,widgets.png,/mods/HUD/mcl_inventory/textures,gui_hotbar.png,0,0,182,22,0,0 -/assets/minecraft/textures/gui,widgets.png,/mods/HUD/mcl_inventory/textures,gui_hotbar_selected.png,0,22,24,24,0,0 -/assets/minecraft/textures/blocks,bed_feet_end.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_bottom_red.png,,,,,, -/assets/minecraft/textures/blocks,bed_feet_side.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_bottom_r_red.png,,,,,, -/assets/minecraft/textures/blocks,bed_feet_top.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_top_bottom_red.png,,,,,, -/assets/minecraft/textures/blocks,bed_head_end.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_bottom_red.png,,,,,, -/assets/minecraft/textures/blocks,bed_head_side.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_top_r_red.png,,,,,, -/assets/minecraft/textures/blocks,bed_head_top.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_top_top_red.png,,,,,, -/assets/minecraft/textures/items,compass_00.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_00.png,,,,,, -/assets/minecraft/textures/items,compass_01.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_01.png,,,,,, -/assets/minecraft/textures/items,compass_02.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_02.png,,,,,, -/assets/minecraft/textures/items,compass_03.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_03.png,,,,,, -/assets/minecraft/textures/items,compass_04.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_04.png,,,,,, -/assets/minecraft/textures/items,compass_05.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_05.png,,,,,, -/assets/minecraft/textures/items,compass_06.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_06.png,,,,,, -/assets/minecraft/textures/items,compass_07.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_07.png,,,,,, -/assets/minecraft/textures/items,compass_08.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_08.png,,,,,, -/assets/minecraft/textures/items,compass_09.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_09.png,,,,,, -/assets/minecraft/textures/items,compass_10.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_10.png,,,,,, -/assets/minecraft/textures/items,compass_11.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_11.png,,,,,, -/assets/minecraft/textures/items,compass_12.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_12.png,,,,,, -/assets/minecraft/textures/items,compass_13.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_13.png,,,,,, -/assets/minecraft/textures/items,compass_14.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_14.png,,,,,, -/assets/minecraft/textures/items,compass_15.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_15.png,,,,,, -/assets/minecraft/textures/items,compass_16.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_16.png,,,,,, -/assets/minecraft/textures/items,compass_17.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_17.png,,,,,, -/assets/minecraft/textures/items,compass_18.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_18.png,,,,,, -/assets/minecraft/textures/items,compass_19.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_19.png,,,,,, -/assets/minecraft/textures/items,compass_20.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_20.png,,,,,, -/assets/minecraft/textures/items,compass_21.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_21.png,,,,,, -/assets/minecraft/textures/items,compass_22.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_22.png,,,,,, -/assets/minecraft/textures/items,compass_23.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_23.png,,,,,, -/assets/minecraft/textures/items,compass_24.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_24.png,,,,,, -/assets/minecraft/textures/items,compass_25.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_25.png,,,,,, -/assets/minecraft/textures/items,compass_26.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_26.png,,,,,, -/assets/minecraft/textures/items,compass_27.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_27.png,,,,,, -/assets/minecraft/textures/items,compass_28.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_28.png,,,,,, -/assets/minecraft/textures/items,compass_29.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_29.png,,,,,, -/assets/minecraft/textures/items,compass_30.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_30.png,,,,,, -/assets/minecraft/textures/items,compass_31.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_31.png,,,,,, -/assets/minecraft/textures/items,empty_armor_slot_boots.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_boots.png,,,,,, -/assets/minecraft/textures/items,empty_armor_slot_chestplate.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_chestplate.png,,,,,, -/assets/minecraft/textures/items,empty_armor_slot_helmet.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_helmet.png,,,,,, -/assets/minecraft/textures/items,empty_armor_slot_leggings.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_leggings.png,,,,,, -/assets/minecraft/textures/items,empty_armor_slot_shield.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_shield.png,,,,,, -/assets/minecraft/textures/items,knowledge_book.png,/mods/HELP/mcl_craftguide/textures,craftguide_book.png,,,,,, -/assets/minecraft/textures/blocks,redstone_dust_dot.png,/mods/ITEMS/REDSTONE/mesecons/textures,redstone_redstone_dust_dot.png,,,,,, -/assets/minecraft/textures/blocks,redstone_dust_line0.png,/mods/ITEMS/REDSTONE/mesecons/textures,redstone_redstone_dust_line0.png,,,,,, -/assets/minecraft/textures/blocks,redstone_dust_line1.png,/mods/ITEMS/REDSTONE/mesecons/textures,redstone_redstone_dust_line1.png,,,,,, -/assets/minecraft/textures/blocks,pumpkin_stem_connected.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_pumpkin_stem_connected.png,,,,,, -/assets/minecraft/textures/blocks,melon_stem_connected.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_melon_stem_connected.png,,,,,, -/assets/minecraft/textures/blocks,pumpkin_stem_disconnected.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_pumpkin_stem_disconnected.png,,,,,, -/assets/minecraft/textures/blocks,melon_stem_disconnected.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_melon_stem_disconnected.png,,,,,, -/assets/minecraft/textures/blocks,fence_acacia.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_acacia.png,,,,,, -/assets/minecraft/textures/blocks,fence_big_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_big_oak.png,,,,,, -/assets/minecraft/textures/blocks,fence_birch.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_birch.png,,,,,, -/assets/minecraft/textures/blocks,fence_gate_acacia.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_acacia.png,,,,,, -/assets/minecraft/textures/blocks,fence_gate_big_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_big_oak.png,,,,,, -/assets/minecraft/textures/blocks,fence_gate_birch.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_birch.png,,,,,, -/assets/minecraft/textures/blocks,fence_gate_jungle.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_jungle.png,,,,,, -/assets/minecraft/textures/blocks,fence_gate_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_oak.png,,,,,, -/assets/minecraft/textures/blocks,fence_gate_spruce.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_spruce.png,,,,,, -/assets/minecraft/textures/blocks,fence_jungle.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_jungle.png,,,,,, -/assets/minecraft/textures/blocks,fence_nether_brick.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_nether_brick.png,,,,,, -/assets/minecraft/textures/blocks,fence_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_oak.png,,,,,, -/assets/minecraft/textures/blocks,fence_spruce.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_spruce.png,,,,,, -/assets/minecraft/textures/entity,sign.png,/mods/ITEMS/mcl_signs/textures,mcl_signs_sign.png,,,,,, -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_1.png,0,0,16,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_2.png,16,0,16,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_3.png,32,0,16,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_4.png,48,0,16,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_5.png,64,0,16,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_6.png,80,0,16,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_7.png,96,0,16,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_8.png,0,32,32,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_9.png,32,32,32,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_10.png,64,32,32,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_11.png,96,32,32,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_12.png,128,32,32,16,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_13.png,0,64,16,32,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_14.png,16,64,16,32,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_15.png,0,128,32,32,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_16.png,32,128,32,32,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_17.png,64,128,32,32,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_18.png,96,128,32,32,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_19.png,128,128,32,32,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_20.png,160,128,32,32,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_21.png,0,96,64,32,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_22.png,0,192,64,64,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_23.png,64,192,64,64,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_24.png,128,192,64,64,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_25.png,192,64,64,48,0,0 -/assets/minecraft/textures/painting,paintings_kristoffer_zetterstrand.png,/mods/ITEMS/gemalde/textures,gemalde_26.png,192,112,64,48,0,0 -/assets/minecraft/textures/entity,banner_base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_banner_base.png,,,,,, -/assets/minecraft/textures/entity/banner,base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_base.png,,,,,, -/assets/minecraft/textures/items,banner_base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_base.png,,,,,, -/assets/minecraft/textures/items,banner_overlay.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_overlay.png,,,,,, -/assets/minecraft/textures/blocks,portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_portal.png,,,,,, -/assets/minecraft/textures/entity,end_portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_end_portal.png,,,,,, +Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? +/assets/minecraft/textures/particle,particles.png,/mods/CORE/mcl_particles/textures,mcl_particles_bubble.png,0,16,8,8,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_hbarmor/textures,hbarmor_icon.png,34,9,9,9,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_hbarmor/textures,hbarmor_bgicon.png,16,9,9,9,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/HUD/hudbars/textures,hudbars_icon_health.png,52,0,9,9,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/HUD/hudbars/textures,hudbars_bgicon_health.png,16,0,9,9,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/HUD/hudbars/textures,hudbars_icon_breath.png,16,18,9,9,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_base_textures/textures,heart.png,52,0,9,9,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_base_textures/textures,bubble.png,16,18,9,9,0,0,y +/assets/minecraft/textures/items,bucket_empty.png,/mods/ITEMS/mcl_buckets/textures,bucket.png,,,,,,, +/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,bucket_water.png,,,,,,, +/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,bucket_river_water.png,,,,,,, +/assets/minecraft/textures/items,bucket_lava.png,/mods/ITEMS/mcl_buckets/textures,bucket_lava.png,,,,,,, +/assets/minecraft/textures/items,item_frame.png,/mods/ITEMS/mcl_itemframes/textures,mcl_itemframes_item_frame.png,,,,,,, +/assets/minecraft/textures/blocks,anvil_base.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_base.png,,,,,,, +/assets/minecraft/textures/blocks,anvil_top_damaged_0.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_top_damaged_0.png,,,,,,, +/assets/minecraft/textures/blocks,anvil_top_damaged_1.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_top_damaged_1.png,,,,,,, +/assets/minecraft/textures/blocks,anvil_top_damaged_2.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_top_damaged_2.png,,,,,,, +/assets/minecraft/textures/blocks,anvil_base.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_side.png,,,,,,, +/assets/minecraft/textures/blocks,anvil_side.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_side.png,,,,,,, +/assets/minecraft/textures/items,name_tag.png,/mods/ENTITIES/mcl_mobs/textures,mobs_nametag.png,,,,,,, +/assets/minecraft/textures/gui,icons.png,/mods/ENTITIES/mobs/textures,mobs_blood.png,16,0,9,9,0,0,y +/assets/minecraft/textures/blocks,itemframe_background.png,/mods/ITEMS/mcl_itemframes/textures,mcl_itemframes_itemframe_background.png,,,,,,, +/assets/minecraft/textures/items,bed.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_red.png,,,,,,, +/assets/minecraft/textures/items,acacia_boat.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_acacia_boat.png,,,,,,, +/assets/minecraft/textures/items,oak_boat.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_oak_boat.png,,,,,,, +/assets/minecraft/textures/items,spruce_boat.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_spruce_boat.png,,,,,,, +/assets/minecraft/textures/items,dark_oak_boat.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_dark_oak_boat.png,,,,,,, +/assets/minecraft/textures/items,jungle_boat.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_jungle_boat.png,,,,,,, +/assets/minecraft/textures/items,birch_boat.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_birch_boat.png,,,,,,, +/assets/minecraft/textures/entity/boat,boat_acacia.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_texture_acacia_boat.png,,,,,,, +/assets/minecraft/textures/entity/boat,boat_oak.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_texture_oak_boat.png,,,,,,, +/assets/minecraft/textures/entity/boat,boat_darkoak.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_texture_dark_oak_boat.png,,,,,,, +/assets/minecraft/textures/entity/boat,boat_spruce.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_texture_spruce_boat.png,,,,,,, +/assets/minecraft/textures/entity/boat,boat_birch.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_texture_birch_boat.png,,,,,,, +/assets/minecraft/textures/entity/boat,boat_jungle.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_texture_jungle_boat.png,,,,,,, +/assets/minecraft/textures/items,book_normal.png,/mods/ITEMS/mcl_books/textures,default_book.png,,,,,,, +/assets/minecraft/textures/blocks,bookshelf.png,/mods/ITEMS/mcl_books/textures,default_bookshelf.png,,,,,,, +/assets/minecraft/textures/blocks,planks_oak.png,/mods/ITEMS/mcl_books/textures,mcl_books_bookshelf_top.png,,,,,,, +/assets/minecraft/textures/blocks,bookshelf_top.png,/mods/ITEMS/mcl_books/textures,mcl_books_bookshelf_top.png,,,,,,, +/assets/minecraft/textures/items,book_writable.png,/mods/ITEMS/mcl_books/textures,mcl_books_book_writable.png,,,,,,, +/assets/minecraft/textures/items,book_written.png,/mods/ITEMS/mcl_books/textures,mcl_books_book_written.png,,,,,,, +/assets/minecraft/textures/items,cake.png,/mods/ITEMS/mcl_cake/textures,cake.png,,,,,,, +/assets/minecraft/textures/blocks,cake_bottom.png,/mods/ITEMS/mcl_cake/textures,cake_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,cake_top.png,/mods/ITEMS/mcl_cake/textures,cake_top.png,,,,,,, +/assets/minecraft/textures/blocks,cake_side.png,/mods/ITEMS/mcl_cake/textures,cake_side.png,,,,,,, +/assets/minecraft/textures/blocks,cake_inner.png,/mods/ITEMS/mcl_cake/textures,cake_inner.png,,,,,,, +/assets/minecraft/textures/items,cauldron.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron.png,,,,,,, +/assets/minecraft/textures/blocks,cauldron_bottom.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,cauldron_top.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_top.png,,,,,,, +/assets/minecraft/textures/blocks,cauldron_side.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_side.png,,,,,,, +/assets/minecraft/textures/blocks,cauldron_inner.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_inner.png,,,,,,, +/assets/minecraft/textures/blocks,cocoa_stage_0.png,/mods/ITEMS/mcl_cocoas/textures,mcl_cocoas_cocoa_stage_0.png,,,,,,,y +/assets/minecraft/textures/blocks,cocoa_stage_1.png,/mods/ITEMS/mcl_cocoas/textures,mcl_cocoas_cocoa_stage_1.png,,,,,,,y +/assets/minecraft/textures/blocks,cocoa_stage_2.png,/mods/ITEMS/mcl_cocoas/textures,mcl_cocoas_cocoa_stage_2.png,,,,,,,y +/assets/minecraft/textures/blocks,hardened_clay.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_black.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_black.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_blue.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_blue.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_brown.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_brown.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_cyan.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_cyan.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_gray.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_grey.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_green.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_green.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_light_blue.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_light_blue.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_lime.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_lime.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_magenta.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_magenta.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_orange.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_orange.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_pink.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_pink.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_purple.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_purple.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_red.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_red.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_silver.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_silver.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_white.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_white.png,,,,,,, +/assets/minecraft/textures/blocks,hardened_clay_stained_yellow.png,/mods/ITEMS/mcl_colorblocks/textures,hardened_clay_stained_yellow.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_black.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_black.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_blue.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_brown.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_brown.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_cyan.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_cyan.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_gray.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_grey.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_green.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_green.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_light_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_light_blue.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_lime.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_lime.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_magenta.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_magenta.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_orange.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_orange.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_pink.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_pink.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_purple.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_purple.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_red.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_red.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_silver.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_silver.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_white.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_white.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_yellow.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_yellow.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_black.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_black.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_blue.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_brown.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_brown.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_cyan.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_cyan.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_gray.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_grey.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_green.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_green.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_light_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_light_blue.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_lime.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_lime.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_magenta.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_magenta.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_orange.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_orange.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_pink.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_pink.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_purple.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_purple.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_red.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_red.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_silver.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_silver.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_white.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_white.png,,,,,,, +/assets/minecraft/textures/blocks,concrete_powder_yellow.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_concrete_powder_yellow.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_black.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_black.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_blue.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_brown.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_brown.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_cyan.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_cyan.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_gray.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_grey.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_green.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_green.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_light_blue.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_light_blue.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_lime.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_lime.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_magenta.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_magenta.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_orange.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_orange.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_pink.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_pink.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_purple.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_purple.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_red.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_red.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_silver.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_silver.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_white.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_white.png,,,,,,, +/assets/minecraft/textures/blocks,glazed_terracotta_yellow.png,/mods/ITEMS/mcl_colorblocks/textures,mcl_colorblocks_glazed_terracotta_yellow.png,,,,,,, +/assets/minecraft/textures/blocks,sapling_oak.png,/mods/ITEMS/mcl_core/textures,default_sapling.png,,,,,,, +/assets/minecraft/textures/blocks,sapling_acacia.png,/mods/ITEMS/mcl_core/textures,default_acacia_sapling.png,,,,,,, +/assets/minecraft/textures/blocks,sapling_spruce.png,/mods/ITEMS/mcl_core/textures,mcl_core_sapling_spruce.png,,,,,,, +/assets/minecraft/textures/blocks,sapling_jungle.png,/mods/ITEMS/mcl_core/textures,default_junglesapling.png,,,,,,, +/assets/minecraft/textures/blocks,sapling_roofed_oak.png,/mods/ITEMS/mcl_core/textures,mcl_core_sapling_big_oak.png,,,,,,, +/assets/minecraft/textures/blocks,sapling_birch.png,/mods/ITEMS/mcl_core/textures,mcl_core_sapling_birch.png,,,,,,, +/assets/minecraft/textures/items,apple.png,/mods/ITEMS/mcl_core/textures,default_apple.png,,,,,,, +/assets/minecraft/textures/items,apple_golden.png,/mods/ITEMS/mcl_core/textures,mcl_core_apple_golden.png,,,,,,, +/assets/minecraft/textures/blocks,brick.png,/mods/ITEMS/mcl_core/textures,default_brick.png,,,,,,, +/assets/minecraft/textures/blocks,cactus_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_cactus_side.png,,,,,,, +/assets/minecraft/textures/blocks,cactus_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_cactus_top.png,,,,,,, +/assets/minecraft/textures/blocks,cactus_bottom.png,/mods/ITEMS/mcl_core/textures,mcl_core_cactus_bottom.png,,,,,,, +/assets/minecraft/textures/items,brick.png,/mods/ITEMS/mcl_core/textures,default_clay_brick.png,,,,,,, +/assets/minecraft/textures/items,clay_ball.png,/mods/ITEMS/mcl_core/textures,default_clay_lump.png,,,,,,, +/assets/minecraft/textures/blocks,clay.png,/mods/ITEMS/mcl_core/textures,default_clay.png,,,,,,, +/assets/minecraft/textures/blocks,coal_block.png,/mods/ITEMS/mcl_core/textures,default_coal_block.png,,,,,,, +/assets/minecraft/textures/items,coal.png,/mods/ITEMS/mcl_core/textures,default_coal_lump.png,,,,,,, +/assets/minecraft/textures/blocks,cobblestone.png,/mods/ITEMS/mcl_core/textures,default_cobble.png,,,,,,, +/assets/minecraft/textures/blocks,diamond_block.png,/mods/ITEMS/mcl_core/textures,default_diamond_block.png,,,,,,, +/assets/minecraft/textures/items,diamond.png,/mods/ITEMS/mcl_core/textures,default_diamond.png,,,,,,, +/assets/minecraft/textures/blocks,dirt.png,/mods/ITEMS/mcl_core/textures,default_dirt.png,,,,,,, +/assets/minecraft/textures/blocks,deadbush.png,/mods/ITEMS/mcl_core/textures,default_dry_shrub.png,,,,,,, +/assets/minecraft/textures/blocks,log_acacia.png,/mods/ITEMS/mcl_core/textures,default_acacia_tree.png,,,,,,, +/assets/minecraft/textures/blocks,log_acacia_top.png,/mods/ITEMS/mcl_core/textures,default_acacia_tree_top.png,,,,,,, +/assets/minecraft/textures/blocks,planks_acacia.png,/mods/ITEMS/mcl_core/textures,default_acacia_wood.png,,,,,,, +/assets/minecraft/textures/items,flint.png,/mods/ITEMS/mcl_core/textures,default_flint.png,,,,,,, +/assets/minecraft/textures/blocks,glass.png,/mods/ITEMS/mcl_core/textures,default_glass.png,,,,,,, +/assets/minecraft/textures/blocks,glass_black.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_black.png,,,,,,, +/assets/minecraft/textures/blocks,glass_blue.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_blue.png,,,,,,, +/assets/minecraft/textures/blocks,glass_brown.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_brown.png,,,,,,, +/assets/minecraft/textures/blocks,glass_cyan.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_cyan.png,,,,,,, +/assets/minecraft/textures/blocks,glass_gray.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_gray.png,,,,,,, +/assets/minecraft/textures/blocks,glass_green.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_green.png,,,,,,, +/assets/minecraft/textures/blocks,glass_light_blue.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_light_blue.png,,,,,,, +/assets/minecraft/textures/blocks,glass_lime.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_lime.png,,,,,,, +/assets/minecraft/textures/blocks,glass_magenta.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_magenta.png,,,,,,, +/assets/minecraft/textures/blocks,glass_orange.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_orange.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pink.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_pink.png,,,,,,, +/assets/minecraft/textures/blocks,glass_purple.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_purple.png,,,,,,, +/assets/minecraft/textures/blocks,glass_red.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_red.png,,,,,,, +/assets/minecraft/textures/blocks,glass_silver.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_silver.png,,,,,,, +/assets/minecraft/textures/blocks,glass_white.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_white.png,,,,,,, +/assets/minecraft/textures/blocks,glass_yellow.png,/mods/ITEMS/mcl_core/textures,mcl_core_glass_yellow.png,,,,,,, +/assets/minecraft/textures/blocks,gold_block.png,/mods/ITEMS/mcl_core/textures,default_gold_block.png,,,,,,, +/assets/minecraft/textures/blocks,gold_block.png,/mods/ITEMS/mclx_stairs/textures,mcl_stairs_gold_block_slab.png,,,,,,, +/assets/minecraft/textures/items,gold_ingot.png,/mods/ITEMS/mcl_core/textures,default_gold_ingot.png,,,,,,, +/assets/minecraft/textures/blocks,grass_side.png,/mods/ITEMS/mcl_core/textures,default_grass_side.png,,,,,,, +/assets/minecraft/textures/blocks,gravel.png,/mods/ITEMS/mcl_core/textures,default_gravel.png,,,,,,, +/assets/minecraft/textures/blocks,ice.png,/mods/ITEMS/mcl_core/textures,default_ice.png,,,,,,, +/assets/minecraft/textures/blocks,log_jungle.png,/mods/ITEMS/mcl_core/textures,default_jungletree.png,,,,,,, +/assets/minecraft/textures/blocks,log_jungle_top.png,/mods/ITEMS/mcl_core/textures,default_jungletree_top.png,,,,,,, +/assets/minecraft/textures/blocks,planks_jungle.png,/mods/ITEMS/mcl_core/textures,default_junglewood.png,,,,,,, +/assets/minecraft/textures/blocks,ladder.png,/mods/ITEMS/mcl_core/textures,default_ladder.png,,,,,,, +/assets/minecraft/textures/blocks,lava_still.png,/mods/ITEMS/mcl_core/textures,default_lava_source_animated.png,,,,,,, +/assets/minecraft/textures/blocks,lava_flow.png,/mods/ITEMS/mcl_core/textures,default_lava_flowing_animated.png,,,,,,, +/assets/minecraft/textures/blocks,cobblestone_mossy.png,/mods/ITEMS/mcl_core/textures,default_mossycobble.png,,,,,,, +/assets/minecraft/textures/blocks,obsidian.png,/mods/ITEMS/mcl_core/textures,default_obsidian.png,,,,,,, +/assets/minecraft/textures/items,paper.png,/mods/ITEMS/mcl_core/textures,default_paper.png,,,,,,, +/assets/minecraft/textures/blocks,reeds.png,/mods/ITEMS/mcl_core/textures,default_papyrus.png,,,,,,, +/assets/minecraft/textures/blocks,sand.png,/mods/ITEMS/mcl_core/textures,default_sand.png,,,,,,, +/assets/minecraft/textures/blocks,snow.png,/mods/ITEMS/mcl_core/textures,default_snow.png,,,,,,, +/assets/minecraft/textures/blocks,iron_block.png,/mods/ITEMS/mcl_core/textures,default_steel_block.png,,,,,,, +/assets/minecraft/textures/blocks,iron_block.png,/mods/ITEMS/mclx_stairs/textures,mcl_stairs_iron_block_slab.png,,,,,,, +/assets/minecraft/textures/items,iron_ingot.png,/mods/ITEMS/mcl_core/textures,default_steel_ingot.png,,,,,,, +/assets/minecraft/textures/items,stick.png,/mods/ITEMS/mcl_core/textures,default_stick.png,,,,,,, +/assets/minecraft/textures/blocks,stonebrick.png,/mods/ITEMS/mcl_core/textures,default_stone_brick.png,,,,,,, +/assets/minecraft/textures/blocks,stone.png,/mods/ITEMS/mcl_core/textures,default_stone.png,,,,,,, +/assets/minecraft/textures/blocks,log_oak.png,/mods/ITEMS/mcl_core/textures,default_tree.png,,,,,,, +/assets/minecraft/textures/blocks,log_oak_top.png,/mods/ITEMS/mcl_core/textures,default_tree_top.png,,,,,,, +/assets/minecraft/textures/blocks,water_still.png,/mods/ITEMS/mcl_core/textures,default_water_source_animated.png,,,,,,, +/assets/minecraft/textures/blocks,water_flow.png,/mods/ITEMS/mcl_core/textures,default_water_flowing_animated.png,,,,,,, +/assets/minecraft/textures/blocks,water_still.png,/mods/ITEMS/mcl_core/textures,default_river_water_source_animated.png,,,,,,, +/assets/minecraft/textures/blocks,water_flow.png,/mods/ITEMS/mcl_core/textures,default_river_water_flowing_animated.png,,,,,,, +/assets/minecraft/textures/blocks,planks_oak.png,/mods/ITEMS/mcl_core/textures,default_wood.png,,,,,,, +/assets/minecraft/textures/blocks,stone_andesite.png,/mods/ITEMS/mcl_core/textures,mcl_core_andesite.png,,,,,,, +/assets/minecraft/textures/blocks,stone_andesite_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_andesite_smooth.png,,,,,,, +/assets/minecraft/textures/blocks,stone_andesite_smooth.png,/mods/ITEMS/mclx_stairs/textures,mcl_stairs_andesite_smooth_slab.png,,,,,,, +/assets/minecraft/textures/items,barrier.png,/mods/ITEMS/mcl_core/textures,mcl_core_barrier.png,,,,,,, +/assets/minecraft/textures/blocks,bedrock.png,/mods/ITEMS/mcl_core/textures,mcl_core_bedrock.png,,,,,,, +/assets/minecraft/textures/blocks,bone_block_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_bone_block_side.png,,,,,,, +/assets/minecraft/textures/blocks,bone_block_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_bone_block_top.png,,,,,,, +/assets/minecraft/textures/items,bowl.png,/mods/ITEMS/mcl_core/textures,mcl_core_bowl.png,,,,,,, +/assets/minecraft/textures/blocks,cactus_bottom.png,/mods/ITEMS/mcl_core/textures,mcl_core_cactus_bottom.png,,,,,,, +/assets/minecraft/textures/items,charcoal.png,/mods/ITEMS/mcl_core/textures,mcl_core_charcoal.png,,,,,,, +/assets/minecraft/textures/blocks,coal_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_coal_ore.png,,,,,,, +/assets/minecraft/textures/blocks,coarse_dirt.png,/mods/ITEMS/mcl_core/textures,mcl_core_coarse_dirt.png,,,,,,, +/assets/minecraft/textures/blocks,diamond_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_diamond_ore.png,,,,,,, +/assets/minecraft/textures/blocks,stone_diorite.png,/mods/ITEMS/mcl_core/textures,mcl_core_diorite.png,,,,,,, +/assets/minecraft/textures/blocks,stone_diorite_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_diorite_smooth.png,,,,,,, +/assets/minecraft/textures/blocks,stone_diorite_smooth.png,/mods/ITEMS/mclx_stairs/textures,mcl_stairs_diorite_smooth_slab.png,,,,,,, +/assets/minecraft/textures/blocks,dirt_podzol_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_dirt_podzol_side.png,,,,,,, +/assets/minecraft/textures/blocks,dirt_podzol_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_dirt_podzol_top.png,,,,,,, +/assets/minecraft/textures/blocks,emerald_block.png,/mods/ITEMS/mcl_core/textures,mcl_core_emerald_block.png,,,,,,, +/assets/minecraft/textures/blocks,emerald_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_emerald_ore.png,,,,,,, +/assets/minecraft/textures/items,emerald.png,/mods/ITEMS/mcl_core/textures,mcl_core_emerald.png,,,,,,, +/assets/minecraft/textures/blocks,frosted_ice_0.png,/mods/ITEMS/mcl_core/textures,mcl_core_frosted_ice_0.png,,,,,,, +/assets/minecraft/textures/blocks,frosted_ice_1.png,/mods/ITEMS/mcl_core/textures,mcl_core_frosted_ice_1.png,,,,,,, +/assets/minecraft/textures/blocks,frosted_ice_2.png,/mods/ITEMS/mcl_core/textures,mcl_core_frosted_ice_2.png,,,,,,, +/assets/minecraft/textures/blocks,frosted_ice_3.png,/mods/ITEMS/mcl_core/textures,mcl_core_frosted_ice_3.png,,,,,,, +/assets/minecraft/textures/items,gold_nugget.png,/mods/ITEMS/mcl_core/textures,mcl_core_gold_nugget.png,,,,,,, +/assets/minecraft/textures/blocks,gold_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_gold_ore.png,,,,,,, +/assets/minecraft/textures/blocks,stone_granite.png,/mods/ITEMS/mcl_core/textures,mcl_core_granite.png,,,,,,, +/assets/minecraft/textures/blocks,stone_granite_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_granite_smooth.png,,,,,,, +/assets/minecraft/textures/blocks,stone_granite_smooth.png,/mods/ITEMS/mclx_stairs/textures,mcl_stairs_granite_smooth_slab.png,,,,,,, +/assets/minecraft/textures/blocks,grass_path_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_grass_path_side.png,,,,,,, +/assets/minecraft/textures/blocks,grass_path_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_grass_path_top.png,,,,,,, +/assets/minecraft/textures/blocks,grass_side_snowed.png,/mods/ITEMS/mcl_core/textures,mcl_core_grass_side_snowed.png,,,,,,, +/assets/minecraft/textures/blocks,ice_packed.png,/mods/ITEMS/mcl_core/textures,mcl_core_ice_packed.png,,,,,,, +/assets/minecraft/textures/items,iron_nugget.png,/mods/ITEMS/mcl_core/textures,mcl_core_iron_nugget.png,,,,,,, +/assets/minecraft/textures/blocks,iron_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_iron_ore.png,,,,,,, +/assets/minecraft/textures/blocks,lapis_block.png,/mods/ITEMS/mcl_core/textures,mcl_core_lapis_block.png,,,,,,, +/assets/minecraft/textures/blocks,lapis_block.png,/mods/ITEMS/mclx_stairs/textures,mcl_stairs_lapis_block_slab.png,,,,,,, +/assets/minecraft/textures/blocks,lapis_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_lapis_ore.png,,,,,,, +/assets/minecraft/textures/blocks,log_big_oak.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_big_oak.png,,,,,,, +/assets/minecraft/textures/blocks,log_big_oak_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_big_oak_top.png,,,,,,, +/assets/minecraft/textures/blocks,log_birch.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_birch.png,,,,,,, +/assets/minecraft/textures/blocks,log_birch_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_birch_top.png,,,,,,, +/assets/minecraft/textures/blocks,log_spruce.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_spruce.png,,,,,,, +/assets/minecraft/textures/blocks,log_spruce_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_log_spruce_top.png,,,,,,, +/assets/minecraft/textures/blocks,mycelium_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_mycelium_side.png,,,,,,, +/assets/minecraft/textures/blocks,mycelium_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_mycelium_top.png,,,,,,, +/assets/minecraft/textures/blocks,planks_big_oak.png,/mods/ITEMS/mcl_core/textures,mcl_core_planks_big_oak.png,,,,,,, +/assets/minecraft/textures/blocks,planks_birch.png,/mods/ITEMS/mcl_core/textures,mcl_core_planks_birch.png,,,,,,, +/assets/minecraft/textures/blocks,planks_spruce.png,/mods/ITEMS/mcl_core/textures,mcl_core_planks_spruce.png,,,,,,, +/assets/minecraft/textures/blocks,red_sand.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sand.png,,,,,,, +/assets/minecraft/textures/blocks,red_sandstone_bottom.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,red_sandstone_carved.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_carved.png,,,,,,, +/assets/minecraft/textures/blocks,red_sandstone_normal.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_normal.png,,,,,,, +/assets/minecraft/textures/blocks,red_sandstone_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_smooth.png,,,,,,, +/assets/minecraft/textures/blocks,red_sandstone_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_red_sandstone_top.png,,,,,,, +/assets/minecraft/textures/blocks,redstone_ore.png,/mods/ITEMS/mcl_core/textures,mcl_core_redstone_ore.png,,,,,,, +/assets/minecraft/textures/items,reeds.png,/mods/ITEMS/mcl_core/textures,mcl_core_reeds.png,,,,,,, +/assets/minecraft/textures/blocks,sandstone_bottom.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,sandstone_carved.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_carved.png,,,,,,, +/assets/minecraft/textures/blocks,sandstone_normal.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_normal.png,,,,,,, +/assets/minecraft/textures/blocks,sandstone_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_smooth.png,,,,,,, +/assets/minecraft/textures/blocks,sandstone_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_sandstone_top.png,,,,,,, +/assets/minecraft/textures/blocks,slime.png,/mods/ITEMS/mcl_core/textures,mcl_core_slime.png,,,,,,, +/assets/minecraft/textures/blocks,stonebrick_carved.png,/mods/ITEMS/mcl_core/textures,mcl_core_stonebrick_carved.png,,,,,,, +/assets/minecraft/textures/blocks,stonebrick_cracked.png,/mods/ITEMS/mcl_core/textures,mcl_core_stonebrick_cracked.png,,,,,,, +/assets/minecraft/textures/blocks,stonebrick_mossy.png,/mods/ITEMS/mcl_core/textures,mcl_core_stonebrick_mossy.png,,,,,,, +/assets/minecraft/textures/items,sugar.png,/mods/ITEMS/mcl_core/textures,mcl_core_sugar.png,,,,,,, +/assets/minecraft/textures/blocks,web.png,/mods/ITEMS/mcl_core/textures,mcl_core_web.png,,,,,,, +/assets/minecraft/textures/blocks,crafting_table_front.png,/mods/ITEMS/mcl_crafting_table/textures,crafting_workbench_front.png,,,,,,, +/assets/minecraft/textures/blocks,crafting_table_side.png,/mods/ITEMS/mcl_crafting_table/textures,crafting_workbench_side.png,,,,,,, +/assets/minecraft/textures/blocks,crafting_table_top.png,/mods/ITEMS/mcl_crafting_table/textures,crafting_workbench_top.png,,,,,,, +/assets/minecraft/textures/blocks,door_acacia_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_acacia_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_acacia_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_acacia_side_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_acacia_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_acacia_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_acacia_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_acacia_side_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_birch_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_birch_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_birch_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_birch_side_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_birch_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_birch_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_birch_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_birch_side_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_dark_oak_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_dark_oak_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_dark_oak_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_dark_oak_side_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_dark_oak_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_dark_oak_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_dark_oak_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_dark_oak_side_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_iron_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_iron_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_iron_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_iron_side_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_iron_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_iron_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_iron_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_iron_side_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_jungle_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_jungle_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_jungle_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_jungle_side_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_jungle_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_jungle_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_jungle_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_jungle_side_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_spruce_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_spruce_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_spruce_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_spruce_side_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_spruce_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_spruce_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_spruce_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_spruce_side_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_wood_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_wood_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_wood_lower.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_wood_side_lower.png,,,,,,, +/assets/minecraft/textures/blocks,door_wood_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_wood_upper.png,,,,,,, +/assets/minecraft/textures/blocks,door_wood_upper.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_wood_side_upper.png,,,,,,, +/assets/minecraft/textures/blocks,trapdoor.png,/mods/ITEMS/mcl_doors/textures,doors_trapdoor.png,,,,,,, +/assets/minecraft/textures/blocks,trapdoor.png,/mods/ITEMS/mcl_doors/textures,doors_trapdoor_side.png,,,,,,, +/assets/minecraft/textures/blocks,iron_trapdoor.png,/mods/ITEMS/mcl_doors/textures,doors_trapdoor_steel.png,,,,,,, +/assets/minecraft/textures/blocks,iron_trapdoor.png,/mods/ITEMS/mcl_doors/textures,doors_trapdoor_steel_side.png,,,,,,, +/assets/minecraft/textures/items,door_acacia.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_acacia.png,,,,,,, +/assets/minecraft/textures/items,door_birch.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_birch.png,,,,,,, +/assets/minecraft/textures/items,door_dark_oak.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_dark_oak.png,,,,,,, +/assets/minecraft/textures/items,door_jungle.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_jungle.png,,,,,,, +/assets/minecraft/textures/items,door_spruce.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_spruce.png,,,,,,, +/assets/minecraft/textures/items,door_wood.png,/mods/ITEMS/mcl_doors/textures,doors_item_wood.png,,,,,,, +/assets/minecraft/textures/items,door_iron.png,/mods/ITEMS/mcl_doors/textures,doors_item_steel.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_black.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_black.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_blue.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_blue.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_brown.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_brown.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_cyan.png,/mods/ITEMS/mcl_dye/textures,dye_cyan.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_gray.png,/mods/ITEMS/mcl_dye/textures,dye_dark_grey.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_green.png,/mods/ITEMS/mcl_dye/textures,dye_dark_green.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_light_blue.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_light_blue.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_lime.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_lime.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_magenta.png,/mods/ITEMS/mcl_dye/textures,dye_magenta.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_orange.png,/mods/ITEMS/mcl_dye/textures,dye_orange.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_pink.png,/mods/ITEMS/mcl_dye/textures,dye_pink.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_purple.png,/mods/ITEMS/mcl_dye/textures,dye_violet.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_red.png,/mods/ITEMS/mcl_dye/textures,dye_red.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_silver.png,/mods/ITEMS/mcl_dye/textures,dye_grey.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_white.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_white.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_yellow.png,/mods/ITEMS/mcl_dye/textures,dye_yellow.png,,,,,,, +/assets/minecraft/textures/blocks,chorus_flower_dead.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_flower_dead.png,,,,,,, +/assets/minecraft/textures/blocks,chorus_flower.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_flower.png,,,,,,, +/assets/minecraft/textures/items,chorus_fruit.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_fruit.png,,,,,,, +/assets/minecraft/textures/items,chorus_fruit_popped.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_fruit_popped.png,,,,,,, +/assets/minecraft/textures/blocks,chorus_plant.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_plant.png,,,,,,, +/assets/minecraft/textures/blocks,dragon_egg.png,/mods/ITEMS/mcl_end/textures,mcl_end_dragon_egg.png,,,,,,, +/assets/minecraft/textures/blocks,end_bricks.png,/mods/ITEMS/mcl_end/textures,mcl_end_end_bricks.png,,,,,,, +/assets/minecraft/textures/items,ender_eye.png,/mods/ITEMS/mcl_end/textures,mcl_end_ender_eye.png,,,,,,, +/assets/minecraft/textures/blocks,endframe_eye.png,/mods/ITEMS/mcl_end/textures,mcl_end_endframe_eye.png,,,,,,, +/assets/minecraft/textures/blocks,endframe_side.png,/mods/ITEMS/mcl_end/textures,mcl_end_endframe_side.png,,,,,,, +/assets/minecraft/textures/blocks,endframe_top.png,/mods/ITEMS/mcl_end/textures,mcl_end_endframe_top.png,,,,,,, +/assets/minecraft/textures/blocks,end_stone.png,/mods/ITEMS/mcl_end/textures,mcl_end_end_stone.png,,,,,,, +/assets/minecraft/textures/blocks,purpur_block.png,/mods/ITEMS/mcl_end/textures,mcl_end_purpur_block.png,,,,,,, +/assets/minecraft/textures/blocks,purpur_pillar.png,/mods/ITEMS/mcl_end/textures,mcl_end_purpur_pillar.png,,,,,,, +/assets/minecraft/textures/blocks,purpur_pillar_top.png,/mods/ITEMS/mcl_end/textures,mcl_end_purpur_pillar_top.png,,,,,,, +/assets/minecraft/textures/blocks,potatoes_stage_0.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_potatoes_stage_0.png,,,,,,, +/assets/minecraft/textures/blocks,potatoes_stage_1.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_potatoes_stage_1.png,,,,,,, +/assets/minecraft/textures/blocks,potatoes_stage_2.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_potatoes_stage_2.png,,,,,,, +/assets/minecraft/textures/blocks,potatoes_stage_3.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_potatoes_stage_3.png,,,,,,, +/assets/minecraft/textures/items,pumpkin_pie.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_pumpkin_pie.png,,,,,,, +/assets/minecraft/textures/items,bread.png,/mods/ITEMS/mcl_farming/textures,farming_bread.png,,,,,,, +/assets/minecraft/textures/blocks,carrots_stage_0.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_1.png,,,,,,, +/assets/minecraft/textures/blocks,carrots_stage_1.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_2.png,,,,,,, +/assets/minecraft/textures/blocks,carrots_stage_2.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_3.png,,,,,,, +/assets/minecraft/textures/blocks,carrots_stage_3.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_4.png,,,,,,, +/assets/minecraft/textures/items,carrot_golden.png,/mods/ITEMS/mcl_farming/textures,farming_carrot_gold.png,,,,,,, +/assets/minecraft/textures/items,carrot.png,/mods/ITEMS/mcl_farming/textures,farming_carrot.png,,,,,,, +/assets/minecraft/textures/items,cookie.png,/mods/ITEMS/mcl_farming/textures,farming_cookie.png,,,,,,, +/assets/minecraft/textures/items,melon.png,/mods/ITEMS/mcl_farming/textures,farming_melon.png,,,,,,, +/assets/minecraft/textures/items,seeds_melon.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_melon_seeds.png,,,,,,, +/assets/minecraft/textures/blocks,melon_side.png,/mods/ITEMS/mcl_farming/textures,farming_melon_side.png,,,,,,, +/assets/minecraft/textures/blocks,melon_top.png,/mods/ITEMS/mcl_farming/textures,farming_melon_top.png,,,,,,, +/assets/minecraft/textures/items,potato_baked.png,/mods/ITEMS/mcl_farming/textures,farming_potato_baked.png,,,,,,, +/assets/minecraft/textures/items,potato.png,/mods/ITEMS/mcl_farming/textures,farming_potato.png,,,,,,, +/assets/minecraft/textures/items,potato_poisonous.png,/mods/ITEMS/mcl_farming/textures,farming_potato_poison.png,,,,,,, +/assets/minecraft/textures/blocks,pumpkin_face_on.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_face_light.png,,,,,,, +/assets/minecraft/textures/blocks,pumpkin_face_off.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_face.png,,,,,,, +/assets/minecraft/textures/items,seeds_pumpkin.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_pumpkin_seeds.png,,,,,,, +/assets/minecraft/textures/blocks,pumpkin_side.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_side.png,,,,,,, +/assets/minecraft/textures/blocks,pumpkin_top.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_top.png,,,,,,, +/assets/minecraft/textures/blocks,farmland_dry.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_farmland_dry.png,,,,,,, +/assets/minecraft/textures/blocks,farmland_wet.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_farmland_wet.png,,,,,,, +/assets/minecraft/textures/items,diamond_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_diamondhoe.png,,,,,,, +/assets/minecraft/textures/items,gold_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_goldhoe.png,,,,,,, +/assets/minecraft/textures/items,iron_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_steelhoe.png,,,,,,, +/assets/minecraft/textures/items,stone_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_stonehoe.png,,,,,,, +/assets/minecraft/textures/items,wood_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_woodhoe.png,,,,,,, +/assets/minecraft/textures/items,wheat.png,/mods/ITEMS/mcl_farming/textures,farming_wheat_harvested.png,,,,,,, +/assets/minecraft/textures/items,seeds_wheat.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_seeds.png,,,,,,, +/assets/minecraft/textures/blocks,beetroots_stage_0.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_0.png,,,,,,, +/assets/minecraft/textures/blocks,beetroots_stage_1.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_1.png,,,,,,, +/assets/minecraft/textures/blocks,beetroots_stage_2.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_2.png,,,,,,, +/assets/minecraft/textures/blocks,beetroots_stage_3.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_3.png,,,,,,, +/assets/minecraft/textures/items,beetroot.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot.png,,,,,,, +/assets/minecraft/textures/items,beetroot_seeds.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_seeds.png,,,,,,, +/assets/minecraft/textures/items,beetroot_soup.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_soup.png,,,,,,, +/assets/minecraft/textures/blocks,hay_block_side.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_hayblock_side.png,,,,,,, +/assets/minecraft/textures/blocks,hay_block_top.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_hayblock_top.png,,,,,,, +/assets/minecraft/textures/blocks,wheat_stage_0.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_0.png,,,,,,, +/assets/minecraft/textures/blocks,wheat_stage_1.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_1.png,,,,,,, +/assets/minecraft/textures/blocks,wheat_stage_2.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_2.png,,,,,,, +/assets/minecraft/textures/blocks,wheat_stage_3.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_3.png,,,,,,, +/assets/minecraft/textures/blocks,wheat_stage_4.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_4.png,,,,,,, +/assets/minecraft/textures/blocks,wheat_stage_5.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_5.png,,,,,,, +/assets/minecraft/textures/blocks,wheat_stage_6.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_6.png,,,,,,, +/assets/minecraft/textures/blocks,wheat_stage_7.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_stage_7.png,,,,,,, +/assets/minecraft/textures/blocks,fire_layer_0.png,/mods/ITEMS/mcl_fire/textures,fire_basic_flame_animated.png,,,,,,, +/assets/minecraft/textures/blocks,fire_layer_0.png,/mods/ITEMS/mcl_fire/textures,fire_basic_flame.png,0,0,16,16,0,0,y +/assets/minecraft/textures/items,fireball.png,/mods/ITEMS/mcl_fire/textures,mcl_fire_fire_charge.png,,,,,,, +/assets/minecraft/textures/items,flint_and_steel.png,/mods/ITEMS/mcl_fire/textures,mcl_fire_flint_and_steel.png,,,,,,, +/assets/minecraft/textures/items,fish_clownfish_raw.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_clownfish_raw.png,,,,,,, +/assets/minecraft/textures/items,fish_cod_cooked.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_fish_cooked.png,,,,,,, +/assets/minecraft/textures/items,fishing_rod_uncast.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_fishing_rod.png,,,,,,, +/assets/minecraft/textures/items,fish_cod_raw.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_fish_raw.png,,,,,,, +/assets/minecraft/textures/items,fish_pufferfish_raw.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_pufferfish_raw.png,,,,,,, +/assets/minecraft/textures/items,fish_salmon_cooked.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_salmon_cooked.png,,,,,,, +/assets/minecraft/textures/items,fish_salmon_raw.png,/mods/ITEMS/mcl_fishing/textures,mcl_fishing_salmon_raw.png,,,,,,, +/assets/minecraft/textures/blocks,flower_allium.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_allium.png,,,,,,, +/assets/minecraft/textures/blocks,flower_houstonia.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_azure_bluet.png,,,,,,, +/assets/minecraft/textures/blocks,flower_blue_orchid.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_blue_orchid.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_paeonia_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_paeonia_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_paeonia_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_paeonia_top.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_rose_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_rose_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_rose_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_rose_top.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_sunflower_back.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_sunflower_back.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_sunflower_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_sunflower_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_sunflower_front.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_sunflower_front.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_sunflower_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_sunflower_top.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_syringa_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_syringa_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_syringa_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_syringa_top.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_grass_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_grass_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_grass_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_grass_top.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_fern_bottom.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_fern_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,double_plant_fern_top.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_double_plant_fern_top.png,,,,,,, +/assets/minecraft/textures/blocks,tallgrass.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_tallgrass.png,,,,,,, +/assets/minecraft/textures/blocks,fern.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_fern.png,,,,,,, +/assets/minecraft/textures/blocks,flower_oxeye_daisy.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_oxeye_daisy.png,,,,,,, +/assets/minecraft/textures/blocks,flower_rose.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_poppy.png,,,,,,, +/assets/minecraft/textures/blocks,flower_tulip_pink.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_tulip_pink.png,,,,,,, +/assets/minecraft/textures/blocks,flower_tulip_red.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_tulip_red.png,,,,,,, +/assets/minecraft/textures/blocks,flower_tulip_white.png,/mods/ITEMS/mcl_flowers/textures,mcl_flowers_tulip_white.png,,,,,,, +/assets/minecraft/textures/blocks,flower_dandelion.png,/mods/ITEMS/mcl_flowers/textures,flowers_dandelion_yellow.png,,,,,,, +/assets/minecraft/textures/blocks,flower_tulip_orange.png,/mods/ITEMS/mcl_flowers/textures,flowers_tulip.png,,,,,,, +/assets/minecraft/textures/blocks,furnace_front_off.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_front.png,,,,,,, +/assets/minecraft/textures/blocks,furnace_front_on.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_front_active.png,,,,,,, +/assets/minecraft/textures/blocks,furnace_side.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_side.png,,,,,,, +/assets/minecraft/textures/blocks,furnace_top.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_top.png,,,,,,, +/assets/minecraft/textures/blocks,furnace_top.png,/mods/ITEMS/mcl_furnaces/textures,default_furnace_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,hopper_inside.png,/mods/ITEMS/mcl_hoppers/textures,mcl_hoppers_hopper_inside.png,,,,,,, +/assets/minecraft/textures/blocks,hopper_outside.png,/mods/ITEMS/mcl_hoppers/textures,mcl_hoppers_hopper_outside.png,,,,,,, +/assets/minecraft/textures/blocks,hopper_top.png,/mods/ITEMS/mcl_hoppers/textures,mcl_hoppers_hopper_top.png,,,,,,, +/assets/minecraft/textures/items,hopper.png,/mods/ITEMS/mcl_hoppers/textures,mcl_hoppers_item.png,,,,,,, +/assets/minecraft/textures/items,record_11.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_11.png,,,,,,, +/assets/minecraft/textures/items,record_13.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_13.png,,,,,,, +/assets/minecraft/textures/items,record_blocks.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_blocks.png,,,,,,, +/assets/minecraft/textures/items,record_cat.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_cat.png,,,,,,, +/assets/minecraft/textures/items,record_chirp.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_chirp.png,,,,,,, +/assets/minecraft/textures/items,record_far.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_far.png,,,,,,, +/assets/minecraft/textures/items,record_mall.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_mall.png,,,,,,, +/assets/minecraft/textures/items,record_mellohi.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_mellohi.png,,,,,,, +/assets/minecraft/textures/items,record_stal.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_stal.png,,,,,,, +/assets/minecraft/textures/items,record_strad.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_strad.png,,,,,,, +/assets/minecraft/textures/items,record_wait.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_wait.png,,,,,,, +/assets/minecraft/textures/items,record_ward.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_record_ward.png,,,,,,, +/assets/minecraft/textures/blocks,jukebox_side.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_side.png,,,,,,, +/assets/minecraft/textures/blocks,jukebox_top.png,/mods/ITEMS/mcl_jukebox/textures,mcl_jukebox_top.png,,,,,,, +/assets/minecraft/textures/items,map_empty.png,/mods/ITEMS/mcl_maps/textures,mcl_maps_map_empty.png,,,,,,, +/assets/minecraft/textures/items,map_filled_markings.png,/mods/ITEMS/mcl_maps/textures,mcl_maps_map_filled_markings.png,,,,,,, +/assets/minecraft/textures/items,map_filled.png,/mods/ITEMS/mcl_maps/textures,mcl_maps_map_filled.png,,,,,,, +/assets/minecraft/textures/blocks,rail_golden.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_rail_golden.png,,,,,,, +/assets/minecraft/textures/blocks,rail_golden_powered.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_rail_golden_powered.png,,,,,,, +/assets/minecraft/textures/blocks,rail_normal_turned.png,/mods/ENTITIES/mcl_minecarts/textures,default_rail_curved.png,,,,,,, +/assets/minecraft/textures/blocks,rail_normal.png,/mods/ENTITIES/mcl_minecarts/textures,default_rail.png,,,,,,, +/assets/minecraft/textures/blocks,rail_detector.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_rail_detector.png,,,,,,, +/assets/minecraft/textures/blocks,rail_detector_powered.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_rail_detector_powered.png,,,,,,, +/assets/minecraft/textures/blocks,rail_activator.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_rail_activator.png,,,,,,, +/assets/minecraft/textures/blocks,rail_activator_powered.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_rail_activator_powered.png,,,,,,, +/assets/minecraft/textures/items,minecart_normal.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_minecart_normal.png,,,,,,, +/assets/minecraft/textures/items,minecart_chest.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_minecart_chest.png,,,,,,, +/assets/minecraft/textures/items,minecart_tnt.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_minecart_tnt.png,,,,,,, +/assets/minecraft/textures/items,minecart_command_block.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_minecart_command_block.png,,,,,,, +/assets/minecraft/textures/items,minecart_furnace.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_minecart_furnace.png,,,,,,, +/assets/minecraft/textures/items,minecart_hopper.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_minecart_hopper.png,,,,,,, +/assets/minecraft/textures/items,gunpowder.png,/mods/ITEMS/mcl_mobitems/textures,default_gunpowder.png,,,,,,, +/assets/minecraft/textures/items,beef_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_beef_cooked.png,,,,,,, +/assets/minecraft/textures/items,beef_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_beef_raw.png,,,,,,, +/assets/minecraft/textures/items,blaze_powder.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_blaze_powder.png,,,,,,, +/assets/minecraft/textures/items,blaze_rod.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_blaze_rod.png,,,,,,, +/assets/minecraft/textures/items,bone.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_bone.png,,,,,,, +/assets/minecraft/textures/items,bucket_milk.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_bucket_milk.png,,,,,,, +/assets/minecraft/textures/items,carrot_on_a_stick.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_carrot_on_a_stick.png,,,,,,, +/assets/minecraft/textures/items,chicken_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_chicken_cooked.png,,,,,,, +/assets/minecraft/textures/items,chicken_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_chicken_raw.png,,,,,,, +/assets/minecraft/textures/items,feather.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_feather.png,,,,,,, +/assets/minecraft/textures/items,ghast_tear.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_ghast_tear.png,,,,,,, +/assets/minecraft/textures/items,leather.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_leather.png,,,,,,, +/assets/minecraft/textures/items,magma_cream.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_magma_cream.png,,,,,,, +/assets/minecraft/textures/items,mutton_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_mutton_cooked.png,,,,,,, +/assets/minecraft/textures/items,mutton_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_mutton_raw.png,,,,,,, +/assets/minecraft/textures/items,nether_star.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_nether_star.png,,,,,,, +/assets/minecraft/textures/items,porkchop_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_porkchop_cooked.png,,,,,,, +/assets/minecraft/textures/items,porkchop_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_porkchop_raw.png,,,,,,, +/assets/minecraft/textures/items,rabbit_cooked.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_cooked.png,,,,,,, +/assets/minecraft/textures/items,rabbit_foot.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_foot.png,,,,,,, +/assets/minecraft/textures/items,rabbit_hide.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_hide.png,,,,,,, +/assets/minecraft/textures/items,rabbit_raw.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_raw.png,,,,,,, +/assets/minecraft/textures/items,rabbit_stew.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rabbit_stew.png,,,,,,, +/assets/minecraft/textures/items,rotten_flesh.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_rotten_flesh.png,,,,,,, +/assets/minecraft/textures/items,saddle.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_saddle.png,,,,,,, +/assets/minecraft/textures/items,shulker_shell.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_shulker_shell.png,,,,,,, +/assets/minecraft/textures/items,slimeball.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_slimeball.png,,,,,,, +/assets/minecraft/textures/items,spider_eye.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_spider_eye.png,,,,,,, +/assets/minecraft/textures/items,string.png,/mods/ITEMS/mcl_mobitems/textures,mcl_mobitems_string.png,,,,,,, +/assets/minecraft/textures/blocks,mob_spawner.png,/mods/ITEMS/mcl_mobspawners/textures,mob_spawner.png,,,,,,, +/assets/minecraft/textures/blocks,mushroom_brown.png,/mods/ITEMS/mcl_mushrooms/textures,farming_mushroom_brown.png,,,,,,, +/assets/minecraft/textures/blocks,mushroom_red.png,/mods/ITEMS/mcl_mushrooms/textures,farming_mushroom_red.png,,,,,,, +/assets/minecraft/textures/items,mushroom_stew.png,/mods/ITEMS/mcl_mushrooms/textures,farming_mushroom_stew.png,,,,,,, +/assets/minecraft/textures/blocks,mushroom_block_inside.png,/mods/ITEMS/mcl_mushrooms/textures,mcl_mushrooms_mushroom_block_inside.png,,,,,,, +/assets/minecraft/textures/blocks,mushroom_block_skin_brown.png,/mods/ITEMS/mcl_mushrooms/textures,mcl_mushrooms_mushroom_block_skin_brown.png,,,,,,, +/assets/minecraft/textures/blocks,mushroom_block_skin_red.png,/mods/ITEMS/mcl_mushrooms/textures,mcl_mushrooms_mushroom_block_skin_red.png,,,,,,, +/assets/minecraft/textures/blocks,mushroom_block_skin_stem.png,/mods/ITEMS/mcl_mushrooms/textures,mcl_mushrooms_mushroom_block_skin_stem.png,,,,,,, +/assets/minecraft/textures/items,glowstone_dust.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_glowstone_dust.png,,,,,,, +/assets/minecraft/textures/blocks,glowstone.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_glowstone.png,,,,,,, +/assets/minecraft/textures/blocks,magma.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_magma.png,,,,,,, +/assets/minecraft/textures/blocks,nether_brick.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_brick.png,,,,,,, +/assets/minecraft/textures/items,netherbrick.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_netherbrick.png,,,,,,, +/assets/minecraft/textures/blocks,netherrack.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_netherrack.png,,,,,,, +/assets/minecraft/textures/blocks,nether_wart_block.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart_block.png,,,,,,, +/assets/minecraft/textures/items,nether_wart.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart.png,,,,,,, +/assets/minecraft/textures/blocks,nether_wart_stage_0.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart_stage_0.png,,,,,,, +/assets/minecraft/textures/blocks,nether_wart_stage_1.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart_stage_1.png,,,,,,, +/assets/minecraft/textures/blocks,nether_wart_stage_2.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_nether_wart_stage_2.png,,,,,,, +/assets/minecraft/textures/blocks,quartz_block_bottom.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_block_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,quartz_block_side.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_block_side.png,,,,,,, +/assets/minecraft/textures/blocks,quartz_block_top.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_block_top.png,,,,,,, +/assets/minecraft/textures/blocks,quartz_block_chiseled.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_chiseled_side.png,,,,,,, +/assets/minecraft/textures/blocks,quartz_block_chiseled_top.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_chiseled_top.png,,,,,,, +/assets/minecraft/textures/blocks,quartz_ore.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_ore.png,,,,,,, +/assets/minecraft/textures/blocks,quartz_block_lines.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_pillar_side.png,,,,,,, +/assets/minecraft/textures/blocks,quartz_block_lines_top.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz_pillar_top.png,,,,,,, +/assets/minecraft/textures/items,quartz.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_quartz.png,,,,,,, +/assets/minecraft/textures/blocks,red_nether_brick.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_red_nether_brick.png,,,,,,, +/assets/minecraft/textures/blocks,soul_sand.png,/mods/ITEMS/mcl_nether/textures,mcl_nether_soul_sand.png,,,,,,, +/assets/minecraft/textures/blocks,prismarine_rough.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_anim.png,,,,,,, +/assets/minecraft/textures/blocks,prismarine_bricks.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_bricks.png,,,,,,, +/assets/minecraft/textures/items,prismarine_crystals.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_crystals.png,,,,,,, +/assets/minecraft/textures/blocks,prismarine_dark.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_dark.png,,,,,,, +/assets/minecraft/textures/items,prismarine_shard.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_prismarine_shard.png,,,,,,, +/assets/minecraft/textures/blocks,sea_lantern.png,/mods/ITEMS/mcl_ocean/textures,mcl_ocean_sea_lantern.png,,,,,,, +/assets/minecraft/textures/items,dragon_breath.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_dragon_breath.png,,,,,,, +/assets/minecraft/textures/items,melon_speckled.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_melon_speckled.png,,,,,,, +/assets/minecraft/textures/items,potion_bottle_drinkable.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_potion_bottle_drinkable.png,,,,,,, +/assets/minecraft/textures/items,potion_bottle_empty.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_potion_bottle_empty.png,,,,,,, +/assets/minecraft/textures/items,potion_overlay.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_potion_overlay.png,,,,,,, +/assets/minecraft/textures/items,spider_eye_fermented.png,/mods/ITEMS/mcl_potions/textures,mcl_potions_spider_eye_fermented.png,,,,,,, +/assets/minecraft/textures/blocks,sponge.png,/mods/ITEMS/mcl_sponges/textures,mcl_sponges_sponge.png,,,,,,, +/assets/minecraft/textures/blocks,sponge_wet.png,/mods/ITEMS/mcl_sponges/textures,mcl_sponges_sponge_wet.png,,,,,,, +/assets/minecraft/textures/blocks,sponge_wet.png,/mods/ITEMS/mcl_sponges/textures,mcl_sponges_sponge_wet_river_water.png,,,,,,, +/assets/minecraft/textures/blocks,stone_slab_side.png,/mods/ITEMS/mcl_stairs/textures,mcl_stairs_stone_slab_side.png,,,,,,, +/assets/minecraft/textures/blocks,stone_slab_top.png,/mods/ITEMS/mcl_stairs/textures,mcl_stairs_stone_slab_top.png,,,,,,, +/assets/minecraft/textures/items,arrow.png,/mods/ITEMS/mcl_bows/textures,mcl_bows_arrow_inv.png,,,,,,, +/assets/minecraft/textures/items,bow_pulling_0.png,/mods/ITEMS/mcl_bows/textures,mcl_bows_bow_0.png,,,,,,, +/assets/minecraft/textures/items,bow_pulling_1.png,/mods/ITEMS/mcl_bows/textures,mcl_bows_bow_1.png,,,,,,, +/assets/minecraft/textures/items,bow_pulling_2.png,/mods/ITEMS/mcl_bows/textures,mcl_bows_bow_2.png,,,,,,, +/assets/minecraft/textures/items,bow_standby.png,/mods/ITEMS/mcl_bows/textures,mcl_bows_bow.png,,,,,,, +/assets/minecraft/textures/items,egg.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_egg.png,,,,,,, +/assets/minecraft/textures/items,ender_pearl.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_ender_pearl.png,,,,,,, +/assets/minecraft/textures/items,snowball.png,/mods/ITEMS/mcl_throwing/textures,mcl_throwing_snowball.png,,,,,,, +/assets/minecraft/textures/blocks,tnt_bottom.png,/mods/ITEMS/mcl_tnt/textures,default_tnt_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,tnt_side.png,/mods/ITEMS/mcl_tnt/textures,default_tnt_side.png,,,,,,, +/assets/minecraft/textures/blocks,tnt_top.png,/mods/ITEMS/mcl_tnt/textures,default_tnt_top.png,,,,,,, +/assets/minecraft/textures/items,diamond_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_diamondaxe.png,,,,,,, +/assets/minecraft/textures/items,diamond_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_diamondpick.png,,,,,,, +/assets/minecraft/textures/items,diamond_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_diamondshovel.png,,,,,,, +/assets/minecraft/textures/items,diamond_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_diamondsword.png,,,,,,, +/assets/minecraft/textures/items,gold_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_goldaxe.png,,,,,,, +/assets/minecraft/textures/items,gold_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_goldpick.png,,,,,,, +/assets/minecraft/textures/items,gold_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_goldshovel.png,,,,,,, +/assets/minecraft/textures/items,gold_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_goldsword.png,,,,,,, +/assets/minecraft/textures/items,shears.png,/mods/ITEMS/mcl_tools/textures,default_tool_shears.png,,,,,,, +/assets/minecraft/textures/items,iron_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_steelaxe.png,,,,,,, +/assets/minecraft/textures/items,iron_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_steelpick.png,,,,,,, +/assets/minecraft/textures/items,iron_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_steelshovel.png,,,,,,, +/assets/minecraft/textures/items,iron_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_steelsword.png,,,,,,, +/assets/minecraft/textures/items,stone_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_stoneaxe.png,,,,,,, +/assets/minecraft/textures/items,stone_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_stonepick.png,,,,,,, +/assets/minecraft/textures/items,stone_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_stoneshovel.png,,,,,,, +/assets/minecraft/textures/items,stone_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_stonesword.png,,,,,,, +/assets/minecraft/textures/items,wood_axe.png,/mods/ITEMS/mcl_tools/textures,default_tool_woodaxe.png,,,,,,, +/assets/minecraft/textures/items,wood_pickaxe.png,/mods/ITEMS/mcl_tools/textures,default_tool_woodpick.png,,,,,,, +/assets/minecraft/textures/items,wood_shovel.png,/mods/ITEMS/mcl_tools/textures,default_tool_woodshovel.png,,,,,,, +/assets/minecraft/textures/items,wood_sword.png,/mods/ITEMS/mcl_tools/textures,default_tool_woodsword.png,,,,,,, +/assets/minecraft/textures/blocks,torch_on.png,/mods/ITEMS/mcl_torches/textures,default_torch_on_floor_animated.png,,,,,,, +/assets/minecraft/textures/blocks,torch_on.png,/mods/ITEMS/mcl_torches/textures,default_torch_on_floor.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_black.png,/mods/ITEMS/mcl_wool/textures,wool_black.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_blue.png,/mods/ITEMS/mcl_wool/textures,wool_blue.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_brown.png,/mods/ITEMS/mcl_wool/textures,wool_brown.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_cyan.png,/mods/ITEMS/mcl_wool/textures,wool_cyan.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_gray.png,/mods/ITEMS/mcl_wool/textures,wool_dark_grey.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_green.png,/mods/ITEMS/mcl_wool/textures,wool_dark_green.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_silver.png,/mods/ITEMS/mcl_wool/textures,wool_grey.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_light_blue.png,/mods/ITEMS/mcl_wool/textures,mcl_wool_light_blue.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_lime.png,/mods/ITEMS/mcl_wool/textures,mcl_wool_lime.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_magenta.png,/mods/ITEMS/mcl_wool/textures,wool_magenta.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_orange.png,/mods/ITEMS/mcl_wool/textures,wool_orange.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_pink.png,/mods/ITEMS/mcl_wool/textures,wool_pink.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_red.png,/mods/ITEMS/mcl_wool/textures,wool_red.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_purple.png,/mods/ITEMS/mcl_wool/textures,wool_violet.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_white.png,/mods/ITEMS/mcl_wool/textures,wool_white.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_yellow.png,/mods/ITEMS/mcl_wool/textures,wool_yellow.png,,,,,,, +/assets/minecraft/textures/items,chainmail_boots.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_boots_chain.png,,,,,,, +/assets/minecraft/textures/items,diamond_boots.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_boots_diamond.png,,,,,,, +/assets/minecraft/textures/items,gold_boots.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_boots_gold.png,,,,,,, +/assets/minecraft/textures/items,iron_boots.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_boots_iron.png,,,,,,, +/assets/minecraft/textures/items,leather_boots.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_boots_leather.png,,,,,,, +/assets/minecraft/textures/items,chainmail_chestplate.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_chestplate_chain.png,,,,,,, +/assets/minecraft/textures/items,diamond_chestplate.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_chestplate_diamond.png,,,,,,, +/assets/minecraft/textures/items,gold_chestplate.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_chestplate_gold.png,,,,,,, +/assets/minecraft/textures/items,iron_chestplate.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_chestplate_iron.png,,,,,,, +/assets/minecraft/textures/items,leather_chestplate.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_chestplate_leather.png,,,,,,, +/assets/minecraft/textures/items,chainmail_helmet.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_helmet_chain.png,,,,,,, +/assets/minecraft/textures/items,diamond_helmet.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_helmet_diamond.png,,,,,,, +/assets/minecraft/textures/items,gold_helmet.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_helmet_gold.png,,,,,,, +/assets/minecraft/textures/items,iron_helmet.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_helmet_iron.png,,,,,,, +/assets/minecraft/textures/items,leather_helmet.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_helmet_leather.png,,,,,,, +/assets/minecraft/textures/items,chainmail_leggings.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_leggings_chain.png,,,,,,, +/assets/minecraft/textures/items,diamond_leggings.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_leggings_diamond.png,,,,,,, +/assets/minecraft/textures/items,gold_leggings.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_leggings_gold.png,,,,,,, +/assets/minecraft/textures/items,iron_leggings.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_leggings_iron.png,,,,,,, +/assets/minecraft/textures/items,leather_leggings.png,/mods/ITEMS/mcl_armor/textures,mcl_armor_inv_leggings_leather.png,,,,,,, +/assets/minecraft/textures/items,wooden_armorstand.png,/mods/ITEMS/mcl_armor_stand/textures,3d_armor_stand_item.png,,,,,,, +/assets/minecraft/textures/blocks,dispenser_front_horizontal.png,/mods/ITEMS/REDSTONE/mcl_dispensers/textures,mcl_dispensers_dispenser_front_horizontal.png,,,,,,, +/assets/minecraft/textures/blocks,dispenser_front_vertical.png,/mods/ITEMS/REDSTONE/mcl_dispensers/textures,mcl_dispensers_dispenser_front_vertical.png,,,,,,, +/assets/minecraft/textures/blocks,dropper_front_horizontal.png,/mods/ITEMS/REDSTONE/mcl_droppers/textures,mcl_droppers_dropper_front_horizontal.png,,,,,,, +/assets/minecraft/textures/blocks,dropper_front_vertical.png,/mods/ITEMS/REDSTONE/mcl_droppers/textures,mcl_droppers_dropper_front_vertical.png,,,,,,, +/assets/minecraft/textures/blocks,observer_back_lit.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_back_lit.png,,,,,,, +/assets/minecraft/textures/blocks,observer_back.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_back.png,,,,,,, +/assets/minecraft/textures/blocks,observer_front.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_front.png,,,,,,, +/assets/minecraft/textures/blocks,observer_side.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_side.png,,,,,,, +/assets/minecraft/textures/blocks,observer_top.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_top.png,,,,,,, +/assets/minecraft/textures/items,redstone_dust.png,/mods/ITEMS/REDSTONE/mesecons_wires/textures,redstone_redstone_dust.png,,,,,,, +/assets/minecraft/textures/items,repeater.png,/mods/ITEMS/REDSTONE/mesecons_delayer/textures,mesecons_delayer_item.png,,,,,,, +/assets/minecraft/textures/items,comparator.png,/mods/ITEMS/REDSTONE/mcl_comparators/textures,mcl_comparators_item.png,,,,,,, +/assets/minecraft/textures/blocks,repeater_off.png,/mods/ITEMS/REDSTONE/mesecons_delayer/textures,mesecons_delayer_off.png,,,,,,, +/assets/minecraft/textures/blocks,repeater_on.png,/mods/ITEMS/REDSTONE/mesecons_delayer/textures,mesecons_delayer_on.png,,,,,,, +/assets/minecraft/textures/blocks,noteblock.png,/mods/ITEMS/REDSTONE/mesecons_noteblock/textures,mesecons_noteblock.png,,,,,,, +/assets/minecraft/textures/blocks,command_block_back.png,/mods/ITEMS/REDSTONE/mesecons_commandblock/textures,jeija_commandblock_off.png,,,,,,, +/assets/minecraft/textures/blocks,command_block_back.png,/mods/ITEMS/REDSTONE/mesecons_commandblock/textures,jeija_commandblock_on.png,,,,,,, +/assets/minecraft/textures/blocks,redstone_lamp_off.png,/mods/ITEMS/REDSTONE/mesecons_lightstone/textures,jeija_lightstone_gray_off.png,,,,,,, +/assets/minecraft/textures/blocks,redstone_lamp_on.png,/mods/ITEMS/REDSTONE/mesecons_lightstone/textures,jeija_lightstone_gray_on.png,,,,,,, +/assets/minecraft/textures/blocks,daylight_detector_inverted_top.png,/mods/ITEMS/REDSTONE/mesecons_solarpanel/textures,jeija_solar_panel_inverted.png,,,,,,, +/assets/minecraft/textures/blocks,daylight_detector_top.png,/mods/ITEMS/REDSTONE/mesecons_solarpanel/textures,jeija_solar_panel.png,,,,,,, +/assets/minecraft/textures/blocks,daylight_detector_side.png,/mods/ITEMS/REDSTONE/mesecons_solarpanel/textures,jeija_solar_panel_side.png,,,,,,, +/assets/minecraft/textures/blocks,redstone_torch_off.png,/mods/ITEMS/REDSTONE/mesecons_torch/textures,jeija_torches_off.png,,,,,,, +/assets/minecraft/textures/blocks,redstone_torch_on.png,/mods/ITEMS/REDSTONE/mesecons_torch/textures,jeija_torches_on.png,,,,,,, +/assets/minecraft/textures/blocks,lever.png,/mods/ITEMS/REDSTONE/mesecons_walllever/textures,jeija_wall_lever.png,,,,,,, +/assets/minecraft/textures/blocks,piston_bottom.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_back.png,,,,,,, +/assets/minecraft/textures/blocks,piston_side.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,piston_inner.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_on_front.png,,,,,,, +/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_back.png,,,,,,, +/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_front.png,,,,,,, +/assets/minecraft/textures/blocks,piston_top_sticky.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_front_sticky.png,,,,,,, +/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_left.png,,,,,,, +/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_right.png,,,,,,, +/assets/minecraft/textures/blocks,piston_top_normal.png,/mods/ITEMS/REDSTONE/mesecons_pistons/textures,mesecons_piston_pusher_top.png,,,,,,, +/assets/minecraft/textures/blocks,redstone_block.png,/mods/ITEMS/REDSTONE/mesecons_torch/textures,redstone_redstone_block.png,,,,,,, +/assets/minecraft/textures/items,sign.png,/mods/ITEMS/mcl_signs/textures,default_sign.png,,,,,,, +/assets/minecraft/textures/blocks,iron_bars.png,/mods/ITEMS/xpanes/textures,xpanes_pane_iron.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_black.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_black.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_blue.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_blue.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_brown.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_brown.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_cyan.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_cyan.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_gray.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_gray.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_green.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_green.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_light_blue.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_light_blue.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_lime.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_lime.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_magenta.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_magenta.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_natural.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_orange.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_orange.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_pink.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_pink.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_purple.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_purple.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_red.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_red.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_silver.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_silver.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_white.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_white.png,,,,,,, +/assets/minecraft/textures/blocks,glass_pane_top_yellow.png,/mods/ITEMS/xpanes/textures,xpanes_top_glass_yellow.png,,,,,,, +/assets/minecraft/textures/items,totem.png,/mods/ENTITIES/mobs_mc/textures,mcl_totems_totem.png,,,,,,, +/assets/minecraft/textures/entity,bat.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_bat.png,,,,,,, +/assets/minecraft/textures/entity,blaze.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_blaze.png,,,,,,, +/assets/minecraft/textures/entity/cat,black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cat_black.png,,,,,,, +/assets/minecraft/textures/entity/cat,ocelot.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cat_ocelot.png,,,,,,, +/assets/minecraft/textures/entity/cat,red.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cat_red.png,,,,,,, +/assets/minecraft/textures/entity/cat,siamese.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cat_siamese.png,,,,,,, +/assets/minecraft/textures/entity/spider,cave_spider.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cave_spider.png,,,,,,, +/assets/minecraft/textures/entity,chicken.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_chicken.png,,,,,,, +/assets/minecraft/textures/entity/cow,cow.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cow.png,,,,,,, +/assets/minecraft/textures/entity/creeper,creeper.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_creeper.png,,,,,,, +/assets/minecraft/textures/items,diamond_horse_armor.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_diamond_horse_armor.png,,,,,,, +/assets/minecraft/textures/entity/horse,donkey.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_donkey.png,,,,,,, +/assets/minecraft/textures/entity/enderdragon,dragon.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_dragon.png,,,,,,, +/assets/minecraft/textures/entity/shulker,endergolem.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_endergolem.png,,,,,,, +/assets/minecraft/textures/entity/enderman,enderman_eyes.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_enderman_eyes.png,,,,,,, +/assets/minecraft/textures/entity/enderman,enderman.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_enderman.png,,,,,,, +/assets/minecraft/textures/entity,endermite.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_endermite.png,,,,,,, +/assets/minecraft/textures/entity/ghast,ghast.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_ghast.png,,,,,,, +/assets/minecraft/textures/items,gold_horse_armor.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_gold_horse_armor.png,,,,,,, +/assets/minecraft/textures/entity,guardian_elder.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_guardian_elder.png,,,,,,, +/assets/minecraft/textures/entity,guardian.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_guardian.png,,,,,,, +/assets/minecraft/textures/entity/horse/armor,horse_armor_diamond.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_armor_diamond.png,,,,,,, +/assets/minecraft/textures/entity/horse/armor,horse_armor_gold.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_armor_gold.png,,,,,,, +/assets/minecraft/textures/entity/horse/armor,horse_armor_iron.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_armor_iron.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_black.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_brown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_brown.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_chestnut.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_chestnut.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_darkbrown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_darkbrown.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_gray.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_gray.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_creamy.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_creamy.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_markings_blackdots.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_blackdots.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_markings_whitedots.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_whitedots.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_markings_whitefield.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_whitefield.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_markings_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_white.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_white.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_zombie.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_zombie.png,,,,,,, +/assets/minecraft/textures/entity/zombie,husk.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_husk.png,,,,,,, +/assets/minecraft/textures/entity,iron_golem.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_iron_golem.png,,,,,,, +/assets/minecraft/textures/items,iron_horse_armor.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_iron_horse_armor.png,,,,,,, +/assets/minecraft/textures/entity/slime,magmacube.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_magmacube.png,,,,,,, +/assets/minecraft/textures/entity/cow,mooshroom.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_mooshroom.png,,,,,,, +/assets/minecraft/textures/entity/horse,mule.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_mule.png,,,,,,, +/assets/minecraft/textures/entity/pig,pig.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_pig.png,,,,,,, +/assets/minecraft/textures/entity/pig,pig_saddle.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_pig_saddle.png,,,,,,, +/assets/minecraft/textures/entity/bear,polarbear.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_polarbear.png,,,,,,, +/assets/minecraft/textures/entity/rabbit,black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_black.png,,,,,,, +/assets/minecraft/textures/entity/rabbit,brown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_brown.png,,,,,,, +/assets/minecraft/textures/entity/rabbit,caerbannog.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_caerbannog.png,,,,,,, +/assets/minecraft/textures/entity/rabbit,gold.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_gold.png,,,,,,, +/assets/minecraft/textures/entity/rabbit,salt.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_salt.png,,,,,,, +/assets/minecraft/textures/entity/rabbit,toast.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_toast.png,,,,,,, +/assets/minecraft/textures/entity/rabbit,white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_white.png,,,,,,, +/assets/minecraft/textures/entity/rabbit,white_splotched.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_white_splotched.png,,,,,,, +/assets/minecraft/textures/entity/sheep,sheep_fur.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_sheep_fur.png,,,,,,, +/assets/minecraft/textures/entity/sheep,sheep.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_sheep.png,,,,,,, +/assets/minecraft/textures/entity/shulker,shulker_black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_black.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_blue.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_blue.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_brown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_brown.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_cyan.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_cyan.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_gray.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_gray.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_green.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_green.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_light_blue.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_light_blue.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_lime.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_lime.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_magenta.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_magenta.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_orange.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_orange.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_pink.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_pink.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_purple.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_purple.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_red.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_red.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_silver.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_silver.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_white.png,,,,,,,y +/assets/minecraft/textures/entity/shulker,shulker_yellow.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_yellow.png,,,,,,,y +/assets/minecraft/textures/entity,silverfish.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_silverfish.png,,,,,,, +/assets/minecraft/textures/entity/skeleton,skeleton.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_skeleton.png,,,,,,, +/assets/minecraft/textures/entity/slime,slime.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_slime.png,,,,,,, +/assets/minecraft/textures/entity,snowman.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_snowman.png,,,,,,, +/assets/minecraft/textures/entity,spider_eyes.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_spider_eyes.png,,,,,,, +/assets/minecraft/textures/entity/spider,spider.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_spider.png,,,,,,, +/assets/minecraft/textures/entity,squid.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_squid.png,,,,,,, +/assets/minecraft/textures/entity/skeleton,stray.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_stray.png,,,,,,, +/assets/minecraft/textures/entity/skeleton,stray_overlay.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_stray_overlay.png,,,,,,, +/assets/minecraft/textures/entity/villager,butcher.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_butcher.png,,,,,,, +/assets/minecraft/textures/entity/villager,farmer.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_farmer.png,,,,,,, +/assets/minecraft/textures/entity/villager,librarian.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_librarian.png,,,,,,, +/assets/minecraft/textures/entity/villager,villager.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager.png,,,,,,, +/assets/minecraft/textures/entity/villager,priest.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_priest.png,,,,,,, +/assets/minecraft/textures/entity/villager,smith.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_smith.png,,,,,,, +/assets/minecraft/textures/entity/illager,vex.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_vex.png,,,,,,, +/assets/minecraft/textures/entity/illager,vex_charging.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_vex_charging.png,,,,,,, +/assets/minecraft/textures/entity/illager,vindicator.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_vindicator.png,,,,,,, +/assets/minecraft/textures/entity/illager,evoker.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_evoker.png,,,,,,, +/assets/minecraft/textures/entity/illager,illusionist.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_illusionist.png,,,,,,, +/assets/minecraft/textures/entity,witch.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_witch.png,,,,,,, +/assets/minecraft/textures/entity/wither,wither.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wither.png,,,,,,, +/assets/minecraft/textures/entity/skeleton,wither_skeleton.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wither_skeleton.png,,,,,,, +/assets/minecraft/textures/entity/wolf,wolf_angry.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wolf_angry.png,,,,,,, +/assets/minecraft/textures/entity/wolf,wolf_collar.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wolf_collar.png,,,,,,, +/assets/minecraft/textures/entity/wolf,wolf.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wolf.png,,,,,,, +/assets/minecraft/textures/entity/wolf,wolf_tame.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wolf_tame.png,,,,,,, +/assets/minecraft/textures/entity/zombie_villager,zombie_butcher.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_butcher.png,,,,,,, +/assets/minecraft/textures/entity/zombie_villager,zombie_farmer.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_farmer.png,,,,,,, +/assets/minecraft/textures/entity/zombie_villager,zombie_librarian.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_librarian.png,,,,,,, +/assets/minecraft/textures/entity/zombie_villager,zombie_priest.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_priest.png,,,,,,, +/assets/minecraft/textures/entity/zombie_villager,zombie_smith.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_smith.png,,,,,,, +/assets/minecraft/textures/entity/zombie_villager,zombie_villager.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_villager.png,,,,,,, +/assets/minecraft/textures/entity,zombie_pigman.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_pigman.png,,,,,,, +/assets/minecraft/textures/entity/zombie,zombie.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie.png,,,,,,, +/assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,hbhunger_bgicon.png,16,27,9,9,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,hbhunger_icon_health_poison.png,88,0,9,9,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,hbhunger_icon.png,52,27,9,9,0,0,y +/assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,mcl_hunger_icon_foodpoison.png,88,27,9,9,0,0,y +/assets/minecraft/textures/particle,particles.png,/mods/ITEMS/mcl_tnt/textures,tnt_smoke.png,56,0,8,8,0,0,y +/assets/minecraft/textures/blocks,shulker_top_black.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_black_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_blue.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_blue_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_brown.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_brown_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_cyan.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_cyan_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_gray.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_dark_grey_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_green.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_dark_green_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_light_blue.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_lightblue_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_lime.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_green_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_magenta.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_magenta_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_orange.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_orange_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_pink.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_pink_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_purple.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_violet_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_red.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_red_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_silver.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_grey_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_white.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_white_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/blocks,shulker_top_yellow.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_yellow_shulker_box_top.png,,,,,,,y +/assets/minecraft/textures/items,flower_pot.png,/mods/ITEMS/mcl_flowerpots/textures,mcl_flowerpots_flowerpot_inventory.png,,,,,,, +/assets/minecraft/textures/blocks,flower_pot.png,/mods/ITEMS/mcl_flowerpots/textures,mcl_flowerpots_flowerpot.png,,,,,,,y +/assets/minecraft/textures/gui,widgets.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_hotbar.png,0,0,182,22,0,0,y +/assets/minecraft/textures/gui,widgets.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_hotbar_selected.png,0,22,24,24,0,0,y +/assets/minecraft/textures/blocks,bed_feet_end.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_bottom_red.png,,,,,,, +/assets/minecraft/textures/blocks,bed_feet_side.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_bottom_r_red.png,,,,,,, +/assets/minecraft/textures/blocks,bed_feet_top.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_top_bottom_red.png,,,,,,, +/assets/minecraft/textures/blocks,bed_head_end.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_bottom_red.png,,,,,,, +/assets/minecraft/textures/blocks,bed_head_side.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_top_r_red.png,,,,,,, +/assets/minecraft/textures/blocks,bed_head_top.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_top_top_red.png,,,,,,, +/assets/minecraft/textures/items,compass_00.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_00.png,,,,,,, +/assets/minecraft/textures/items,compass_01.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_01.png,,,,,,, +/assets/minecraft/textures/items,compass_02.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_02.png,,,,,,, +/assets/minecraft/textures/items,compass_03.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_03.png,,,,,,, +/assets/minecraft/textures/items,compass_04.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_04.png,,,,,,, +/assets/minecraft/textures/items,compass_05.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_05.png,,,,,,, +/assets/minecraft/textures/items,compass_06.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_06.png,,,,,,, +/assets/minecraft/textures/items,compass_07.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_07.png,,,,,,, +/assets/minecraft/textures/items,compass_08.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_08.png,,,,,,, +/assets/minecraft/textures/items,compass_09.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_09.png,,,,,,, +/assets/minecraft/textures/items,compass_10.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_10.png,,,,,,, +/assets/minecraft/textures/items,compass_11.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_11.png,,,,,,, +/assets/minecraft/textures/items,compass_12.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_12.png,,,,,,, +/assets/minecraft/textures/items,compass_13.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_13.png,,,,,,, +/assets/minecraft/textures/items,compass_14.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_14.png,,,,,,, +/assets/minecraft/textures/items,compass_15.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_15.png,,,,,,, +/assets/minecraft/textures/items,compass_16.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_16.png,,,,,,, +/assets/minecraft/textures/items,compass_17.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_17.png,,,,,,, +/assets/minecraft/textures/items,compass_18.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_18.png,,,,,,, +/assets/minecraft/textures/items,compass_19.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_19.png,,,,,,, +/assets/minecraft/textures/items,compass_20.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_20.png,,,,,,, +/assets/minecraft/textures/items,compass_21.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_21.png,,,,,,, +/assets/minecraft/textures/items,compass_22.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_22.png,,,,,,, +/assets/minecraft/textures/items,compass_23.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_23.png,,,,,,, +/assets/minecraft/textures/items,compass_24.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_24.png,,,,,,, +/assets/minecraft/textures/items,compass_25.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_25.png,,,,,,, +/assets/minecraft/textures/items,compass_26.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_26.png,,,,,,, +/assets/minecraft/textures/items,compass_27.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_27.png,,,,,,, +/assets/minecraft/textures/items,compass_28.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_28.png,,,,,,, +/assets/minecraft/textures/items,compass_29.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_29.png,,,,,,, +/assets/minecraft/textures/items,compass_30.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_30.png,,,,,,, +/assets/minecraft/textures/items,compass_31.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_31.png,,,,,,, +/assets/minecraft/textures/items,clock_00.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_00.png,,,,,,, +/assets/minecraft/textures/items,clock_01.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_01.png,,,,,,, +/assets/minecraft/textures/items,clock_02.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_02.png,,,,,,, +/assets/minecraft/textures/items,clock_03.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_03.png,,,,,,, +/assets/minecraft/textures/items,clock_04.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_04.png,,,,,,, +/assets/minecraft/textures/items,clock_05.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_05.png,,,,,,, +/assets/minecraft/textures/items,clock_06.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_06.png,,,,,,, +/assets/minecraft/textures/items,clock_07.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_07.png,,,,,,, +/assets/minecraft/textures/items,clock_08.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_08.png,,,,,,, +/assets/minecraft/textures/items,clock_09.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_09.png,,,,,,, +/assets/minecraft/textures/items,clock_10.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_10.png,,,,,,, +/assets/minecraft/textures/items,clock_11.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_11.png,,,,,,, +/assets/minecraft/textures/items,clock_12.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_12.png,,,,,,, +/assets/minecraft/textures/items,clock_13.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_13.png,,,,,,, +/assets/minecraft/textures/items,clock_14.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_14.png,,,,,,, +/assets/minecraft/textures/items,clock_15.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_15.png,,,,,,, +/assets/minecraft/textures/items,clock_16.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_16.png,,,,,,, +/assets/minecraft/textures/items,clock_17.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_17.png,,,,,,, +/assets/minecraft/textures/items,clock_18.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_18.png,,,,,,, +/assets/minecraft/textures/items,clock_19.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_19.png,,,,,,, +/assets/minecraft/textures/items,clock_20.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_20.png,,,,,,, +/assets/minecraft/textures/items,clock_21.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_21.png,,,,,,, +/assets/minecraft/textures/items,clock_22.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_22.png,,,,,,, +/assets/minecraft/textures/items,clock_23.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_23.png,,,,,,, +/assets/minecraft/textures/items,clock_24.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_24.png,,,,,,, +/assets/minecraft/textures/items,clock_25.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_25.png,,,,,,, +/assets/minecraft/textures/items,clock_26.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_26.png,,,,,,, +/assets/minecraft/textures/items,clock_27.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_27.png,,,,,,, +/assets/minecraft/textures/items,clock_28.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_28.png,,,,,,, +/assets/minecraft/textures/items,clock_29.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_29.png,,,,,,, +/assets/minecraft/textures/items,clock_30.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_30.png,,,,,,, +/assets/minecraft/textures/items,clock_31.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_31.png,,,,,,, +/assets/minecraft/textures/items,clock_32.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_32.png,,,,,,, +/assets/minecraft/textures/items,clock_33.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_33.png,,,,,,, +/assets/minecraft/textures/items,clock_34.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_34.png,,,,,,, +/assets/minecraft/textures/items,clock_35.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_35.png,,,,,,, +/assets/minecraft/textures/items,clock_36.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_36.png,,,,,,, +/assets/minecraft/textures/items,clock_37.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_37.png,,,,,,, +/assets/minecraft/textures/items,clock_38.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_38.png,,,,,,, +/assets/minecraft/textures/items,clock_39.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_39.png,,,,,,, +/assets/minecraft/textures/items,clock_40.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_40.png,,,,,,, +/assets/minecraft/textures/items,clock_41.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_41.png,,,,,,, +/assets/minecraft/textures/items,clock_42.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_42.png,,,,,,, +/assets/minecraft/textures/items,clock_43.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_43.png,,,,,,, +/assets/minecraft/textures/items,clock_44.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_44.png,,,,,,, +/assets/minecraft/textures/items,clock_45.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_45.png,,,,,,, +/assets/minecraft/textures/items,clock_46.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_46.png,,,,,,, +/assets/minecraft/textures/items,clock_47.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_47.png,,,,,,, +/assets/minecraft/textures/items,clock_48.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_48.png,,,,,,, +/assets/minecraft/textures/items,clock_49.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_49.png,,,,,,, +/assets/minecraft/textures/items,clock_50.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_50.png,,,,,,, +/assets/minecraft/textures/items,clock_51.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_51.png,,,,,,, +/assets/minecraft/textures/items,clock_52.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_52.png,,,,,,, +/assets/minecraft/textures/items,clock_53.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_53.png,,,,,,, +/assets/minecraft/textures/items,clock_54.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_54.png,,,,,,, +/assets/minecraft/textures/items,clock_55.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_55.png,,,,,,, +/assets/minecraft/textures/items,clock_56.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_56.png,,,,,,, +/assets/minecraft/textures/items,clock_57.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_57.png,,,,,,, +/assets/minecraft/textures/items,clock_58.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_58.png,,,,,,, +/assets/minecraft/textures/items,clock_59.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_59.png,,,,,,, +/assets/minecraft/textures/items,clock_60.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_60.png,,,,,,, +/assets/minecraft/textures/items,clock_61.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_61.png,,,,,,, +/assets/minecraft/textures/items,clock_62.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_62.png,,,,,,, +/assets/minecraft/textures/items,clock_63.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_63.png,,,,,,, +/assets/minecraft/textures/items,empty_armor_slot_boots.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_boots.png,,,,,,, +/assets/minecraft/textures/items,empty_armor_slot_chestplate.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_chestplate.png,,,,,,, +/assets/minecraft/textures/items,empty_armor_slot_helmet.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_helmet.png,,,,,,, +/assets/minecraft/textures/items,empty_armor_slot_leggings.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_leggings.png,,,,,,, +/assets/minecraft/textures/items,empty_armor_slot_shield.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_shield.png,,,,,,, +/assets/minecraft/textures/items,knowledge_book.png,/mods/HELP/mcl_craftguide/textures,craftguide_book.png,,,,,,, +/assets/minecraft/textures/blocks,redstone_dust_dot.png,/mods/ITEMS/REDSTONE/mesecons_wires/textures,redstone_redstone_dust_dot.png,,,,,,, +/assets/minecraft/textures/blocks,redstone_dust_line0.png,/mods/ITEMS/REDSTONE/mesecons_wires/textures,redstone_redstone_dust_line0.png,,,,,,, +/assets/minecraft/textures/blocks,redstone_dust_line1.png,/mods/ITEMS/REDSTONE/mesecons_wires/textures,redstone_redstone_dust_line1.png,,,,,,, +/assets/minecraft/textures/blocks,pumpkin_stem_connected.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_pumpkin_stem_connected.png,,,,,,, +/assets/minecraft/textures/blocks,melon_stem_connected.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_melon_stem_connected.png,,,,,,, +/assets/minecraft/textures/blocks,pumpkin_stem_disconnected.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_pumpkin_stem_disconnected.png,,,,,,, +/assets/minecraft/textures/blocks,melon_stem_disconnected.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_melon_stem_disconnected.png,,,,,,, +/assets/minecraft/textures/blocks,planks_acacia.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_acacia.png,,,,,,, +/assets/minecraft/textures/blocks,planks_big_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_big_oak.png,,,,,,, +/assets/minecraft/textures/blocks,planks_birch.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_birch.png,,,,,,, +/assets/minecraft/textures/blocks,planks_jungle.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_jungle.png,,,,,,, +/assets/minecraft/textures/blocks,planks_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_oak.png,,,,,,, +/assets/minecraft/textures/blocks,planks_spruce.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_spruce.png,,,,,,, +/assets/minecraft/textures/blocks,planks_acacia.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_acacia.png,,,,,,, +/assets/minecraft/textures/blocks,planks_big_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_big_oak.png,,,,,,, +/assets/minecraft/textures/blocks,planks_birch.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_birch.png,,,,,,, +/assets/minecraft/textures/blocks,planks_jungle.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_jungle.png,,,,,,, +/assets/minecraft/textures/blocks,planks_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_oak.png,,,,,,, +/assets/minecraft/textures/blocks,planks_spruce.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_spruce.png,,,,,,, +/assets/minecraft/textures/blocks,nether_brick.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_nether_brick.png,,,,,,, +/assets/minecraft/textures/blocks,fence_acacia.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_acacia.png,,,,,,, +/assets/minecraft/textures/blocks,fence_big_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_big_oak.png,,,,,,, +/assets/minecraft/textures/blocks,fence_birch.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_birch.png,,,,,,, +/assets/minecraft/textures/blocks,fence_jungle.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_jungle.png,,,,,,, +/assets/minecraft/textures/blocks,fence_nether_brick.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_nether_brick.png,,,,,,, +/assets/minecraft/textures/blocks,fence_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_oak.png,,,,,,, +/assets/minecraft/textures/blocks,fence_spruce.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_spruce.png,,,,,,, +/assets/minecraft/textures/blocks,fence_gate_acacia.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_acacia.png,,,,,,, +/assets/minecraft/textures/blocks,fence_gate_big_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_big_oak.png,,,,,,, +/assets/minecraft/textures/blocks,fence_gate_birch.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_birch.png,,,,,,, +/assets/minecraft/textures/blocks,fence_gate_jungle.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_jungle.png,,,,,,, +/assets/minecraft/textures/blocks,fence_gate_oak.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_oak.png,,,,,,, +/assets/minecraft/textures/blocks,fence_gate_spruce.png,/mods/ITEMS/mcl_fences/textures,mcl_fences_fence_gate_spruce.png,,,,,,, +/assets/minecraft/textures/entity,sign.png,/mods/ITEMS/mcl_signs/textures,mcl_signs_sign.png,,,,,,, +/assets/minecraft/textures/entity,banner_base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_banner_base.png,,,,,,, +/assets/minecraft/textures/entity/banner,base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_base.png,,,,,,, +/assets/minecraft/textures/blocks,planks_oak.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_fallback_wood.png,,,,,,, +/assets/minecraft/textures/items,banner_base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_base.png,,,,,,, +/assets/minecraft/textures/items,banner_overlay.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_overlay.png,,,,,,, +/assets/minecraft/textures/blocks,portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_portal.png,,,,,,, +/assets/minecraft/textures/entity,end_portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_end_portal.png,,,,,,, +/assets/minecraft/textures/environment,end_sky.png,/mods/PLAYER/mcl_playerplus/textures,mcl_playerplus_end_sky.png,,,,,,, +/assets/minecraft/textures/entity/chest,normal.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_normal.png,,,,,,,y +/assets/minecraft/textures/entity/chest,normal_double.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_normal_double.png,,,,,,,y +/assets/minecraft/textures/entity/chest,ender.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_ender.png,,,,,,,y +/assets/minecraft/textures/blocks,endframe_top.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_endframe_top.png,,,,,,, +/assets/minecraft/textures/blocks,endframe_side.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_endframe_side.png,,,,,,, +/assets/minecraft/textures/blocks,endframe_eye.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_endframe_eye.png,,,,,,, +/assets/minecraft/textures/blocks,end_stone.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_endframe_bottom.png,,,,,,, +/assets/minecraft/textures/blocks,red_nether_brick.png,,mcl_fences_fence_red_nether_brick.png,,,,,,, +/assets/minecraft/textures/blocks,red_nether_brick.png,,mcl_fences_fence_gate_red_nether_brick.png,,,,,,, +/assets/minecraft/textures/blocks,nether_brick.png,,mcl_fences_fence_gate_nether_brick.png,,,,,,, +/assets/minecraft/textures/blocks,stonebrick_carved.png,,mcl_supplemental_stonebrick_carved_slab.png,,,,,,, +/assets/minecraft/textures/blocks,cobblestone.png,/mods/ITEMS/mcl_walls/textures,mcl_walls_cobble_wall_top.png,,,,,,, +/assets/minecraft/textures/blocks,cobblestone.png,/mods/ITEMS/mcl_walls/textures,mcl_walls_cobble_wall_side.png,,,,,,, +/assets/minecraft/textures/blocks,cobblestone_mossy.png,/mods/ITEMS/mcl_walls/textures,mcl_walls_cobble_mossy_wall_top.png,,,,,,, +/assets/minecraft/textures/blocks,cobblestone_mossy.png,/mods/ITEMS/mcl_walls/textures,mcl_walls_cobble_mossy_wall_side.png,,,,,,, +/assets/minecraft/textures/blocks,grass_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_grass_block_top.png,,,,,,, +/assets/minecraft/textures/blocks,grass_side_overlay.png,/mods/ITEMS/mcl_core/textures,mcl_core_grass_block_side_overlay.png,,,,,,, diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 00000000..abcc73ae --- /dev/null +++ b/tools/README.md @@ -0,0 +1,29 @@ +# MineClone 2 Tools +This directory is for tools and scripts for MineClone 2. +Currently, the only tool is Texture Converter. + +## Texture Converter (EXPERIMENTAL) +This is a Python script which converts a resource pack for Minecraft to +a texture pack for Minetest so it can be used with MineClone 2. + +**WARNING**: This script is currently incomplete, not all textures will be +converted. Some texture conversions are even buggy! +Coverage is close to 100%, but it's not quite there yet. +For a 100% complete texture pack, a bit of manual work on the textures +will be required afterwards. + +Modes of operation: +- Can create a Minetest texture pack (default) +- Can update the MineClone 2 textures + +Requirements: +- Know how to use the console +- Python 3 +- ImageMagick + +Usage: +- Make sure the file “`Conversion_Table.csv`” is in the same directory as the script +- In the console, run `./Texture_Converter.py -h` to learn the available options +- Convert the textures +- Put the new texture directory in the Minetest texture pack directory, just like + any other Minetest texture pack diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 2c92c441..9fa90365 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -1,26 +1,26 @@ #!/usr/bin/env python -# EXPERIMENTAL texture pack copying utility. -# This Python script helps in converting Minecraft texture packs. It has 2 main features: -# - Can create a Minetest texture pack (default) -# - Can update the MineClone 2 textures -# This script is currently incomplete, not all textures are converted. -# -# Requirements: -# - Python 3 -# - Python Library: Pillow -# - ImageMagick -# -# Usage (to be simplified later): -# - Put extracted texture pack into $HOME/tmp/pp -# - Make sure the file “Texture_Conversion_Table.csv” is in the same directory as the script -# - Run the script in its directory -# - If everything worked, retrieve texture pack in texture_pack/ +# -*- coding: utf-8 -*- +# Texture Converter. +# Converts Minecraft resource packs to Minetest texture packs. +# See README.md. __author__ = "Wuzzy" -__license__ = "WTFPL" +__license__ = "MIT License" __status__ = "Development" +import shutil, csv, os, tempfile, sys, getopt + +# Helper vars +home = os.environ["HOME"] +mineclone2_path = home + "/.minetest/games/mineclone2" +working_dir = os.getcwd() +appname = "Texture_Converter.py" + ### SETTINGS ### +output_dir = working_dir + +base_dir = None + # If True, will only make console output but not convert anything. dry_run = False @@ -31,28 +31,107 @@ make_texture_pack = True # If True, prints all copying actions verbose = False +PXSIZE = 16 + +syntax_help = appname+""" -i [-o ] [-d] [-v|-q] [-h] +Mandatory argument: +-i + Directory of Minecraft resource pack to convert + +Optional arguments: +-p + Specify the size (in pixels) of the original textures (default: 16) +-o + Directory in which to put the resulting Minetest texture pack + (default: working directory) +-d + Just pretend to convert textures and just print output, but do not actually + change any files. +-v + Print out all copying actions +-h + Show this help and exit""" +try: + opts, args = getopt.getopt(sys.argv[1:],"hi:o:p:dv") +except getopt.GetoptError: + print( +"""ERROR! The options you gave me make no sense! + +Here's the syntax reference:""") + print(syntax_help) + sys.exit(2) +for opt, arg in opts: + if opt == "-h": + print( +"""This is the official MineClone 2 Texture Converter. +This will convert textures from Minecraft resource packs to +a Minetest texture pack. + +Supported Minecraft version: 1.12 (Java Edition) + +Syntax:""") + print(syntax_help) + sys.exit() + elif opt == "-d": + dry_run = True + elif opt == "-v": + verbose = True + elif opt == "-i": + base_dir = arg + elif opt == "-o": + output_dir = arg + elif opt == "-p": + PXSIZE = int(arg) + +if base_dir == None: + print( +"""ERROR: You didn't tell me the path to the Minecraft resource pack. +Mind-reading has not been implemented yet. + +Try this: + """+appname+""" -i -p + +For the full help, use: + """+appname+""" -h""") + sys.exit(2); + ### END OF SETTINGS ### -import shutil, csv, os, tempfile -from PIL import Image - -# Helper variables -home = os.environ["HOME"] -mineclone2_path = home + "/.minetest/games/mineclone2" -working_dir = os.getcwd() -base_dir = home + "/tmp/pp" tex_dir = base_dir + "/assets/minecraft/textures" -# FUNCTION DEFINITIONS +# Get texture pack name (from directory name) +bdir_split = base_dir.split("/") +output_dir_name = bdir_split[-1] +if len(output_dir_name) == 0: + if len(bdir_split) >= 2: + output_dir_name = base_dir.split("/")[-2] + else: + # Fallback + output_dir_name = "New_MineClone_2_Texture_Pack" -def convert_alphatex(one, two, three, four, five): - os.system("convert "+one+" -crop 1x1+"+three+" -depth 8 -resize "+four+"x"+four+" "+tempfile1.name) - os.system("composite -compose Multiply "+tempfile1.name+" "+two+" "+tempfile2.name) - os.system("composite -compose Dst_In "+two+" "+tempfile1.name+" -alpha Set "+five) +# FUNCTION DEFINITIONS +def colorize(colormap, source, colormap_pixel, texture_size, destination): + os.system("convert "+colormap+" -crop 1x1+"+colormap_pixel+" -depth 8 -resize "+texture_size+"x"+texture_size+" "+tempfile1.name) + os.system("composite -compose Multiply "+tempfile1.name+" "+source+" "+destination) + +def colorize_alpha(colormap, source, colormap_pixel, texture_size, destination): + colorize(colormap, source, colormap_pixel, texture_size, tempfile2.name) + os.system("composite -compose Dst_In "+source+" "+tempfile2.name+" -alpha Set "+destination) + +# This function is unused atm. +# TODO: Implemnt colormap extraction +def extract_colormap(colormap, colormap_pixel, positions): + os.system("convert -size 16x16 canvas:black "+tempfile1.name) + x=0 + y=0 + for p in positions: + os.system("convert "+colormap+" -crop 1x1+"+colormap_pixel+" -depth 8 "+tempfile2.name) + os.system("composite -geometry 16x16+"+x+"+"+y+" "+tempfile2.name) + x = x+1 def target_dir(directory): if make_texture_pack: - return working_dir + "/texture_pack" + return output_dir + "/" + output_dir_name else: return mineclone2_path + directory @@ -60,7 +139,7 @@ def target_dir(directory): def convert_textures(): failed_conversions = 0 print("Texture conversion BEGINS NOW!") - with open("Texture_Conversion_Table.csv", newline="") as csvfile: + with open("Conversion_Table.csv", newline="") as csvfile: reader = csv.reader(csvfile, delimiter=",", quotechar='"') first_row = True for row in reader: @@ -82,6 +161,18 @@ def convert_textures(): yt = int(row[9]) else: xs = None + blacklisted = row[10] + + if blacklisted == "y": + # Skip blacklisted files + continue + + if make_texture_pack == False and dst_dir == "": + # If destination dir is empty, this texture is not supposed to be used in MCL2 + # (but maybe an external mod). It should only be used in texture packs. + # Otherwise, it must be ignored. + # Example: textures for mcl_supplemental + continue src_file = base_dir + src_dir + "/" + src_filename # source file src_file_exists = os.path.isfile(src_file) @@ -94,11 +185,8 @@ def convert_textures(): if xs != None: # Crop and copy images - image = Image.open(src_file) if not dry_run: - region = image.crop((xs, ys, xs+xl, ys+yl)) - region.load() - region.save(dst_file) + os.system("convert "+src_file+" -crop "+xl+"x"+yl+"+"+xs+"+"+ys+" "+dst_file) if verbose: print(src_file + " → " + dst_file) else: @@ -109,21 +197,154 @@ def convert_textures(): print(src_file + " → " + dst_file) # Convert chest textures (requires ImageMagick) - PXSIZE = 16 - chest_file = tex_dir + "/entity/chest/normal.png" + chest_files = [ + [ tex_dir + "/entity/chest/normal.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "default_chest_top.png", "mcl_chests_chest_bottom.png", "default_chest_front.png", "mcl_chests_chest_left.png", "mcl_chests_chest_right.png", "mcl_chests_chest_back.png" ], + [ tex_dir + "/entity/chest/trapped.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "mcl_chests_chest_trapped_top.png", "mcl_chests_chest_trapped_bottom.png", "mcl_chests_chest_trapped_front.png", "mcl_chests_chest_trapped_left.png", "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_back.png" ], + [ tex_dir + "/entity/chest/ender.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png", "mcl_chests_ender_chest_front.png", "mcl_chests_ender_chest_left.png", "mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_back.png" ] + ] - if os.path.isfile(chest_file): - CHPX=((PXSIZE / 16 * 14)) # Chests in MC are 2/16 smaller! + for c in chest_files: + chest_file = c[0] + if os.path.isfile(chest_file): + PPX = (PXSIZE/16) + CHPX = (PPX * 14) # Chest width + LIDPX = (PPX * 5) # Lid height + LIDLOW = (PPX * 10) # Lower lid section height + LOCKW = (PPX * 6) # Lock width + LOCKH = (PPX * 5) # Lock height - os.system("convert " + chest_file + " \ -\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX)+"+"+str(CHPX)+"+0 \) -geometry +0+0 -composite -extent "+str(CHPX)+"x"+str(CHPX)+" "+target_dir("/mods/ITEMS/mcl_chests/textures")+"/default_chest_top.png") + cdir = c[1] + top = cdir + "/" + c[2] + bottom = cdir + "/" + c[3] + front = cdir + "/" + c[4] + left = cdir + "/" + c[5] + right = cdir + "/" + c[6] + back = cdir + "/" + c[7] + # Top + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX)+"+"+str(CHPX)+"+0 \) -geometry +0+0 -composite -extent "+str(CHPX)+"x"+str(CHPX)+" "+top) + # Bottom + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX)+"+"+str(CHPX*2)+"+"+str(CHPX+LIDPX)+" \) -geometry +0+0 -composite -extent "+str(CHPX)+"x"+str(CHPX)+" "+bottom) + # Front + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDPX)+"+"+str(CHPX)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDLOW)+"+"+str(CHPX)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX-PPX)+" -composite \ +-extent "+str(CHPX)+"x"+str(CHPX)+" "+front) + # TODO: Add lock - os.system("convert " + chest_file + " \ -\( -clone 0 -crop "+str(CHPX)+"x"+str((PXSIZE/16)*5)+"+"+str(CHPX)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ -\( -clone 0 -crop "+str(CHPX)+"x"+str((PXSIZE/16)*10)+"+"+str(CHPX)+"+"+str((2*CHPX) + ((PXSIZE/16)*5))+" \) -geometry +0+"+str((PXSIZE/16)*5)+" -composite \ --extent "+str(CHPX)+"x"+str(CHPX)+" "+target_dir("/mods/ITEMS/mcl_chests/textures")+"/default_chest_front.png") + # Left, right back (use same texture, we're lazy + files = [ left, right, back ] + for f in files: + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDPX)+"+"+str(0)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDLOW)+"+"+str(0)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX-PPX)+" -composite \ +-extent "+str(CHPX)+"x"+str(CHPX)+" "+f) - # TODO: Convert other chest sides + # Double chests + + chest_files = [ + [ tex_dir + "/entity/chest/normal_double.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "default_chest_front_big.png", "default_chest_top_big.png", "default_chest_side_big.png" ], + [ tex_dir + "/entity/chest/trapped_double.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "mcl_chests_chest_trapped_front_big.png", "mcl_chests_chest_trapped_top_big.png", "mcl_chests_chest_trapped_side_big.png" ] + ] + for c in chest_files: + chest_file = c[0] + if os.path.isfile(chest_file): + PPX = (PXSIZE/16) + CHPX = (PPX * 14) # Chest width (short side) + CHPX2 = (PPX * 15) # Chest width (long side) + LIDPX = (PPX * 5) # Lid height + LIDLOW = (PPX * 10) # Lower lid section height + LOCKW = (PPX * 6) # Lock width + LOCKH = (PPX * 5) # Lock height + + cdir = c[1] + front = cdir + "/" + c[2] + top = cdir + "/" + c[3] + side = cdir + "/" + c[4] + # Top + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX2)+"x"+str(CHPX)+"+"+str(CHPX)+"+0 \) -geometry +0+0 -composite -extent "+str(CHPX2)+"x"+str(CHPX)+" "+top) + # Front + # TODO: Add lock + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX2)+"x"+str(LIDPX)+"+"+str(CHPX)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ +\( -clone 0 -crop "+str(CHPX2)+"x"+str(LIDLOW)+"+"+str(CHPX)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX-PPX)+" -composite \ +-extent "+str(CHPX2)+"x"+str(CHPX)+" "+front) + # Side + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDPX)+"+"+str(0)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDLOW)+"+"+str(0)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX-PPX)+" -composite \ +-extent "+str(CHPX)+"x"+str(CHPX)+" "+side) + + + # Generate railway crossings and t-junctions. Note: They may look strange. + # Note: these may be only a temporary solution, as crossings and t-junctions do not occour in MC. + # TODO: Curves + rails = [ + # (Straigt src, curved src, t-junction dest, crossing dest) + ("rail_normal.png", "rail_normal_turned.png", "default_rail_t_junction.png", "default_rail_crossing.png"), + ("rail_golden.png", "rail_normal_turned.png", "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"), + ("rail_golden_powered.png", "rail_normal_turned.png", "mcl_minecarts_rail_golden_t_junction_powered.png", "mcl_minecarts_rail_golden_crossing_powered.png"), + ("rail_detector.png", "rail_normal_turned.png", "mcl_minecarts_rail_detector_t_junction.png", "mcl_minecarts_rail_detector_crossing.png"), + ("rail_detector_powered.png", "rail_normal_turned.png", "mcl_minecarts_rail_detector_t_junction_powered.png", "mcl_minecarts_rail_detector_crossing_powered.png"), + ("rail_activator.png", "rail_normal_turned.png", "mcl_minecarts_rail_activator_t_junction.png", "mcl_minecarts_rail_activator_crossing.png"), + ("rail_activator_powered.png", "rail_normal_turned.png", "mcl_minecarts_rail_activator_d_t_junction.png", "mcl_minecarts_rail_activator_powered_crossing.png"), + ] + for r in rails: + os.system("composite -compose Dst_Over "+tex_dir+"/blocks/"+r[0]+" "+tex_dir+"/blocks/"+r[1]+" "+target_dir("/mods/ENTITIES/mcl_minecarts/textures")+"/"+r[2]) + os.system("convert "+tex_dir+"/blocks/"+r[0]+" -rotate 90 "+tempfile1.name) + os.system("composite -compose Dst_Over "+tempfile1.name+" "+tex_dir+"/blocks/"+r[0]+" "+target_dir("/mods/ENTITIES/mcl_minecarts/textures")+"/"+r[3]) + + # Convert banner overlays + overlays = [ + "base", + "border", + "bricks", + "circle", + "creeper", + "cross", + "curly_border", + "diagonal_left", + "diagonal_right", + "diagonal_up_left", + "diagonal_up_right", + "flower", + "gradient", + "gradient_up", + "half_horizontal_bottom", + "half_horizontal", + "half_vertical", + "half_vertical_right", + "rhombus", + "mojang", + "skull", + "small_stripes", + "straight_cross", + "stripe_bottom", + "stripe_center", + "stripe_downleft", + "stripe_downright", + "stripe_left", + "stripe_middle", + "stripe_right", + "stripe_top", + "square_bottom_left", + "square_bottom_right", + "square_top_left", + "square_top_right", + "triangle_bottom", + "triangles_bottom", + "triangle_top", + "triangles_top", + ] + for o in overlays: + orig = tex_dir + "/entity/banner/" + o + ".png" + if os.path.isfile(orig): + if o == "mojang": + o = "thing" + dest = target_dir("/mods/ITEMS/mcl_banners/textures")+"/"+"mcl_banners_"+o+".png" + os.system("convert "+orig+" -transparent-color white -background black -alpha remove -alpha copy -channel RGB -white-threshold 0 "+dest) # Convert grass grass_file = tex_dir + "/blocks/grass_top.png" @@ -131,52 +352,59 @@ def convert_textures(): FOLIAG = tex_dir+"/colormap/foliage.png" GRASS = tex_dir+"/colormap/grass.png" - os.system("convert "+GRASS+" -crop 1x1+70+120 -depth 8 -resize "+str(PXSIZE)+"x"+str(PXSIZE)+" "+tempfile1.name) - os.system("composite -compose Multiply "+tempfile1.name+" "+tex_dir+"/blocks/grass_top.png "+target_dir("/mods/ITEMS/mcl_core/textures")+"/default_grass.png") - - - convert_alphatex(GRASS, tex_dir+"/blocks/grass_side_overlay.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_grass_side.png") - # Leaves - convert_alphatex(FOLIAG, tex_dir+"/blocks/leaves_oak.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_leaves.png") - convert_alphatex(FOLIAG, tex_dir+"/blocks/leaves_big_oak.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_leaves_big_oak.png") - convert_alphatex(FOLIAG, tex_dir+"/blocks/leaves_acacia.png", "16+240", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_acacia_leaves.png") - convert_alphatex(FOLIAG, tex_dir+"/blocks/leaves_spruce.png", "226+240", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_leaves_spruce.png") - convert_alphatex(FOLIAG, tex_dir+"/blocks/leaves_birch.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_leaves_birch.png") - convert_alphatex(FOLIAG, tex_dir+"/blocks/leaves_jungle.png", "16+32", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_jungleleaves.png") + colorize_alpha(FOLIAG, tex_dir+"/blocks/leaves_oak.png", "116+143", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_leaves.png") + colorize_alpha(FOLIAG, tex_dir+"/blocks/leaves_big_oak.png", "158+177", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_leaves_big_oak.png") + colorize_alpha(FOLIAG, tex_dir+"/blocks/leaves_acacia.png", "40+255", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_acacia_leaves.png") + colorize_alpha(FOLIAG, tex_dir+"/blocks/leaves_spruce.png", "226+230", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_leaves_spruce.png") + colorize_alpha(FOLIAG, tex_dir+"/blocks/leaves_birch.png", "141+186", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_leaves_birch.png") + colorize_alpha(FOLIAG, tex_dir+"/blocks/leaves_jungle.png", "16+39", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_jungleleaves.png") # Waterlily - convert_alphatex(FOLIAG, tex_dir+"/blocks/waterlily.png", "16+32", str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/flowers_waterlily.png") + colorize_alpha(FOLIAG, tex_dir+"/blocks/waterlily.png", "16+39", str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/flowers_waterlily.png") # Vines - convert_alphatex(FOLIAG, tex_dir+"/blocks/vine.png", "16+32", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_vine.png") + colorize_alpha(FOLIAG, tex_dir+"/blocks/vine.png", "16+39", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_vine.png") - # Tall grass, fern - convert_alphatex(GRASS, tex_dir+"/blocks/tallgrass.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_tallgrass.png") - convert_alphatex(GRASS, tex_dir+"/blocks/fern.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_fern.png") - convert_alphatex(GRASS, tex_dir+"/blocks/double_plant_fern_bottom.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_fern_bottom.png") - convert_alphatex(GRASS, tex_dir+"/blocks/double_plant_fern_top.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_fern_top.png") - convert_alphatex(GRASS, tex_dir+"/blocks/double_plant_grass_bottom.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_grass_bottom.png") - convert_alphatex(GRASS, tex_dir+"/blocks/double_plant_grass_top.png", "70+120", str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_grass_top.png") + # Tall grass, fern (inventory images) + pcol = "49+172" # Plains grass color + colorize_alpha(GRASS, tex_dir+"/blocks/tallgrass.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_tallgrass_inv.png") + colorize_alpha(GRASS, tex_dir+"/blocks/fern.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_fern_inv.png") + colorize_alpha(GRASS, tex_dir+"/blocks/double_plant_fern_top.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_fern_inv.png") + colorize_alpha(GRASS, tex_dir+"/blocks/double_plant_grass_top.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_grass_inv.png") -# TODO: Convert banner masks -# if os.path.isdir(tex_dir + "/entity/banner"): -# These are the ImageMagick commands needed to convert the mask images -# os.system("mogrify -transparent-color "+filename) -# os.system("mogrify -clip-mask "+tex_dir+"/entity/banner/base.png"+" -alpha Copy "+filename) -# os.system("mogrify -fill white -colorize 100 "+filename) + # TODO: Convert grass palette + + offset = [ + [ pcol, "", "grass" ], # Default grass: Plains + ] + for o in offset: + colorize(GRASS, tex_dir+"/blocks/grass_top.png", o[0], str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_"+o[2]+".png") + colorize_alpha(GRASS, tex_dir+"/blocks/grass_side_overlay.png", o[0], str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_"+o[2]+"_side.png") + + # Metadata + if make_texture_pack: + # Create description file + description = "Texture pack for MineClone 2. Automatically converted from a Minecraft resource pack by the MineClone 2 Texture Converter. Size: "+str(PXSIZE)+"×"+str(PXSIZE) + description_file = open(target_dir("/") + "/description.txt", "w") + description_file.write(description) + description_file.close() + + # Create preview image (screenshot.png) + os.system("convert -size 300x200 canvas:transparent "+target_dir("/") + "/screenshot.png") + os.system("composite "+base_dir+"/pack.png "+target_dir("/") + "/screenshot.png -gravity center "+target_dir("/") + "/screenshot.png") print("Textures conversion COMPLETE!") if failed_conversions > 0: print("WARNING: Number of missing files in original resource pack: "+str(failed_conversions)) print("NOTE: Please keep in mind this script does not reliably convert all the textures yet.") if make_texture_pack: - print("You can now retrieve the texture pack in "+working_dir+"/texture_pack/") + print("You can now retrieve the texture pack in "+output_dir+"/"+output_dir_name+"/") # ENTRY POINT -if make_texture_pack and not os.path.isdir("./texture_pack"): - os.mkdir("texture_pack") +if make_texture_pack and not os.path.isdir(output_dir+"/"+output_dir_name): + os.mkdir(output_dir+"/"+output_dir_name) tempfile1 = tempfile.NamedTemporaryFile() tempfile2 = tempfile.NamedTemporaryFile()